JVM(一)
推荐一本好书,《深入理解Java虚拟机》——周志明。
近来,学习JVM,看了这本书,觉得讲解很系统,对Java许多底层的东西讲述的很透彻。在此,做一个读书笔记,帮助自己理解和日后的回忆。
参考资料:
《深入理解Java虚拟机》——周志明
https://www.cnblogs.com/f-zhao/p/6159709.html?utm_source=itdadao&utm_medium=referral
一Java内存区域
1.运行时数据区域
Java虚拟机所管理的内存分为如下几个部分:
・方法区(所有线程共享的数据区)
它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
・堆(所有线程共享的数据区)
它是Java虚拟机所管理的内存中最大的一块内存区域。它唯一的目的就是存放对象实例,几乎所有对象的实例和数组都在这里分配内存。
Java堆是垃圾收集器管理的主要区域,因此也被称为GC堆。从内存回收的角度来看,现在收集器基本采用分代回收算法。所以Java堆中还可以细分为新生代和老年代,再细致一点有Eden空间、From Survivor空间、To Survivor空间等,默认的比例是8:1:1.
・虚拟机栈,本地方法栈(线程隔离的数据区,在HotSpot虚拟机中,这两个部分是被整合成一个部分)
虚拟机栈:它里面存贮着局部变量表,局部变量表存放了编译期可知的各种基本数据类型、对象引用和指向一条字节码指令的地址。
本地方法栈:它为虚拟机使用到的Native方法服务。
・程序计数器(线程隔离的数据区)
它可以看做是当前线程所执行的字节码的行号指示器。
二虚拟机启动参数设置
1.首先看如何获取配置信息
cmd java
在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。
因为我环境目前,被我搞的乱码了,所以无法上图说明了。
大家自己尝试吧:java -X
java -Xms<size>
java -Xmx<size>
这是两个常用的设置对堆内存大小的参数。一般设置成一样大,可以避免程序自动扩展内存大小。
2.跟踪垃圾回收
-XX:+PrintGC 只要遇到GC就会打印日志
-XX:+PrintGCDetails 打印更多详细信息
-XX:+PrintHeapAtGC 每次GC前后分别打印堆信息
三垃圾收集
1.对象已死吗?
通过可达性分析来判断对象是否存活。这个算法的基本思想是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象是不可用的。
在java中,可作为GC Roots的对象包括下面几种:
■虚拟机栈中引用的对象
■方法区中类静态属性引用的对象
■方法区中常量引用的对象
■本地方法栈中JNI引用的对象
2.垃圾收集算法
垃圾收集采用的是分代收集算法,它是根据对象存活周期的不同将内存划分为几块。一般Java堆分为新生代和老年代。新生代中,每次都有大量对象死去,少量存活,所以用的是复制算法,Eden空间和两块较小的Survivor空间比例,默认的是8:1:1,也就是每次新生代中可用内存为整个新生代的百分之九十。至于老年代,因为对象存活率较高、没有额外空间对它进行分配担保,就必须使用标记——清理 或者 标记——整理 算法来进行回收。
书中知识很丰富,每看一遍都很有收获,继续努力中,加油!