我正在使用java中的RandomAccessFile。我有一个内存泄漏的问题。我已经将我的代码简化为以下代码:
public static void main(String[] args) throws IOException, InterruptedException
{
RandomAccessFile r = new RandomAccessFile(new File("test.dat"), "rw");
r.write(new byte[150000000], 0, 150000000);
r.getFD().sync();
r.close();
r = null;
while (true) { Thread.sleep(1000); }
}执行此代码(并为GC留出足够的时间)之后,报告的应用程序内存使用量略高于150MB。
我错过了什么?或者是Java造成的?
发布于 2010-11-25 17:47:13
GC将只使内存在JVM中可用。GC释放的内存不会自动返回给操作系统。JVM通常非常不愿意将内存返回给OS,因为它可能很快就会再次需要它,并且从OS获取内存是一个相对昂贵的操作。
要查看堆内存的已用百分比和空闲百分比,可以使用Visual VM。如果您希望JVM更急切地将内存返回给OS,则可以使用tuning parameters of the Oracle JVM,特别是-XX:MaxHeapFreeRatio和-XX:MinHeapFreeRatio
发布于 2010-11-25 17:46:12
如何查看内存使用情况?操作系统报告的使用情况仅表明java堆的大小已扩展。您不能知道堆是否为空,或者它是否已满但具有符合GC条件的对象。
您应该使用一些与java相关的工具(例如VisualVM或jmap)。这将为您提供更好的堆内存状态指示。
发布于 2010-11-25 17:45:53
内存仅在GC运行时回收,而GC仅在需要时运行。如果您希望看到内存使用率下降,请尝试调用System.gc()。
顺便说一句: Java并不保证将内存返回给操作系统,相反,它倾向于在内部增加空闲内存。
https://stackoverflow.com/questions/4275557
复制相似问题