zoukankan      html  css  js  c++  java
  • 堆中对象分配过程

    一般情况

    • new的对象先放伊甸园区,此区有大小限制
    • 当伊甸园的空间填满时,程序又需要创建对象,出发GC(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区
    • 然后将伊甸园中的剩余对象移动到幸存者0区
    • 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区
    • 如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区
    • 啥时候能去养老区呢?可以设置次数。默认是15次。·可以设置参数:-XX:MaxTenuringThreshold=进行设置
    • 当老年区内存不足时,再次触发GC:Major GC,进行养老区的内存清理
    • 若养老区执行了Major GC之后发现依然无法进行对象的保存,就会产生OOM异常

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

    特殊情况

      当新建对象需要的内存过大,超过eden的剩余内存时,会看老年代的剩余内存是否装的下,如果装的下会放到老年代,如果放不下,会报OOM

    代码

    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();
                }
            }
        }
    }

     常用调优工具

    • JDK命令行
    • Eclipse:Memory Analyzer Tool
    • Jconsole
    • VisualVM
    • Jprofiler
    • Java Flight Recorder
    • GCViewer
    • GC Easy

    附:JVM学习目录

  • 相关阅读:
    【Lintcode】112.Remove Duplicates from Sorted List
    【Lintcode】087.Remove Node in Binary Search Tree
    【Lintcode】011.Search Range in Binary Search Tree
    【Lintcode】095.Validate Binary Search Tree
    【Lintcode】069.Binary Tree Level Order Traversal
    【Lintcode】088.Lowest Common Ancestor
    【Lintcode】094.Binary Tree Maximum Path Sum
    【算法总结】二叉树
    库(静态库和动态库)
    从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/ding-dang/p/13073542.html
Copyright © 2011-2022 走看看