10
回答
java内存分析疑虑,求大牛透过现象看本质
终于搞明白,存储TCO原来是这样算的>>>   

先说一下现象

公司服务器A,4G物理内存,2G SWAP 空间,跑了10个tomcat,一个月前一直运行稳定(swap空闲空间一直稳定在500M以上),突然从上个月初开始,swap持续缓慢下降,期间各个tomcat中没有任何内存溢出的错误。

top 按物理内存排序如下:

不知道哪位大牛可否能从这些信息中给我分析分析。帮忙解答几个问题:

1、是否存在内存泄露?

2、除了增加内存或者移除部分tomcat外是否还有其他方法能解决swap持续下降?

注明:

1、物理内存占用200M以上的tomcat都设置了如下参数(其它tomcat 没进行设置):

-Xms512m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=64m -XX:SurvivorRatio=10 -XX:MaxPermSize=300m

2、近2个月服务器只改动过2个项目,此2项目物理内存占用都不大,而且项目升级早在swap开始下降时间之前好几周。

3、进1个月整个系统业务量没有增加。

 

以下是我采用jdk自带的工具进行的一些分析,结果如图。

对排名前三采用jdk自带的jstat进行分析,结果如下:

 

另外通过jmap+mat对 物理内存占用最大的2个(13400和19957)进行分析如下:

13400:

 

19957:

 

 

 

 

 

 

 

 

 

<无标签>
举报
somecold
发帖于4年前 10回/549阅
共有10个答案 最后回答: 4年前

你的内存过小, Full GC发生的过频繁. 2s中Full Gc发生了2437-2342, GC的时候程序是暂停状态的. 因此你的程序发生了大量的停顿.

让你看一下我的程序, 连续开了一个月以上了没听过. Full GC也很少.

$ jstat -gcutil 18387 2000 5

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 66.54   0.00  43.69  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827

你需要用专业的工具查看一下为什么发生GC,然后把对应的内存提高一点. 

你的ParmSize=300M开的太大了.

不过你4G内存开10Tomcat我还没见过.  

13430这个打印下GC日志,FullGC的次数那么多,顺便说下这个应用你多久没重启过了
--- 共有 1 条评论 ---
somecold最近一个月有重启过好几次,每次重启后1天左右物理内存就吃到600多M,然后就一直保持这个数值。 另外这个项目最近一个月没用改动过,而且到现在项目一直是可用的。 4年前 回复

先说一下启动的参数:

-Xms512m -Xmx512m -XX:MaxPermSize=300m

-Xmx 是jvm最大内存

-Xms 是jvm启动初始化的内存使用

你的物理内存只有4G, 启动了10个tomcat。每个512M这个算起来已经超过物理内存了。 

况且jvm还有parmsize,虚拟机栈内存,系统还要占用600M的内存。 你的物理内存远远不够的。

你说的没有内存溢出你能确定? 到每个tomcat下轮流看一下, 有没有溢出的日志文件?

--- 共有 1 条评论 ---
somecold我又挨个检查一遍,没有发现任何溢出相关日志 检查命令: grep 'ERROR' catalina.out 和 grep 'OutOf' catalina.out 4年前 回复
一开始就错了,JVM参数设置的不对头。Perm也不用那么大
--- 共有 1 条评论 ---
somecold参数设置是可以再调调, 我现在的疑问之前这样设置一直是好的,为什么最近一个月出问题了 我现在想找出问题的触发点 4年前 回复

引用来自“震秦”的答案

你用这样的参数我看一下(每隔2s打印一次,共打印10次):

jstat -gcutil pid 2000 10

没办法执行jstat -gcutil pid 2000 10 ,好像jstat命令要求目标文件放在/tmp目录下,而我的不在。
我贴一下昨天晚上和今天早上2次的jstat结果
 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
 77.79   0.00  98.12  43.71  99.47 121954 1363.340  2342  835.494 2198.834
  0.00  48.53  45.96  20.77  99.39 126128 1406.353  2437  867.789 2274.142
java和交换分区关系不大,这类问题弄个p3机器一跑就立刻知道问题在哪里了。老爷机对性能非常敏感。

引用来自“震秦”的答案

你的内存过小, Full GC发生的过频繁. 2s中Full Gc发生了2437-2342, GC的时候程序是暂停状态的. 因此你的程序发生了大量的停顿.

让你看一下我的程序, 连续开了一个月以上了没听过. Full GC也很少.

$ jstat -gcutil 18387 2000 5

  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
 66.54   0.00  43.69  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827
 66.54   0.00  43.70  38.88  15.94   2364   21.141   621  110.687  131.827

你需要用专业的工具查看一下为什么发生GC,然后把对应的内存提高一点. 

你的ParmSize=300M开的太大了.

不过你4G内存开10Tomcat我还没见过.  

4G开10个tomcat 这个环境我们一直跑了好几年,因为基本都是后台管理系统相对来说业务量不大且稳定

gc有什么专业工具分析呢?

我在jvm参数中将gc日志输出但是我看不明白,望指点!gc日志如下图:

 

 

顶部