JVM虚拟机
java跨平台
- Math.java 通过javac 编译成jvm虚拟机可识别的Math.class文件
- 通过不同系统下载的jdk包,执行同一份Math.class,实现java跨平台。即跨平台是由jdk中的jvm将同一份Math.class转换成相应系统可识别的指令。
jvm组成
- 堆【共享内存】:存放对象实例。
- 栈【先进后出FILO】【线程独享内存】:线程执行时,方法需要的内存区域。
- 方法区【共享内存】:存储类、接口、方法、常量池和静态变量等信息。
- 栈、方法区静态变量中的对象变量(指针)指向堆中的对象实例。
- 程序计算器:记录当前线程预执行的下一条指令地址(线程切换时,需要恢复执行程序)。
jvm执行
- 由类装载子系统将Math.class加载到内存;
- 字节码执行引擎控制类执行执行,并记录线程执行位置到程序计数器。
GC 理解回收
##### 概念
- 新生代:Eden + Survivor0 + Survivor1(内存比例:8:1:1)
- Eden(伊甸园): 对象的首选内存分配区域。
- S0(幸存区0)-S1(幸存区1):
- Minor GC(young GC):当Eden内存不足时,由字节码执行引擎启动"垃圾回收线程",对新生代(包括Eden空间和Survivor空间)进行垃圾回收的操作。
- 可达性分析算法:从GC Roots(例如线程栈、静态变量等)出发,遍历整个对象图,并标记可达对象(非垃圾对象),最终未被标记的对象即为不可达对象(垃圾对象)。
- 分代年龄: Minor GC中,所有存活的对象会被向一个Survivor空间移动,同时它们的年龄属性会+1。当Survivor空间也不能容纳新对象或者对象的年龄已经达到一定阈值时(一般最大分代年龄为15),这些对象将会被晋升到老年代中。
jvm调优
- 目的:减少STW(stop the world),GC时会停止用户线程,特别Full GC停止用户线程时长特别长。
- GC 为什么STW:若GC线程和用户线程同时运行,GC无法通过"可达性分析算法"标记对象是否是垃圾。