JVM中GC时,堆内存是如何动态变化的(JDK1.7)

首先得知道JVM堆内存分为old和 young ,young又由eden 和survivor组成 而 survivor又由s0和s1组成

用图更加明显:(7/3这种比例不是固定的)

或者用另外一个图更加明显

当Eden区域达到一定的量时,触发了Minor GC,即将Eden和S0中的存活的对象复制S1中 然后清空Eden和S0,然后下一次触发Minor GC时就将Eden和S1中的存活的对象复制S0中,然后清空Eden和S1 循环往复,当某个对象对复制次数达到16次,该对象就会被送到Old中,下面用动图表示会更加直观

如果我们手动将JVM内存设置小一点,GC会更明显,

在eclipse中设置

可以看到我们设置的JVM初始堆大小为128M ,再看内存

它的GC会更加频繁

再仔细看这张图 你会发现 一个公式

30.5 + 6 +6 + 85.5 = 128

这里的128就是我们eclipse中设置的堆内存大小

那堆内存中到底有哪些对象呢?

通过JDK自带的工具JavaVisualVM可以查看(在JDK安装目录下,比如:D:\java\jdk1.8\bin下的jvisualvm.exe)

 这么多对象,而我们可能最主要关注的对象是自己写的那些对象,那就可以用下面的正则表达式过滤,

比如我的项目包名是com.sc.xxxx那就搜:^com.sc.*$ 会得到我们自己写的对象

 再动态的看一遍对象 和 内存 和 GC之前的关系

这是一个spring项目 多看几遍 会发现 其中Student实例每次请求会增加,但是其中的StudentServiceImpl实例数一直为1

猜你喜欢

转载自blog.csdn.net/l1509214729/article/details/81781252