【发布时间】:2017-04-14 13:21:17
【问题描述】:
我有一个程序并且强烈怀疑正在发生内存交换。我相信这种情况的原因是程序不时挂起。当我开始记录时,事情变得更加混乱,因为程序开始挂在不同的地方,执行不同的方法。
目前,我正在使用 32 位 IBM Java 和 2gb 专用于该程序,所以我在内存方面处于优势地位。可以更改为 x64,但在此之前:
问题 1:我可以在运行时以编程方式检测内存交换吗?或者我怎么能至少给我自己一些提示(通过日志)交换正在发生。
截至目前,我没有可用的内存使用日志,但是,如果 xx 是 2Gigs,那只是 RAM,如果发生内存交换,是否会显示我没有足够的内存?
问题2:我现在想,我可以记录垃圾收集的开始吗?我可以在运行时检测到它吗?
编辑: 说程序从数据库中导出大量数据。
EDIT2: 我可以通过编程方式禁止为给定 JVM 进行内存交换吗?
【问题讨论】:
-
那是操作系统的东西,不是 java 的东西
-
/proc/swaps 记录了此类信息。您可以通过监视文件来检测交换行为。如前所述,内存交换是由操作系统而不是应用程序决定的。
-
我希望你知道交换和垃圾回收是两个完全不同的东西。操作系统会在物理内存用完时进行交换,因此切换到 64 位 JVM 不会改变实际物理内存的任何内容。由于 64 位 JVM 能够使用更多内存,它甚至可能增加耗尽物理内存的机会。
-
我知道其中的区别,我提到 64 位 java 只是为了避免像“你需要更多内存”这样的答案。现在我的程序挂起而没有 throwig 和错误或任何失败迹象. 内存交换出现在我的脑海中,因为性能低下的 HDD 可能是导致这些挂断的原因
-
挂起(或非常慢)而不抛出可能表明在 GC 中花费了太多时间,总是设法在不得不再次收集之前回收少量内存,因此 GC 会考虑其操作成功,而性能却是不切实际的。此行为取决于实际的 GC 算法,例如如果 CMS 收集器检测到它在收集上花费了太多时间(> 98% iirc),它最终会抛出一个 OOME。所以Java SE HotSpot VM Garbage Collection Tuning Guide 可能会有所帮助……
标签: java memory garbage-collection jvm