jvm中所使用堆大小为什么会不断变化

9344187 2013-08-02 11:05:42
写了一个main方法,让其sleep,然后用jvisualvm看jvm的使用情况,发现所使用的堆大小总是不断变化,像锯齿状,

main方法:

public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}

请问是什么原因是堆的大小不断增大,我在main方法里并没有创建对象啊?
...全文
977 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
9344187 2013-08-06
  • 打赏
  • 举报
回复
引用 6 楼 gaobaiy 的回复:
根据这图,肯定是在堆中不停的有对象创建,然后被GC 而你的程序并没有进行new操作(异常处理应该是和方法区和栈帧中吧?) 可能是JVM内部的一些操作导致的吧,为证明这个问题,可以看看关掉这个程序,堆变化如何
我这个死循环也是什么都没做啊,只是让它睡眠了而已。 我觉得你说的“JVM内部的一些操作导致”分析的挺靠谱的
码之魂 2013-08-05
  • 打赏
  • 举报
回复
有无限个try,catch,thread...然后jvm要回收他们啊.
gaobaiy 2013-08-05
  • 打赏
  • 举报
回复
引用 6 楼 gaobaiy 的回复:
根据这图,肯定是在堆中不停的有对象创建,然后被GC 而你的程序并没有进行new操作(异常处理应该是和方法区和栈帧中吧?) 可能是JVM内部的一些操作导致的吧,为证明这个问题,可以看看关掉这个程序,堆变化如何
说错了,关掉就没法监控,你写一个什么也不做的死循环,看看
fedori 2013-08-05
  • 打赏
  • 举报
回复
学习了。。。
gaobaiy 2013-08-05
  • 打赏
  • 举报
回复
根据这图,肯定是在堆中不停的有对象创建,然后被GC 而你的程序并没有进行new操作(异常处理应该是和方法区和栈帧中吧?) 可能是JVM内部的一些操作导致的吧,为证明这个问题,可以看看关掉这个程序,堆变化如何
lkq_david 2013-08-05
  • 打赏
  • 举报
回复
new Thread本身就是个对象吧
valid25f 2013-08-05
  • 打赏
  • 举报
回复
你这没有循环 程序一下不就停了 哪来这个图?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧