堆(Heap)

2 篇文章 0 订阅
什么是堆?

堆(heap),一个JVM只能由一个堆内存,堆内存是可以调节的。

类加载器读取类文件后,会把什么存放到堆中? 实例,方法区/元空间。

堆又分为新时代和老年代以及元空间。

JVM调优大部分都是在调堆。

在这里插入图片描述

1、新生代

分为伊甸园、幸存区0与幸存区1。

伊甸园

垃圾回收主要区域,当对象没有被引用后会被轻GC回收。

幸存区0与幸存区1

在伊甸园没有被轻GC回收的,幸存下来的对象会存放在幸存区0与幸存区1

幸存区0与幸存区1 是动态的,它两会互换位置,比如1变成0,0变成1.

2、老年代

伊甸园幸存区0与幸存区1 都满了,就会到老年代,老年代是重GC 回收机制。

如果老年代新生代都满了就会报内存溢出:OutOfMemoryError

修改堆内存与输出堆信息

1、设置JVM的初始内存和最大内存

在这里插入图片描述

        //-Xms1024m -Xmx1024m -XX:+PrintGCDetails 
        //初始内存    最大内存      输出GC回收信息
		//-XX:+HeapDumpOnOutOfMemoryError 出现OOM异常则Dump

可以使用Runtime类查看当前的JVM内存信息

public class Main {
    public static void main(Test[] args) throws ClassNotFoundException {
        //jvm 试图使用的最大内存
        long maxMemory = Runtime.getRuntime().maxMemory();
        //jvm 使用的初始总内存
        long totalMemory = Runtime.getRuntime().totalMemory();
        System.out.println(maxMemory+"字节"+maxMemory/(double)1024/1024);
        System.out.println(totalMemory+"字节"+totalMemory/(double)1024/1024);
    }
}

项目出现了OOM怎么排除?

  • 能够看到代码第几行出错:内存快照分析工具,MAT,Jprofiler
  • Debug,一行行代码分析

MAT,Jprofiler作用?

  • 分析Dump内存文件,快速定位内存泄漏
  • 获得堆中的数据
  • 获得大的对象

怎么使用?

安装IDEAJprofiler 插件,安装Jprofiler软件

之后修改JVM参数

-Xms1m -Xmx1m -XX:+HeapDumpOnOutOfMemoryError

出现OOM异常在项目目录会创建一个.hprof后缀的文件。

在这里插入图片描述

然后打开这个文件,可以看到出现问题的位置。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值