111 阅读2分钟

堆的核心概述

  1. 一个JVM实例只存在一个堆内存,堆也时java内存管理的核心区域。
  2. Java堆区在JVM启动的时候即被创建,其空间大小也就是确定了,时JVM管理的最大一块内存空间
  3. 所有的线程共享java堆,在这里还可以划分线程私有的缓存区
  4. 所有的对象实例以及数组都应当在运行时分配在堆上。
  5. 数组和对象可能永远不会存储在栈上,因为栈帧中保持引用,这个引用指向对象或数组在堆中的位置
  6. 在方法结束后,堆中的对象不会马上被移除,仅仅在垃圾收集的时候才会被移除。
  7. 堆是GC执行垃圾回收的重点区域

参数指令

-NewRatio:设置新生代和老年代的比例,默认是2 -XX:SurvivoRatio:设置新生代中Eden区与Survivor区的比例 -XX:-UseAdeptiveSizePoticy:关闭自适应的内存分配策略 几乎所有的对象都是Eden区被new出来的 绝大多数的java对象的销毁都在新生代进行了

对象分配

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

逃逸分析

1、栈上分配 2、同步省略 3、分离对象或标量替换