类加载子系统
负责从文件系统或网络中加载Class信息。
方法区
存放类加载子系统加载的Class信息及运行时常量池信息,包括字符串的字面量和数字常量
Java堆
在虚拟机启动时建立,是Java程序最主要的内存工作区域,几乎所有的Java对象实例都放于Java堆中。堆空间是线程共享的。
直接内存
直接内存是在Java堆外直接向系统申请的内存空间,通常,访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。直接内存在Java堆外,因此它的大小不会直接首先与Xmx
指定的最大堆大小。
垃圾回收系统
垃圾回收器可以堆方法区、Java堆和直接内存进行回收。
Java栈
每个一Java虚拟机线程都有一个私有的Java栈,一个线程的Java栈在线程创建的时候被创建,Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。
本地方法栈
与Java栈类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用。作为Java虚拟机的重要扩展,Java虚拟机允许Java直接调用本地的方法(通常使用C编写)
PC寄存器
寄存器也是每个线程私有的空间,Java虚拟机会为每一个Java线程创建PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会只想当前正在被执行的指令,如果当前方法是本地方法,那么PC寄存器的值就是undefined
执行引擎
负责执行虚拟机的字节码。
常见Java虚拟机参数
要诊断虚拟机,我们就要学习如何对Java虚拟机进行最基本的配置和跟踪。
跟踪垃圾回收
可以通过-XX:+PrintGC
参数启动Java虚拟机,只要遇到GC,就会打印日志。
System.out.println("##########准备申请1m内存#########");
byte[] bytes = new byte[1 * 1024 * 1024];
System.gc();
GC
和Full GC
是垃圾回收的停顿类型,而不是区分是新生代还是年老代,如果有Full
说明发生了Stop-The-World
。如果是调用 System.gc()
触发的,那么将显示的是Full GC (System)
4878K->1576K(249344K)
表示GC 前该区域已使用容量 -> GC 后该区域已使用容量 (该区域内存总容量)
0.0013118 secs
表示GC所用时间,单位为秒。
可以通过-XX:+PrintGCDetails
参数来输出更加详细的参数。PSYoungGen
:代表新生代。total 75776K, used 1951K
代表新生代大小及已使用大小。[0x000000076b800000, 0x0000000770c80000, 0x00000007c0000000)
代表新生代的下界、当前上界和上届。eden
、from
、to
代表新生代的三个区,当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳
( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数-XX:MaxTenuringThreshold
来设定 ),这些对象就会成为老年代。ParOldGen
代表老年代
评论 (0)