Gol*_*ade 24 java memory-leaks while-loop
我正在探索Java中的内存使用,以了解我的程序泄漏内存的原因.在我的main while循环中剥离代码之后,我仍然会随着时间的推移增加内存使用量.思考空程序的内存使用情况:
class Nothing
{ public static void main(String[] args)
{ while(true); }
}
Run Code Online (Sandbox Code Playgroud)
我仍然看到内存增加:
所以我的问题是:为什么还有锯齿形?为什么当GC运行时它不会保存所有内存(每次gc运行(谷值)使用的内存增加10-20Kb(与之前的谷值相比))?
编辑:
java版"1.6.0_29"
Java(TM)SE运行时环境(版本1.6.0_29-b11)
Java HotSpot(TM)客户端VM(内置20.4-b02,混合模式,共享)
操作系统:Windows 7 Enterprise-32位
rua*_*akh 11
为什么还有锯齿形?
如果我没有弄错的话,部分原因是监视器本身正在强制应用程序创建临时对象,其中包含有关垃圾收集和内存使用状态的信息.
为什么当GC运行时它不会保存所有内存(每次gc运行(谷值)使用的内存增加10-20Kb(与之前的谷值相比))?
我相信监视器不会立即看到垃圾收集后使用的内存量,而是必须经常轮询以查看内存使用情况.因此,感知的"山谷"必然略高于真正的山谷.我猜想,山谷中内存使用率的增加只是这种差异的随机误差,并且会随着时间的推移而中和.(也就是说,我认为每个周期中实际上并没有发生10-20 KB的内存泄漏.)
这是探查器的工件,没有探查器,就不会有分配。不同的探查器会根据记录数据的方式产生不同的工件。在下面,您可以看到对Nothing
JProfiler进行概要分析的样子:
锯齿形图案少得多。但是,内存消耗也很小:
这是由于分析代理会轮询java.lang.management.MemoryUsage
JMX bean。最终,这种消耗还将触发垃圾回收。
归档时间: |
|
查看次数: |
1754 次 |
最近记录: |