java堆简单介绍

不忘初心2021 / 2023-05-09 / 原文

java对象实例是放置堆上,但不是说所有的对象实例都在对上,可能有些对象实例位于本地方法区

 下面说说堆的特点

 堆是属于java虚拟机中内存最大的一部分

堆是jvm中所有线程可以共享的

垃圾收集器管理的主要区域来源于java堆

 java堆可以细分为新生代和老年代

java堆在物理存储上是不连续的,但是逻辑上是连续的,对应的大小通过-Xms和-Xmx调节

堆中的实例对象,并不是方法结束后就直接被回收了,直接回收的话,jvm压力很大的,所以是异步回收

当堆内存不够了,就会抛出OutOfMemoryError异常

下面使用实际代码测试结果

测试代码

package com.java.test;

import java.util.ArrayList;

/**
 * @Description:
 * @Author: qiuxie
 * @Create: 2023/5/7 23:52
 */
public class JvmTest {

    /**
     * jvm堆内存相关
     * -Xmx20M -Xms5M
     * @param args
     */
    public static void main(String[] args) {
        //创建数据分配内存
        //int[] a=new int[3*1024*1024];
        //a[0]=12345;
        System.out.print("Xmx=");
        System.out.println(Runtime.getRuntime().maxMemory() / 1024.0 / 1024 + "M");
        System.out.print("free mem=");
        System.out.println(Runtime.getRuntime().freeMemory() / 1024.0 / 1024 + "M");
        System.out.print("total mem=");
        System.out.println(Runtime.getRuntime().totalMemory() / 1024.0 / 1024 + "M");
    }

}

  

设置的堆内存大小
-Xmx20M -Xms5M

 

 不同的jdk版本中,堆中的包含也是不一样的

在jdk 1.7中

报错部分可忽略

 

 而在jdk 1.8中

只有青年代和老年代了

-XX:+PrintGCDetails

  

 

 jdk 11的堆空间信息

 

 相比较jdk 1.8,少了很多

 以上就是关于java堆的简单介绍