我正在开发桌面java应用程序,并尝试使用Java visualVM在运行时优化内存使用。
问题是我注意到我的堆已经增长了大约1mb / s,我正在试图找出造成它的原因。这就是它的样子:
首先,我注意到JVM似乎在运行时分配了相当多的内存。我试图制作一个只是睡觉的虚拟程序,并且使用堆的增加似乎约为0.2Mb / s。
但是,我的应用程序显然分配了更多。而且我知道我在运行时创建了很多对象,但它不应该接近MB / s,更像是字节/秒。
所以,我做了一些转储并对它们进行了比较。这是第一次,当一个新的GC被调用时:
这是另一个,用过的堆增长了~100MB:
以下是比较:
现在,令我感到困惑的是,我在两个转储中找不到任何额外的100 mb的痕迹。
总字节数相同。类是一样的。实例大致相同。比较没有提示。但是,转储证实我只分配了一些类/ s。那是什么给出了什么?
更新1:使用eclipse内存管理器:
(嫌犯不是罪魁祸首)。我想强调的是,visualVM在转储时向我显示了100MB的使用堆差异。我在申请中
print("Used Mbs: " + (r.totalMemory() - r.freeMemory())/mb);
也证实了这一点。 ('r'是运行时实例)
答案 0 :(得分:2)
我不认为你有问题。
您需要了解JVM内存模型和代数。
年轻一代的锯齿模式是这样说的。这就是垃圾收集器的功能。
你看到的永久性东西是perm gen(或者是JDK 7及更早版本)。那就是字符串,.class字节代码等等。
答案 1 :(得分:0)
我在visualVM中发现了这个简洁的功能 - 监控。
所以,我一直在监视这个:
public static void main(String[] args) {
while (true){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
似乎JVM正在分配chars [],Object [],byte [],int [],TreeMap $ Entry等等。我一直在看我的应用程序,它似乎遵循相同的模式,只有更大的量。所以,我将把所有人都排除在外,就像所有的奥拉克勒斯一样。 JVM开销随应用程序一起增长。除非有人能想出更好的主意吗?