当抛出与堆空间不足相关的异常时,我增加了java Xmx内存限制。但是,我目前遇到了可能与内存相关的非常长的执行时间,但我还没有看到抛出的异常。我想知道是什么原因导致了长时间的执行时间。JVM是否将堆交换到磁盘上?我使用的是HotSpot 1.6.0更新34。
ki1q1bka1#
JVM不会交换到磁盘,不会。操作系统可能会这样做。您可以通过检查进程上的操作系统统计信息来检测这一点。随着JVM内存不足,垃圾收集被越来越频繁地触发。每次运行释放的内存越少,GC的速率就越高。最终,大量的时间都花在GC上,这很可能就是您看到的速度变慢。JVM不会等到释放了0个字节才抛出OutOfMemoryError,当GC花费的时间与释放的字节数相比太长时,它实际上会给予。
OutOfMemoryError
0x6upsns2#
更大的堆的一个可能的后果是GC时间的增加-JVM必须分析更大的空间,所以它需要更长的时间-特别是如果它是停止世界的GC。你能把你的问题具体化一点吗?你使用的堆大小是多少?你看到的持续时间是多少?你的应用程序中对象的使用模式是什么?例如,几个长期存在的对象,或者很多短期存在的对象。
2条答案
按热度按时间ki1q1bka1#
JVM不会交换到磁盘,不会。操作系统可能会这样做。您可以通过检查进程上的操作系统统计信息来检测这一点。
随着JVM内存不足,垃圾收集被越来越频繁地触发。每次运行释放的内存越少,GC的速率就越高。最终,大量的时间都花在GC上,这很可能就是您看到的速度变慢。
JVM不会等到释放了0个字节才抛出
OutOfMemoryError
,当GC花费的时间与释放的字节数相比太长时,它实际上会给予。0x6upsns2#
更大的堆的一个可能的后果是GC时间的增加-JVM必须分析更大的空间,所以它需要更长的时间-特别是如果它是停止世界的GC。
你能把你的问题具体化一点吗?
你使用的堆大小是多少?你看到的持续时间是多少?你的应用程序中对象的使用模式是什么?例如,几个长期存在的对象,或者很多短期存在的对象。