本人最近阅读《深入理解Java虚拟机_JVM高级特性与最佳实践》第2版 将一些核心内容进行总结,欢迎讨论!
1、jvm软件层面屏蔽了底层硬件、指令层面细节。执行class字节码文件
2、jvm运行时数据区
方法区: 存储的是虚拟机加载的类信息、静态变量等数据。
堆: 对于堆,Java程序员都知道对象实例以及数组内存都要在堆上分配。堆不再被线程所独有而是共享的一块区域,它的确是用来存放对象实例,也是垃圾回收GC的主要区域。实际上它还能细分为:新生代(Young Generation)、老年代(Old Generation)。对于新生代又分为Eden空间、From Survivor空间、To Survivor空间。
程序计数器 指向当前线程正在执行的字节码指令的地址
虚拟机栈:
与程序计数器一样,Java虚拟机栈也是线程私有的,虚拟机栈描述的是Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈桢用于存储局部变量表,操作数栈,动态链接,方法出口等信息
本地方法栈:
本地方法栈和虚拟机栈相似,区别就是虚拟机为虚拟机栈执行Java服务(字节码服务),而本地方法栈为虚拟机使用到的Native方法服务。本地方法栈中使用的语言,使用方式,数据结构没有强制要求。
3、垃圾回收:
判断对象是否存活:
在主流商用程序语言(java、C#)的主流实现中,都是称通过可达性分析(Reachabiliry An)来判定对象是否存活。这个算法的基本思路就是通过一系列称为"GC Roots"的对象 作为起始点,从这些起始点像下搜索,搜索所走过的路径称为引用链,当一个对象到"GC Roots"没有任何引用链相连时,则证明该对象是不可用的。
在java语言中可作为"GC Roots"的对象包含以下几种:
a、虚拟机栈(栈帧中的本地变量表)中引用的对象
b、方法区中类静态属性引用的对象
c、方法区中常量引用的对象
d、本地方法栈JNI(即一般说的Native方法)引用的变量