无论我分配4、8或10 Gig多少内存,我的应用程序都会消耗大部分内存(96%),并且由于没有足够的内存而每隔几天就会停顿GC。
我们正在监视并触发手动GC以减轻痛苦,但是我希望JVM在适当的时候能够预见到它本身和GC。
我应该考虑在80%时触发GC的哪些标志-这种坦率的做法是正确的吗?
答案 0 :(得分:1)
首先检查您是否拥有:
StackOverFlowError与堆栈有关:
由于应用程序的递归太深而导致堆栈溢出时抛出。
OutOfMemoryError与堆有关:
当Java虚拟机由于内存不足而无法分配对象,并且垃圾回收器无法再提供更多内存时,抛出该异常。
如果存在StackOverFlowError,则可能是与递归未完成有关的问题。因此,请检查退出条件,以确保您具有正确的退出条件。另一种可能是让两个(或更多)方法互相调用。
如果发生OutOfMemoryError,则可能在内存中存储了很多对象。例如,如果您在不删除对象的情况下将对象存储在Map中(例如,使用Map作为内存缓存系统),就会发生这种情况。