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,也就是每次新生代中可用内存为整个新生代的百分之九十。至于老年代,因为对象存活率较高、没有额外空间对它进行分配担保,就必须使用标记——清理 或者 标记——整理 算法来进行回收。

书中知识很丰富,每看一遍都很有收获,继续努力中,加油!

原文地址:https://www.cnblogs.com/lihao007/p/8149179.html