Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—在运行时检测内存交换_Java_Memory_Garbage Collection_Jvm - Fatal编程技术网

Java—在运行时检测内存交换

Java—在运行时检测内存交换,java,memory,garbage-collection,jvm,Java,Memory,Garbage Collection,Jvm,我有一个程序,强烈怀疑内存交换正在发生。我之所以相信是这样,是因为程序只是偶尔挂起。当我开始记录时,随着程序开始挂在不同的位置,执行不同的方法,事情变得更加混乱。 此时,我正在使用32位IBMJava和2gb专用于该程序,因此我的内存非常有限。可以更改为x64,但在此之前: 问题1:我可以在运行时通过编程检测内存交换吗?或者我如何至少给myslef一些交换正在发生的提示(通过日志记录)。 到目前为止,我还没有可用的内存使用日志,但是,如果xmx是2Gigs,那只是RAM,如果发生内存交换,我会不

我有一个程序,强烈怀疑内存交换正在发生。我之所以相信是这样,是因为程序只是偶尔挂起。当我开始记录时,随着程序开始挂在不同的位置,执行不同的方法,事情变得更加混乱。
此时,我正在使用32位IBMJava和2gb专用于该程序,因此我的内存非常有限。可以更改为x64,但在此之前:
问题1:我可以在运行时通过编程检测内存交换吗?或者我如何至少给myslef一些交换正在发生的提示(通过日志记录)。
到目前为止,我还没有可用的内存使用日志,但是,如果xmx是2Gigs,那只是RAM,如果发生内存交换,我会不会看起来没有足够的内存?
问题2:我现在想的是,我可以记录垃圾收集的开始吗?我可以在运行时检测到它吗?
编辑:该程序从数据库导出大量数据。
EDIT2:我可以通过编程禁止givem JVM的内存交换吗

我可以在运行时通过编程检测内存交换吗

您可以在操作系统中监视使用了多少交换,或者向交换分区写入了多少。您如何做到这一点取决于您的操作系统>

如果发生内存交换,是否会出现内存不足的情况

如果您有足够的内存,则不会发生交换。注意:即使没有发生交换,增加内存也无济于事。很可能您需要的不仅仅是应用程序内存,例如磁盘缓存也很重要

我可以记录垃圾收集的开始吗

您可以在另一个进程中运行,但是,当停止世界操作正在发生时,您不能运行任何操作

可以更改为x64,但在此之前:

Java 5.0是最后一个版本,我会说32位可能是最好的。那是十年前的事了

程序从数据库导出大量数据

如今,1GB比一杯咖啡的成本还低。即使是几十GB也没什么好担心的。数百GB的容量正在变大,如果你有一些TB,你就会遇到一个有趣的问题。我的一些客户有3 TB的机器,他们有非常大的数据量,例如100 TB

我把一台多年没用的旧电脑给了我的大女儿,她把它给了我8岁的女儿。它有24GB的内存,她主要用来观看youtube视频

我可以通过编程禁止givem JVM的内存交换吗


您可以使用JNI将其锁定到内存中,但当一台机器交换堆空间时,您的机器无论如何都处于死亡边缘。

这是操作系统的事情,而不是java的事情/proc/swaps记录了此类信息。您可以通过监视文件来检测交换行为。如上所述,内存交换是由操作系统决定的,而不是由应用程序决定的。我希望您知道,交换和垃圾收集是两件完全不同的事情。当操作系统的物理内存用完时,它将进行交换,因此切换到64位JVM不会改变实际的物理内存。由于64位JVM能够使用更多的内存,它甚至可能会增加物理内存不足的可能性。我意识到这一区别,我提到64位java只是为了避免这样的答案,例如,您需要更多的ram“。现在我有一个程序挂起,没有thrownig和一个错误或任何失败的迹象。内存交换出现在我的脑海中,因为低性能的HDD可能是导致挂起(或速度非常慢)而不抛出的原因,这可能是在GC中花费太多时间的迹象,在再次收集之前总是设法回收少量内存,因此GC认为其操作成功,而表演是不切实际的。此行为取决于实际的GC算法,例如,如果CMS收集器检测到它在收集上花费了太多时间(>98%iirc),它最终将抛出OOME。所以这可能会有帮助…