JVM (Java virtual machine) 是一个虚构出来的计算机
JVM虚拟出一套硬件架构,如处理器、堆、栈等和对应的指令系统
Java语言最重要的特点就是跨平台运行,使用JVM就是为了支持与操作系统无关,实现跨平台。
JVM指令又称为字节码指令
由一个byte的操作码(opcode)跟上0个到多个操作数构成。
除去保留指令 54条,JVM的有效指令一共 202条,可以分为 10个大类
每个线程拥有独立的PC寄存器
在线程创建时创建
指向下一条指令的地址
执行本地方法时,PC的值为undefined
保存装载的类信息
类型、常量、静态变量、JIT编译后的代码缓存等
Hotpot中,在java7之前方法区也叫永久代 Perm
Java6 类型的常量池还在方法区,Java7之后转移到堆中
和程序开发密切相关
“几乎”所有的对象实例都在堆中
所有线程共享Java堆
在HotSpot中,堆是分代的
是GC的主要工作区间
新生代 Young Generation:又分为 Eden 、Survior(From 、To)
老年代 Old Generation
在Java9之后的默认GC G1中,仍然沿用了年轻代和老年代
线程私有
栈由一系列帧组成
帧保存一个方法的局部变量、操作数栈、动态链接、返回地址
每一次方法调用创建一个帧,并压栈
-XX:+PrintGC java9之后 -Xlog:gc 可以打印GC的简要信息
-XX:+PrintGCDetails java9之后 -Xlog:gc 打印GC详细信息
例
PSYoungGen total 2560K, used 102K [0x00000007bf980000, 0x00000007bfc80000, 0x00000007c0000000)
eden space 2048K, 5% used [0x00000007bf980000,0x00000007bf9999d8,0x00000007bfb80000)
from space 512K, 0% used [0x00000007bfc00000,0x00000007bfc00000,0x00000007bfc80000)
to space 512K, 0% used [0x00000007bfb80000,0x00000007bfb80000,0x00000007bfc00000)
ParOldGen total 8704K, used 4502K [0x00000007bec00000, 0x00000007bf480000, 0x00000007bf980000)
object space 8704K, 51% used [0x00000007bec00000,0x00000007bf065880,0x00000007bf480000)
Metaspace used 3102K, capacity 4500K, committed 4864K, reserved 1056768K
class space used 338K, capacity 388K, committed 512K, reserved 1048576K
-XX:+TraceClassLoading (java9 -Xlog:class+load=info ) 监控类的加载
-Xmx –Xms 指定最大堆和最小堆
-Xmn 设置新生代大小
-XX:NewRatio 新生代(eden+2*survivor)和老年代的比值
4: 表示 新生代:老年代=1:4
-XX:SurvivorRatio 设置Survivor区和Eden区的比例
8:表示 Eden:Survivor= 8:1,由于有两个survivor区,即Eden占到新生代的80%,
一个Survivor占年轻代的1/10
-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
8:表示 ** Eden:Survivor**= 8:1,由于有两个survivor区,即Eden占到新生代的80%,
一个Survivor占年轻代的1/10
-XX:+HeapDumpOnOutOfMemoryError OOM时导出堆到文件
-XX:+HeapDumpPath 导出OOM的路径