(二)堆内存

一、概念

Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。这个区域是用来存放对象实例的,几乎所有对象实例都会在这里分配内存。堆是Java垃圾收集器管理的主要区域(GC堆),垃圾收集器实现了对象的自动销毁。Java堆可以细分为:新生代和老年代;再细致一点的有Eden空间,From Survivor空间,To Survivor空间等。Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可,就像我们的磁盘空间一样。可以通过-Xmx和-Xms控制

堆内存模型如下:

 

  •  Eden Space字面意思是伊甸园,对象被创建的时候首先放到这个区域,进行垃圾回收后,不能被回收的对象被放入到空的survivor区域。
  • Survivor Space幸存者区,用于保存在eden space内存区域中经过垃圾回收后没有被回收的对象。Survivor有两个,分别为To Survivor、 From Survivor,这个两个区域的空间大小是一样的。执行垃圾回收的时候Eden区域不能被回收的对象被放入到空的survivor(也就是To Survivor,同时Eden区域的内存会在垃圾回收的过程中全部释放),另一个survivor(即From Survivor)里不能被回收的对象也会被放入这个survivor(即To Survivor),然后To Survivor 和 From Survivor的标记会互换,始终保证一个survivor是空的。
  • Eden Space和Survivor Space都属于新生代,新生代中执行的垃圾回收被称之为Minor GC(因为是对新生代进行垃圾回收,所以又被称为Young GC),每一次Young GC后留下来的对象age加1。
  • Old Gen老年代,用于存放新生代中经过多次垃圾回收仍然存活的对象,也有可能是新生代分配不了内存的大对象会直接进入老年代。经过多次垃圾回收都没有被回收的对象,这些对象的年代已经足够old了,就会放入到老年代。

    当老年代被放满的之后,虚拟机会进行垃圾回收,称之为Major GC。由于Major GC除并发GC外均需对整个堆进行扫描和回收,因此又称为Full GC。

    heap区即堆内存,整个堆大小=年轻代大小 + 老年代大小。堆内存默认为物理内存的1/64(<1GB);默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制,可以通过MinHeapFreeRatio参数进行调整;默认空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制,可以通过MaxHeapFreeRatio参数进行调整。

 

 二、使用jdk自带工具分析堆内存

  •  打开jdk自带Java 性能分析器

 

  •  编写程序

package jvm;

import java.util.ArrayList;
import java.util.List;

public class TestJConsole {
    
    private byte[] b=new byte[128*1024];
    
    public static void main(String[] args) {
        try {
      //我们打开jdk的性能分析器需要一定的时间,所以需要休眠5s。 Thread.sleep(
5000); } catch (InterruptedException e) { e.printStackTrace(); } fill(1000); } private static void fill(int n) { List<TestJConsole> consoles = new ArrayList<>(); for (int i = 0; i < n; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } consoles.add(new TestJConsole()); } } }
  • 运行程序后,连接java性能分析器,查看堆内存使用图表,如下图,图中曲线的拐点为程序已经运行完毕内存释放。在程序运行完毕之前,堆空间图表一直呈现上升趋势。

  • 查看eden space图表,如下图,当eden space满了的时候,就会启动垃圾回收。

 

 

  •  下图是survivor space

 

posted @ 2017-12-29 12:57  shyroke、  阅读(430)  评论(0编辑  收藏  举报
作者:shyroke 博客地址:http://www.cnblogs.com/shyroke/ 转载注明来源~