JVM_05 运行时数据区2-堆_2

1.图解对象分配过程

在这里插入图片描述
特殊情况

在这里插入图片描述

public class HeapInstanceTest {
    byte[] buffer = new byte[new Random().nextInt(1024 * 200)];

    public static void main(String[] args) {
        ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();
        while (true) {
            list.add(new HeapInstanceTest());
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

2.Minor GC、Major GC、Full GC

  • 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为:

    • 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集

    • 老年代收集(Major GC/Old GC):只是老年代的垃圾收集

    • 混合收集(Mixed GC):收集整个新生代以及部分老年代的垃圾收集

  • 整堆收集(Full GC):收集整个java堆和方法区的垃圾收集

在这里插入图片描述

Full GC 是开发或调优中尽量要避免的,这样暂停时间会短一些

在这里插入图片描述

3.TLAB(线程私有缓存区域)

在这里插入图片描述
为什么有TLAB(Thread Local Allocation Buffer)

  • 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据
  • 由于对象实例的创建在JVM中非常频繁,淫才在并发环境下从堆区中划分内存空间是线程不安全的
  • 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度

猜你喜欢

转载自blog.csdn.net/qq_43141726/article/details/114804254