Java堆增长

时间:2016-06-01 17:03:09

标签: java garbage-collection heap

我正在开发桌面java应用程序,并尝试使用Java visualVM在运行时优化内存使用。

问题是我注意到我的堆已经增长了大约1mb / s,我正在试图找出造成它的原因。这就是它的样子:

enter image description here

首先,我注意到JVM似乎在运行时分配了相当多的内存。我试图制作一个只是睡觉的虚拟程序,并且使用堆的增加似乎约为0.2Mb / s。

但是,我的应用程序显然分配了更多。而且我知道我在运行时创建了很多对象,但它不应该接近MB / s,更像是字节/秒。

所以,我做了一些转储并对它们进行了比较。这是第一次,当一个新的GC被调用时:

enter image description here

这是另一个,用过的堆增长了~100MB:

enter image description here

以下是比较:

enter image description here

现在,令我感到困惑的是,我在两个转储中找不到任何额外的100 mb的痕迹。

总字节数相同。类是一样的。实例大致相同。比较没有提示。但是,转储证实我只分配了一些类/ s。那是什么给出了什么?

更新1:使用eclipse内存管理器:

enter image description here

(嫌犯不是罪魁祸首)。我想强调的是,visualVM在转储时向我显示了100MB的使用堆差异。我在申请中

print("Used Mbs: " + (r.totalMemory() - r.freeMemory())/mb);

也证实了这一点。 ('r'是运行时实例)

2 个答案:

答案 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开销随应用程序一起增长。除非有人能想出更好的主意吗?