12、JVM实战:图解对象分配过程

一、图解对象分配过程

为新对象分配内存是一件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配等问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑Gc执行完内存回收后是否会在内存空间中产生内存碎片。

1、 new的对象先放伊甸园区此区有大小限制;
2、 当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁再加载新的对象放到伊甸园区;
3、 然后将伊甸园中的剩余对象移动到幸存者0区;
4、 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会;
5、 如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区;
6、 啥时候能去养老区呢?可以设置次数默认是15次可以设置参数:-XX:MaxTenuringThreshold=进行设置;

第一次伊甸园区装满时。

*

第二次伊甸园区装满时。

*

当幸存者S0区、S1区出现了长时间使用的对象时,经过一定次数(默认15)将对象移入养老区。

*

总结:

  • 针对幸存者se,s1区的总结:复制之后有交换,谁空谁是to.
  • 关于垃圾回收:频繁在新生区收集,很少在养老区收集,几乎不在永久区/元空间收集。

对象分配的特殊情况:

*

代码演示对象分配的过程

package org.ywz.springbootdemo;

import java.util.ArrayList;
import java.util.Random;

/**
 * 启动设置堆参数: -Xms600m -Xmx600m
 */
public class HeapInstanceTest {
    byte[] buffer = new byte[new Random().nextInt(1024 * 200)];

    public static void main(String[] args) throws InterruptedException {
        ArrayList<HeapInstanceTest> arrayList = new ArrayList<>();
        while (true) {
            arrayList.add(new HeapInstanceTest());
            Thread.sleep(10);
        }
    }
}

添加运行时参数:

*

启动观察对象存储情况:

*

*

二、常用的调优工具

  • JDK命令行
  • Eclipse: Memory Analyzer Tool
  • Jconsole
  • visualVM
  • Jprofiler
  • Java Flight Recorder
  • ccviewer
  • Gc Easy

下载地址:Java Profiler - JProfiler,下载完安装即可。

*

在idea中安装插件

*

这样就可以在idea中直接启动了。

*

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: