【发布时间】:2011-01-26 15:24:45
【问题描述】:
我创建了一个包含一组孩子的特里树。删除一个单词时,我将孩子设置为空,我会假设删除节点(删除是一个相对术语)。我知道 null 不会删除孩子,只是将其设置为 null,这在使用大量单词时会导致堆溢出。
在 linux 上运行 top,我可以看到我的内存使用量很快飙升到 1gb,但是如果我在删除 (Runtime.gc()) 后强制垃圾收集,内存使用量会达到 50mb 并且永远不会超过这个值。据我所知,java 默认情况下会在堆溢出发生之前运行垃圾收集,但我看不到它会发生。
【问题讨论】:
-
你不应该在内存边缘玩,先修复你的应用程序以防止 1GB 峰值。
-
@medopal:虽然应该注意不要请求比实际需要更多的资源,但对于某些应用程序来说,从对GC 并利用这种理解来充分利用可用内存。虽然调用 Runtime.gc() 是“一般”不好的做法,但它会暴露给开发人员是有原因的。
-
@Eric,好点子,我个人的 Java 应用程序可以用于台式机到大型机(通过许多操作系统)和不同的设置,管理内存可能会变得非常复杂
-
不要强制 java 交换。非常非常糟糕的事情发生了,它会破坏你的电脑。我实际上不得不重新启动——它太频繁地触及内存的所有部分。
-
@medopal:我怀疑绝大多数 Java 程序都符合与您类似的标准。只是说在软件开发中存在一些边缘情况,您希望能够最大限度地利用可用内存。
标签: java heap-memory