gpt4 book ai didi

java - java占用过多内存

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:33:36 28 4
gpt4 key购买 nike

在我的一个项目中,我不断地压缩小块数据。现在我发现 jvm 然后增长到 6GB 的 ram(常驻 (RES) RAM,不是共享的或虚拟的等等)然后由于内存不足而死亡。就好像垃圾收集器从未运行过一样。我已经提取了相关代码并将其粘贴在下面。当我运行它(java6、32 位 linux)时,它会增长到 1GB 的内存。有人知道如何减少内存使用吗?

import java.util.Random;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

class test {
int blockSize = 4096;
Random r = new Random();

public test() throws Exception {
blockSize = 4096;
byte [] data = new byte[blockSize];
for(int index=0; index<blockSize; index++)
data[index] = (byte)r.nextInt();

for(long cnt=0; cnt<1000000; cnt++) {
byte [] result = compress(data);
if (result != null)
data[0] = result[0];
}
}

byte [] compress(byte [] in) {
assert in.length == blockSize;

Deflater compresser = new Deflater();
compresser.setInput(in);
compresser.finish();
byte [] out = new byte[in.length];
int outLen = compresser.deflate(out);

if (outLen < blockSize) {
byte [] finalOut = new byte[outLen];
System.arraycopy(out, 0, finalOut, 0, outLen);
return finalOut;
}

return null;
}

public static void main(String [] args) throws Exception {
new test();
}
}

最佳答案

好吧,Folkert van Heusden 解决了他自己的问题,但总结一下:

compress(byte [] in) 方法的早期,我们创建了一个 java.util.zip.Deflater

我们使用 Deflater 做一些事情,然后我们离开 compress() 方法。我们失去了对 deflater 变量的引用。此时,Deflater 不再使用,等待被垃圾收集器杀死。

Deflater 分配 Java 堆内存C/C++/ native 堆内存。由 Deflater 分配的 native 堆内存将被保留,直到垃圾收集器调用 Deflater.finalize 方法。如果垃圾收集器运行得不够快(可能有大量可用的 Java 堆内存),我们可能会用完 C/C++ 堆内存。如果发生这种情况,我们将得到“内存不足”错误。

Oracle 错误报告 JDK-4797189可能是相关的。它包含说明和重现问题的代码片段:

public class Bug {
public static void main( String args[] ) {
while ( true ) {
/* If ANY of these two lines is not commented, the JVM
runs out of memory */
final Deflater deflater = new Deflater( 9, true );
final Inflater inflater = new Inflater( true );
}
}
}

解决方案是在完成后通过调用 Deflater.end() 方法(或 Inflater.end())释放资源。

关于java - java占用过多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6274696/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com