Java 查找JVM中分配的原因
最近,我在JVM中遇到了一个内存分配问题 根据GC日志和jvisulvm,我的应用程序正在创建一个数组Java 查找JVM中分配的原因,java,memory-management,jvm,Java,Memory Management,Jvm,最近,我在JVM中遇到了一个内存分配问题 根据GC日志和jvisulvm,我的应用程序正在创建一个数组 ... 15.587: [GC (Allocation Failure) [PSYoungGen: 8387648K->192K(8388096K)] 8413385K->25945K(16776704K), 0.0004254 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 15.592: [GC (Allocation Fa
...
15.587: [GC (Allocation Failure) [PSYoungGen: 8387648K->192K(8388096K)] 8413385K->25945K(16776704K), 0.0004254 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.592: [GC (Allocation Failure) [PSYoungGen: 8387776K->192K(8388096K)] 8413529K->26001K(16776704K), 0.0003679 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.596: [GC (Allocation Failure) [PSYoungGen: 8387776K->96K(8388096K)] 8413585K->25929K(16776704K), 0.0004090 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.602: [GC (Allocation Failure) [PSYoungGen: 8387680K->128K(8388096K)] 8413513K->25993K(16776704K), 0.0004101 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.606: [GC (Allocation Failure) [PSYoungGen: 8387712K->128K(8388096K)] 8413577K->26025K(16776704K), 0.0003756 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.611: [GC (Allocation Failure) [PSYoungGen: 8387712K->160K(8388096K)] 8413609K->26097K(16776704K), 0.0003965 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
15.626: [GC (Allocation Failure) [PSYoungGen: 8387744K->128K(8388096K)] 8413681K->26105K(16776704K), 0.0004195 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
...
我在整个代码库中搜索了“newint[]”,只找到了两个分配,我很确定它们只运行了一次。这让我相信数组是在某个库或JRE中分配的
如何找到这些分配的根目录?如果探查器没有为发生泄漏/分配的代码路径,请获取新的探查器。总是第一步。通过第一行,它应该能够告诉您分配
int
数组的所有代码路径。@Qix我能够得到堆转储,但由于某种原因,它只有7MB大。我相信探查器在进行转储并因此销毁int数组之前正在运行GC。这并不重要,获取分配这些int数组的代码路径(堆栈跟踪)是至关重要的。如果VisualVM不为您这样做,我会感到惊讶。在这种情况下,堆转储对您没有多大帮助;这是一个明显的内存泄漏。@Qix如果代码是用int[]
完成的,这只是一个内存泄漏。如果代码仍在使用它,这不是泄漏,只是需要比可用内存更多的内存,在这种情况下,添加内存或更改算法是答案,而不是搜索泄漏。@Andrease好像您看到了奇怪的内存使用模式,而这是您不希望从代码中看到的(正如OP所指定的),始终将其视为泄漏进行调查,直到证明存在其他泄漏。很好的经验法则。