JVM运行时数据 堆

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.exeJVM运行时数据 堆_第1张图片

  • 《Java虚拟机规范》中对Java堆的描述是:所有的对象实例以及数组都应当运行时分配在堆上。(The heap is the run-time data area from which memory for all class instance and arrays is allocated)
    “几乎”所有的对象实例都在这里分配内存–从实际使用角度看
  • 数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这个引用指向对象或者数组在堆中的位置
  • 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除
  • 堆,是GC(Garbage Collection,垃圾收集器)执行垃圾回收的重点区域

JVM运行时数据 堆_第2张图片

jdk7之前与jdk8的区别
JVM运行时数据 堆_第3张图片
打印GC垃圾回收:-XX:+PrintGCDetails
JVM运行时数据 堆_第4张图片

堆参数设置

JVM运行时数据 堆_第5张图片

查看设置的大小:
jstat -gc pid
或者设置参数 -XX:+PrintGCDetails

堆分类

JVM运行时数据 堆_第6张图片
JVM运行时数据 堆_第7张图片
JVM运行时数据 堆_第8张图片

指定新生代和老年代占比:-XX:NewRatio=value
指定新生代中s0,s1,Eden占比:默认是8:1:1
指定新生代最大内存 :-Xmn

运行流程

JVM运行时数据 堆_第9张图片

Eden园区满了,触发全局YGC(Eden,S0,S1),S0,S1满了不会触发GC

JVM运行时数据 堆_第10张图片

Minor GC、Major GC与Full GC

JVM运行时数据 堆_第11张图片
JVM运行时数据 堆_第12张图片
JVM运行时数据 堆_第13张图片

JVM运行时数据 堆_第14张图片

分代思想

JVM运行时数据 堆_第15张图片
JVM运行时数据 堆_第16张图片

内存分配策略

JVM运行时数据 堆_第17张图片
JVM运行时数据 堆_第18张图片

TLAB

JVM运行时数据 堆_第19张图片
JVM运行时数据 堆_第20张图片
JVM运行时数据 堆_第21张图片

堆空间参数设置

JVM运行时数据 堆_第22张图片

你可能感兴趣的:(java,大数据,jvm,java,算法)