zoukankan      html  css  js  c++  java
  • (二)堆内存

    一、概念

    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

  • 相关阅读:
    TypeError: Iterator operand 0 dtype could not be cast from dtype('<M8[us]') to dtype('<M8[D]') according to the rule 'safe'
    Linux中matplotlib 中文显示问题解决
    自己动手实现爬虫scrapy框架思路汇总
    机器学习算法之多项式回归
    scrapy爬虫--苏宁图书
    Mongodb数据库基本操作
    day04 Python
    day03 Python爬虫
    day02 Python完结
    day01 python基础
  • 原文地址:https://www.cnblogs.com/shyroke/p/8143924.html
Copyright © 2011-2022 走看看