怎么排查内存溢出的问题

在上一篇文章中我分享了内存溢出的问题,也写了一个死循环 CUP 飙高的案例,今天我们来看看内存溢出该怎么排查。

jvisualvm

下面用 JDK 自带的工具 jvisualvm 来个小伙伴操作一遍,在命令行中搜索 jvisualvm 就会出来了。

在这里插入图片描述

而 jvisualvm 的操作界面是这样的:

在这里插入图片描述

下面我们还是用上一遍文章中的案例:

    public static void main(String[] args) {
	    	 Map map = System.getProperties();
 		    Random r = new Random();
 		    while (true) {
 		      map.put(r.nextInt(), "value");
 		    }
	    }

visual gc 是 visualvm 中的图形化查看 GC 状况的插件。
在这里插入图片描述

按照步骤:

visualvm中找到 ”工具“选择 ”插件“ ,最后点击 ”可用插件“ 找到visual gc,因为我已经安装了找不到。
在这里插入图片描述
之后点击”已安装“ 选择 visual gc 完成激活在这里插入图片描述

在这里插入图片描述

可以看到不释放,堆空间就一直上去,直到OOM(out of memory)

在这里插入图片描述
这个时候我们点击 heap dump下来堆信息看看

在这里插入图片描述

点击 “File” 选择 “Open heap Dump” ,默认会看到这个文件,选择就好

在这里插入图片描述
拉倒下面会看到这些信息
在这里插入图片描述
我们再往下看看
在这里插入图片描述
点击选择 java基础(java basics) 选择 “Thread Details”

定位到具体的代码,发现问题
在这里插入图片描述

看到了嘛,具体代码的位置都帮我们定位好了,那排查也就是手到擒来的事情了

最后来说一下 visual gc 从上往下对上图中的各个图标表及其状态进行说明:

Compile Time:编译情况

在这里插入图片描述
789 compoles - 20.011s 表示编译总数为 789 ,编译总耗时为 20.011s。
一个脉冲表示一次JIT编译,脉冲越宽表示编译时间越长。

Class Loader Time:类加载情况
在这里插入图片描述
1592 loaded,0 unloaded - 14.245s 表示已加载的数量为 1592 ,卸载的数量为 0,耗时为 14.245s。

GC Time:总的(包含新生代和老年代)gc 情况记录

在这里插入图片描述

64 collections,8.091s Last Cause:Allocation Failure表示一共经历了 64 次gc(包含Minor GC和Full GC),总共耗时,8.091s。

Eden Space:新生代 Eden 区内存使用情况

在这里插入图片描述

(1.162G,176.000M): 176.000M,17 collections,11.997s 表示 Eden 区的最大容量为 1.162G,当前容量为176.000M,当前已使用 176.000M,从开始监控到现在在该内存区域一共发生了 17 次gc(Minor GC),gc总耗时为11.997s。

Survivor 0和Survivor 1:新生代的两个Survivor区内存使用情况

在这里插入图片描述

(396.500M,396.5000M):61.21M 表示该 Survivor 区的最大容量为 396.500M(默认为Eden区的1/8),当前已用61.21M 。

Old Gen:老年代内存使用情况
在这里插入图片描述

(2.326G,2.326G):2.325G, 47 collections,56.094s 表示老年区的最大容量为 2.326G,当前容量为2.326G,当前已用 2.325G,从开始监控到现在在该内存区域一共发生了 47 次gc(Full GC),gc总耗时为 56.094s,换算下可以看出单次 Full GC 要比 Minor GC 耗时长很多。

Metaspace:方法区内存使用情况

在这里插入图片描述

(1.008G,8.875M):8.280M表示方法区最大容量为 1.008G,当前容量为 8.875M,当前使用量为8.280M。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LabVIEW是一种可以自动管理内存的编程语言和开发环境。它可以在适当的时候自动分配和回收资源,以避免内存泄漏和内存溢出问题。 以下是一些关于LabVIEW内存的信息和优化方法: 1. 查看内存使用情况: - 未运行的程序所占内存:可以使用操作系统的任务管理器或资源监视器来查看LabVIEW程序占用的内存。 - 查看运行中的VI所用时间及内存使用情况:在LabVIEW的运行时环境中,可以使用性能工具来监视VI的执行时间和内存使用情况。 - 显示所分配缓冲区:LabVIEW提供了一些工具和函数,可以显示当前分配的缓冲区的大小和使用情况。 2. 内存优化: - 避免将VI属性设置为重入:重入VI会在每次调用时创建新的实例,这可能会导致内存占用过高。如果不是必要的,可以将VI属性设置为非重入。 - 使用“请求释放内存”函数:在LabVIEW中,可以使用“请求释放内存”函数来手动释放不再使用的内存。 - 使用移位寄存器或元素同址操作结构:这些结构可以减少内存的使用,提高程序的效率。 - 尽量避免开启子VI前面板:如果不需要显示子VI的前面板,可以在调用子VI时选择“不显示前面板”,以减少内存占用。 - 将复杂VI拆分成几个子VI:将复杂的VI拆分成多个子VI可以提高代码的可读性和维护性,并且可以更好地管理内存。 - 避免内存泄漏:在LabVIEW中,内存泄漏通常是由于未正确释放资源导致的。确保在不再使用资源时及时释放它们,以避免内存泄漏问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值