我有一个程序,并且强烈怀疑内存交换正在发生。我相信的原因是程序不时挂起。当我开始记录时,事情变得更加混乱,因为程序开始挂在不同的地方,执行不同的方法。
目前我使用32位IBM Java和2gb专用于该程序,所以我对内存有了优势。可以更改为x64但在此之前:
问题1:我可以在运行时以编程方式检测内存交换吗?或者我怎么能至少给myslef一些提示(通过日志记录)交换发生。
到目前为止,我没有可用的内存使用日志,但是,如果xmx是2Gigs,那只是RAM,如果发生内存交换,是否会出现我没有足够的内存?
问题2:我现在想一想,我可以记录垃圾收集的开始吗?我可以在运行时检测到它吗?
编辑:所述程序从数据库中导出大量数据。
EDIT2:我可以以编程方式禁止为jm进行内存交换吗?
答案 0 :(得分:2)
我可以在运行时以编程方式检测内存交换吗?
您可以在操作系统中监控正在使用的交换量或交换分区的写入量。如何执行此操作取决于yoru OS>
如果发生内存交换,是否会出现我没有足够的内存?
如果你有足够的内存,就不会发生交换。注意:即使没有发生交换,更多的内存也无济于事。您很可能需要的不仅仅是应用程序内存,例如磁盘缓存也很重要。
我可以记录垃圾收集的开始吗?
你可以在另一个过程中,但是当一个世界停止行动正在发生时,你无法运行任何东西。
可以更改为x64但在此之前:
Java 5.0是我说过的最后一个版本可能是32位最好的。那是十年前的事。
程序从数据库中导出大量数据。
这一天1 GB的价格低于一杯咖啡的成本。甚至数十GB也不用担心。数以百计的GB变得越来越大,如果你有几TB,你就会遇到一个有趣的问题。我的一些客户有3台TB机器,他们有非常大量的数据,例如100s TB。
我给了一台旧电脑,这台电脑多年来一直用于我的大女儿,并把它送给了我8岁的女儿。它有24 GB的内存,她用它来主要观看YouTube视频。
我可以以编程方式禁止为jm提供内存交换吗?
您可以使用JNI将其锁定到内存中,但是当机器交换您的堆空间时,您的机器仍处于死亡的边缘。