Floating Cat

谈JVM类加载机制
类加载机制 虚拟机将class文件加载到内存,并对数据校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。在java中语言中类的加载、连接和初始化过程都是在程序运行期间完成的,因此在类加载时的效率相对编译型语言较低,除此之外,只有在任何一个类只有在运行期间使用到该类的时候才会将该类加到内存中。总之,java依赖于运行期间动态加载和动态链接来实现类的动态使用。其整个流程如下: 其中加载、检验、准备、初始化和卸载这个五个阶段的顺序是固定的,而解析则未必。为了支持动态绑定,解析这个过程可以发生在初始化阶段之后。另外,这个过程表示的是按顺序开始,不是所谓的第一步、第二步...
谈JVM内存区域
JVM内存区域首先,先大体的了解一下JAVA虚拟机运行时的内存结构: 从线程的角度来看,总体分为私有和共享的两部分。共享的数据区为方法区,堆,本地库接口,以及每个JVM虚拟机中的JVM执行引擎,而线程私有的数据区则为虚拟机栈,本地方法栈,程序计数器。 线程共享数据区堆在Java中我们最熟悉的就是对象,在内存中用来存放内存对象实例的区域称之为堆(Heap),此区域由线程内存共享,在进行垃圾回收时,此区域是垃圾回收器重点关注的地方,因此我们也称之“GC堆”。早起的Java虚拟机严格按照JVM虚拟规范来涉及:任何的对象实例及数组都要在堆上分配,但随着JIT编译器的发展,许多新生的优化技术(比...
谈JVM字节码执行引擎
就目前而言,所有的执行引擎的基本一致: 输入:字节码文件 处理:字节码解析 输出:执行结果。 物理机的执行引擎是由硬件实现的,和物理机的执行过程不同的是虚拟机的执行引擎由于自己实现的。 运行时候的栈结构每一个线程都有一个栈,也就是前文中提到的虚拟机栈,栈中的基本元素我们称之为栈帧。栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。每个栈帧都包括了一下几部分:局部变量表、操作数栈、动态连接、方法的返回地址 和一些额外的附加信息。 栈帧中需要多大的局部变量表和多深的操作数栈在编译代码的过程中已经完全确定,并写入到方法表的Code属性中。在活动的线程中,位于当前栈顶的栈帧才是有效的,称...
谈JVM关闭与关闭钩子
JVM关闭通常而言,对于JVM的关闭我们很少去关注,但是了解JVM的关闭能帮我们在JVM关闭时做一些合理的事情。首先JVM的关闭方式可以分为三种: 正常关闭:当最后一个非守护线程结束或者调用了System.exit或者通过其他特定平台的方法关闭(发送SIGINT,SIGTERM信号等) 强制关闭:通过调用Runtime.halt方法或者是在操作系统中直接kill(发送SIGKILL信号)掉JVM进程 异常关闭:运行中遇到RuntimeException异常等。 在某些情况下,我们需要在JVM关闭时做些扫尾的工作,比如删除临时文件、停止日志服务以及内存数据写到磁盘等,为此JVM提供了关...
Java异常体系
异常体系异常是指由于各种不期而至的情况,导致程序中断运行的一种指令流,如:文件找不到,非法参数,网络超时等.为了保证正序正常运行,在设计程序时必须考虑到各种异常情况,并正确的对异常进行处理.异常也是一种对象,java当中定义了许多异常类,并且定义了java.lang.Throwable作为所有异常类的基类. Java语言设计者将异常划分为两类:Error和Exception,其体系结构大致如下图所示: Throwable有两个重要的子类:Exception和Error.Error是程序中无法处理的错误,表示运行应用程序中出现了严重的错误.此类错误一般表示代码运行时JVM出现问题.通常有...