一、jvm垃圾回收不了,java heap占满,导致应用频繁重启
从【Heap Usage】看,老年代(concurrent mark-sweep generation)的内存使用了99%以上,相较而言,新生代还有较多剩余;
JVM参数配置中的这一条,-XX:MaxTenuringThreshold=0,使新生代Eden区域的Java对象不经过Survivor区域,而直接晋升到老年代。这增加了老年代的垃圾回收负担,而且老年代开启了碎片整理,更加耗时;
请尝试将-XX:MaxTenuringThreshold参数调大一些,让对象晚一些进入老年代;
另外,请试一下增大Java堆内存的分配量,看是否能解决问题。
【以上只是个人猜测,不知能否帮上忙。从JVM的GC日志中,也许能进一步发现问题。】
二、调用system .gc()方法不能保证jvm立即进行垃圾收集而只是建议
一般不建议使用system.gc()去显示地要求进行垃圾回收,一般每一次显示的调用system.gc()都会进行一次full gc,而full gc会导致应用的暂停,如果频繁地full gc会导致应用长时间暂停,也就无**常运行了。
调用垃圾回收机制并不是发现垃圾就精心处理,而是积累到一定的数量才进行清理,程序运行结束时,进行一次垃圾清理,将产生的垃圾全面清理掉。
System.gc();//告诉垃圾收集器打算进行垃圾收集,而垃圾收集器进不进行收集是不确定的。
System.runFinalization();//强制调用已经失去引用的对象的finalize方法。
扩展资料:
垃圾收集能自动释放内存空间,减轻编程的负担。这使Java虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性,垃圾收集是Java语言安全性策略的一个重要部份。
参考资料来源:百度百科-java垃圾回收
三、jvm垃圾回收是什么时候触发的垃圾回收算法
1.垃圾回收目的:Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。
ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。
2.
由于对象进行了分代处理,因此垃圾回收区域、时间也不一样。GC有两种类型:Scavenge GC和Full GC。
Scavenge GC
一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,一般在这里需要使用速度快、效率高的算法,使Eden去能尽快空闲出来。
Full GC
对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个堆进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。有如下原因可能导致Full GC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显示调用
4.上一次GC之后Heap的各域分配策略动态变化
感谢您的阅读!希望本文对解决您关于jvm mdash mdash 垃圾回收机制(GC)详解_jvm垃圾回收机制和jvm垃圾回收是什么时候触发的垃圾回收算法的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。