我使用Javolution Struct来表示Java中的C结构。使用Javolution Struct的Java OutOfMemoryError
但是,每次创建新项目时,它都会分配到进程的本机部分,并增加内存使用量。
即使Java堆大小仍然很小,最终该进程仍可达到4GB的内存。这个过程然后被操作系统杀死(我被迫使用一个32位的java)。
这里是一个小类演示该问题:
import javolution.io.Struct;
public class StructTest
{
public static class SimpleStruct extends Struct
{
private final Unsigned32 value = new Unsigned32();
}
public static void main(String[] args)
{
try
{
for (int i = 0; i < 10000000 ; i++)
{
SimpleStruct st = new SimpleStruct();
st.value.set(0xFFFF);
if (i % 10000 == 0)
{
long free = Runtime.getRuntime().freeMemory();
long total = Runtime.getRuntime().totalMemory();
System.out.printf("%08d: Total Memory=%,12d ; Used Memory=%,12d\n", i, total, total - free);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
这里是“顶”了这个过程。如你所见,内存增加非常迅速:
886根20 0 1617m 447m 5536 S 26.8 1.2 0:00.83 java -cp。 StructTest
886根20 0 1917m 761m 5536 S 28.2 2.1 0:01.12 java -cp。 StructTest
886根20 0 2116m 990m 5540 S 359.9 2.7 0:04.80 java -cp。 StructTest
886根20 0 2120m 1.0g 5580 S 115.3 2.8 0:06.00 java -cp。 StructTest
886根20 0 2302m 1.2g 5580 S 23.5 3.3 0:06.24 java -cp。 StructTest
886根20 0 2568m 1.4g 5580 S 180.3 4.1 0:08.08 java -cp。 StructTest
886根20 0 2817m 1.7g 5580 S 95.5 4.8 0:09.09 java -cp。 StructTest
886根20 0 3114m 2.0g 5580 S 26.4 5.6 0:09.36 java -cp。 StructTest
886根20 0 3406m 2.3g 5580 S 30.2 6.4 0:09.67 java -cp。 StructTest
886根20 0 3699m 2.6g 5580 S 25.5 7.3 0:09.93 java -cp。 StructTest
886 root 20 0 3994m 2.9g 5580 S 27.4 8.1 0:10.21 java -cp。 StructTest
我可以尝试重用结构,而不是重新创建它,但我需要多个线程中的多个项目。
是否有一个简单的方法来指示进程释放内存不再需要的结构?
编辑: 在RedHat Linux上测试(主要是6.2,但也发生在5.6)。 2.6.32-220.el6.x86_64 红帽企业Linux服务器版本6.2(圣地亚哥) 适用于Java 1.6.0_03(1.6.0_03-b05)和64位版本1.6.0_30。
感谢, 铝