java 进程消耗内存只增不减

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 进程消耗内存只增不减相关的知识,希望对你有一定的参考价值。

我现在用一个死循环来做一个操作, 每循环一次等待3分钟, 当运行这个代码的时候, java进程消耗的内存不断的增加,且不下降, 为什么会出现这样一种情况呢?
简单的代码逻辑描述:
while(true)
do(需要重复进行的操作)
wait(3mins)

我将最大和最小内存都设置成一样,会让java进程消耗内存只增不减么? 我发现我的初始化内存是这样设置的: -Xms 1024m -Xmx1024m
是死循环造成java进程消耗内存不断增加, 还是jvm的初始化造成这样的结果?(假设while循环体内不存在内存泄露)

问题出现在“需要重复进行的操作”这个上面!
首先要清楚,java中的内存分两种,一个是堆内存,一个是栈内存!内存泄露到底在哪个区间中泄露了呢,看你“需要重复进行的操作”这里面的代码怎么写了!如果这里面在不断的对变量进行操作的话,内存泄露是肯定的,因为要释放栈内存必须等该方法结束才会释放其变量!很明显,你这个方法永远不会结束!至于“jvm的初始化造成这样的结果”不会的!jvm的初始化只是把字节码加载进内存里而已!不会造成这样的结果!
呵呵,希望对你有帮助!
参考技术A 虚拟机内存不断增加没有问题,问题的关键是,当增加到你设置的:-Xmx1024m
,1024M左右时能下降就行。你的设置没有问题。追问

java.exe这个进程消耗的内存没有下降, 是不是我的while循环体内就一定有内存泄露呢?
你的意思是在java.exe内存消耗未达到1024M的时候, 他的内存消耗会一直增加,到了1024M后, 它会下降, 是么?

追答

是的,你设置了最大内存是1024M,JAVA虚拟机就会一直增加内存占用,一直到1024M附近,才会触发垃圾回收机制,内存回收。你如果不放心,可以把你的代码贴出来给我看看,应该不会有内存泄漏的。没有必要自己调用楼下说的“gc()”方法。

本回答被提问者和网友采纳
参考技术B 这个是jvm的后果,你这么设置的话堆区不会自动扩展 参考技术C 你可以定义一个runtime类的实例来释放内存;如
Runtime run=Runtime.getRuntime(); //取得当前jvm的运行时实例
run.gc(); //运行Runtime的垃圾回收方法

参考资料:、、

以上是关于java 进程消耗内存只增不减的主要内容,如果未能解决你的问题,请参考以下文章

Cesium的3D在多个单页面应用中,内存只增不减致内存溢出问题的解决

为啥我的 Java 进程在 docker 容器与主机之间消耗两倍的内存

核心数据+iCloud:iCloud Storage只增不减

JAVA-内存及CPU排查

Java 进程驻留内存

Prometheus:如何收集临时进程的内存消耗指标?