首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RandomAccessFile内存泄漏

RandomAccessFile内存泄漏
EN

Stack Overflow用户
提问于 2010-11-25 17:38:04
回答 3查看 1.1K关注 0票数 2

我正在使用java中的RandomAccessFile。我有一个内存泄漏的问题。我已经将我的代码简化为以下代码:

代码语言:javascript
复制
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造成的?

EN

回答 3

Stack Overflow用户

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2010-11-25 17:46:12

如何查看内存使用情况?操作系统报告的使用情况仅表明java堆的大小已扩展。您不能知道堆是否为空,或者它是否已满但具有符合GC条件的对象。

您应该使用一些与java相关的工具(例如VisualVM或jmap)。这将为您提供更好的堆内存状态指示。

票数 2
EN

Stack Overflow用户

发布于 2010-11-25 17:45:53

内存仅在GC运行时回收,而GC仅在需要时运行。如果您希望看到内存使用率下降,请尝试调用System.gc()。

顺便说一句: Java并不保证将内存返回给操作系统,相反,它倾向于在内部增加空闲内存。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4275557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档