[讨论] 请教一个奇怪的现象,持久带已经满了,但是年轻带却是空的,jstack连不上

michael9527 2012-04-25
如题,一个jvm进程跑了cpu占到100%了,jstack连不上,jstat说没有这个进程(实际上是有的)。
然后jmap看了一下内存信息,
Heap Usage:
PS Young Generation
Eden Space:
   capacity = 89063424 (84.9375MB)
   used     = 0 (0.0MB)
   free     = 89063424 (84.9375MB)
   0.0% used
From Space:
   capacity = 196608 (0.1875MB)
   used     = 0 (0.0MB)
   free     = 196608 (0.1875MB)
   0.0% used
To Space:
   capacity = 196608 (0.1875MB)
   used     = 0 (0.0MB)
   free     = 196608 (0.1875MB)
   0.0% used
PS Old Generation
   capacity = 178978816 (170.6875MB)
   used     = 16274376 (15.520454406738281MB)
   free     = 162704440 (155.16704559326172MB)
   9.092906280037074% used
PS Perm Generation
   capacity = 85983232 (82.0MB)
   used     = 85983224 (81.99999237060547MB)
   free     = 8 (7.62939453125E-6MB)
   99.99999069586033% used



持久带居然到99.99%了,但是伊甸区,from,to却是空的?
最后强制dump了一下内存信息,不知道是不是跟动态字节码生成有关,MAT分析结果给出的是字节码增强占用内存比较多。这个应用的持久带设置的比较小,是82M。

另外为何jstack都连不上? -F 只能显示出一些死掉的线程
RednaxelaFX 2012-05-02
因为PermGen跟Young/Old的空满程度没任何关系。

一般,普通Java对象从eden分配出来之后,如果存活时间够长最终会晋升到OldGen。但这些对象无论如何都不会晋升到PermGen去。

另外full GC后的理想状况就是整个YoungGen都是空的。你看到的情况完全符合理想情况。

CPU占用率很高的话你可以试试用pstack <pid>连上去看看能不能连,可以的话你会看到这个进程的native stack状况。如果好几个线程都在做GC的话那卡住的原因多半就是连续的GC的。这也符合你这里遇到的现象。
gdwenjun 2012-05-03
看不懂,悲剧啊
ol_beta 2012-05-03
RednaxelaFX 写道
因为PermGen跟Young/Old的空满程度没任何关系。

一般,普通Java对象从eden分配出来之后,如果存活时间够长最终会晋升到OldGen。但这些对象无论如何都不会晋升到PermGen去。

另外full GC后的理想状况就是整个YoungGen都是空的。你看到的情况完全符合理想情况。

CPU占用率很高的话你可以试试用pstack <pid>连上去看看能不能连,可以的话你会看到这个进程的native stack状况。如果好几个线程都在做GC的话那卡住的原因多半就是连续的GC的。这也符合你这里遇到的现象。

不知道你的jvm参数是啥?
PermGen满的时候,也引发full gc。所以eden可能出现 0% used的情况。
同意RednaxelaFX,CPU% 很有可能是在不停的full gc。
xiaoyu 2012-05-04
ol_beta 写道
RednaxelaFX 写道
因为PermGen跟Young/Old的空满程度没任何关系。

一般,普通Java对象从eden分配出来之后,如果存活时间够长最终会晋升到OldGen。但这些对象无论如何都不会晋升到PermGen去。

另外full GC后的理想状况就是整个YoungGen都是空的。你看到的情况完全符合理想情况。

CPU占用率很高的话你可以试试用pstack <pid>连上去看看能不能连,可以的话你会看到这个进程的native stack状况。如果好几个线程都在做GC的话那卡住的原因多半就是连续的GC的。这也符合你这里遇到的现象。

不知道你的jvm参数是啥?
PermGen满的时候,也引发full gc。所以eden可能出现 0% used的情况。
同意RednaxelaFX,CPU% 很有可能是在不停的full gc。


Eden 区和 Perm 区是2个地方. 所以0%情况不出奇.
michael9527 2012-05-04
如果是因为jvm在不停的full gc,那么连续的full gc(比如相当于一个死循环,不停的gc),那么这样的情况会导致外部连接无法触发?也就是full gc的那一瞬间是相当于JVM无法接受外部响应的?

gc配置的是UseParallelGC 和  UseParNewGC 。
堆内存配置最大是256,其余都是默认值。
RednaxelaFX 2012-05-04
michael9527 写道
如果是因为jvm在不停的full gc,那么连续的full gc(比如相当于一个死循环,不停的gc),那么这样的情况会导致外部连接无法触发?也就是full gc的那一瞬间是相当于JVM无法接受外部响应的?

连续full GC的时候JVM会表现得像是死了一样,不要说应用对外提供的连接无法正常工作,连jmap、jstack之类的工具的普通模式也无法连接。

michael9527 写道
gc配置的是UseParallelGC 和  UseParNewGC 。
堆内存配置最大是256,其余都是默认值。

UseParallelGC 与 UseParNewGC 是互斥的。你用的是前者。Full GC是否会使VM失去响应这个问题,对HotSpot VM里无论哪个GC算法都一样。
michael9527 2012-05-07
jstat查看了一下jvm进程,
jstat -gcutil 20977 5000 20
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 50.00   0.00  60.30  49.23  60.58 502784  189.958  4605  146.890  336.848
 75.00   0.00  84.77  55.31  60.58 502792  189.961  4605  146.890  336.851
  0.00  75.00  18.48  61.91  60.58 502801  189.965  4605  146.890  336.855
  0.00  33.33  61.70  67.09  60.58 502809  189.968  4605  146.890  336.858
  0.00  58.33  86.37  72.09  60.58 502817  189.971  4605  146.890  336.861
 58.33   0.00  14.69  79.23  60.58 502826  189.975  4605  146.890  336.865
 58.33   0.00  38.46  85.13  60.58 502834  189.978  4605  146.890  336.868
 28.57   0.00  16.93  90.66  60.58 502842  189.981  4605  146.890  336.871
 58.33   0.00  58.58  95.66  60.58 502850  189.984  4605  146.890  336.874
  0.00  75.00   1.51  43.76  60.58 502859  189.988  4606  146.920  336.908
  0.00  83.33  25.93  48.59  60.58 502867  189.990  4606  146.920  336.911
  0.00  91.67  52.64  54.30  60.58 502875  189.993  4606  146.920  336.914
  0.00  58.33  76.60  59.66  60.58 502883  189.996  4606  146.920  336.917
 75.00   0.00   3.75  65.19  60.58 502892  190.000  4606  146.920  336.920
 58.33   0.00  38.98  71.26  60.58 502900  190.003  4606  146.920  336.923
  0.00  58.33  91.53  76.26  60.58 502907  190.006  4606  146.920  336.926
 75.00   0.00  19.60  82.34  60.58 502916  190.009  4606  146.920  336.930
 50.00   0.00  44.50  87.87  60.58 502924  190.013  4606  146.920  336.933
 64.29   0.00  72.00  93.05  60.58 502932  190.016  4606  146.920  336.936
 50.00   0.00  97.48  98.05  60.58 502940  190.020  4606  146.920  336.940


full gc次数非常多,不过jstack连这个进程依然是连不上。
gc可能是不到1分钟就会出现一次,不过jstat可以连上,说明在那个瞬间是没有full gc的,但是我不停的用jstack尝试连接都连不上。
RednaxelaFX 2012-05-07
不是,jstat是通过共享文件的方式获取数据的,所以就算目标的Java进程卡死了它也能工作,就算获取的数据不是最新的。其它一些工具依赖着JVM内部执行一些代码,如果JVM卡住就啥也做不了了。
lmdxr 2012-05-07

我觉得楼主给的信息过少了,某个java进程跑了100;是什么操作系统?如果是linux,可以敲一下如下命令:ps -eLo user,pid,lwp,nlwp,%cpu,%mem,comm | grep PID > 保存路径。

这样查看一下哪个进程占用cpu资源较多,或者通过其他方式看看系统哪些不正常?

Global site tag (gtag.js) - Google Analytics