Java 中的突发内存使用情况
我试图在Java中处理正确的内存使用和垃圾回收。无论如何,我都不是新手程序员,但在我看来,一旦Java触及一些内存,它就永远不会被释放给其他应用程序使用。在这种情况下,您必须确保峰值内存永远不会太高,否则您的应用程序将持续使用峰值内存使用量。
我写了一个小示例程序来演示这一点。它基本上有4个按钮...
- 用大约 25,000,000 个长字符串项填充类作用域变量。
BigList = new ArrayList<string>()
- 叫
BigList.clear()
- 再次重新分配列表(以缩小列表大小)
BigList = new ArrayList<string>()
- 电话 - 是的,我知道这并不意味着GC真的会运行,但这就是我们所拥有的。
System.gc()
因此,接下来我在Windows,Linux和Mac OS上进行了一些测试,同时使用默认任务监视器来检查进程报告的内存使用情况。这是我的发现...
-
Windows - 抽取列表,调用清除,然后多次调用GC不会减少内存使用量。但是,使用然后多次调用 GC 重新分配列表会将内存使用率降低到起始级别。国际海事组织,这是可以接受的。
new
- Linux(我使用Mint 11发行版和Sun JVM) - 结果与Windows相同。
- Mac OS - 我遵循了与上面相同的步骤,但即使重新初始化列表调用GC似乎也没有效果。该程序将使用数百MB的RAM,即使我的内存中没有任何东西。
任何人都可以向我解释一下吗?有些人告诉我一些关于“堆”记忆的事情,但我仍然不完全理解它,我不确定它是否适用于这里。根据我所听说的,无论如何,我都不应该看到我在Windows和Linux上的行为。
这只是Mac OS的“活动监视器”测量内存使用情况的方式的差异,还是发生了其他事情?我宁愿我的程序不会因大量RAM使用而闲置。感谢您的见解。