JVM运行时数据 堆
- 快速调试
- 堆参数设置
- 堆分类
- 运行流程
- Minor GC、Major GC与Full GC
- 分代思想
- 内存分配策略
- TLAB
- 堆空间参数设置
快速调试
- 一个JVM实例只存在一个堆内存,对也是Java内存管理的核心区域
- Java 堆区在Jvm启动的时候创建,其空间大小也就确定了。是JVM管理最大的一块内存空间(可调节)
- 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间,但在逻辑上他应该被视为连续的
- 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)
public class Test {
public static void main(String[] args) {
System.out.println("start ...");
try {
TimeUnit.SECONDS.sleep(1000000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("...end");
}
}
调个参数
-Xms10m -Xmx10m
启动
然后启动 jvisualvm.exe
- 《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当运行时分配在堆上。(The heap is the run-time data area from which memory for all class instance and arrays is allocated)
“几乎”所有的对象实例都在这里分配内存–从实际使用角度看 - 数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置
- 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除
- 堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域
jdk7之前与jdk8的区别
打印GC垃圾回收:-XX:+PrintGCDetails
堆参数设置
查看设置的大小:
jstat -gc pid
或者设置参数 -XX:+PrintGCDetails
堆分类
指定新生代和老年代占比:-XX:NewRatio=value
指定新生代中s0,s1,Eden占比:默认是8:1:1
指定新生代最大内存 :-Xmn
运行流程
Eden园区满了,触发全局YGC(Eden,S0,S1),S0,S1满了不会触发GC
Minor GC、Major GC与Full GC
分代思想
内存分配策略
TLAB