linux tomcat内存泄露,liunx下TOMCAT查找内存泄漏

1、JSTACK 排除CPU占用过高的线程

查找TOMCAT的进程ID

ps aux | grep tomcat

top -H -p pid

ps -mp pid -o THREAD,tid,time

//转化TID为16进制

printf "%x\n" tid

jstack pid | grep tid -A 30

一般配置JVM启动参数,让JVM在遇到OutOfMemoryError时自动生成Dump文件

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path

2、jmap -histo pid 展示class的内存情况

说明:instances(实例数)、bytes(大小)、classs name(类名)。它基本是按照使用使用大小逆序排列的。

785a11125f7c37841a1e7dfa838e8548.png

#instance 是对象的实例个数

#bytes 是总占用的字节数

class name 对应的就是 Class 文件里的 class 的标识

B 代表 byte

C 代表 char

D 代表 double

F 代表 float

I 代表 int

J 代表 long

Z 代表 boolean

前边有 [ 代表数组, [I 就相当于 int[]

对象用 [L+ 类名表示

第一步:导出堆

#jmap -dump:live,file=a.log pid

除了使用jmap命令,还可以通过以下方式:

1、使用 jconsole 选项通过 HotSpotDiagnosticMXBean 从运行时获得堆转储(生成dump文件)、

2、虚拟机启动时如果指定了 -XX:+HeapDumpOnOutOfMemoryError 选项, 则在抛出 OutOfMemoryError 时, 会自动执行堆转储。

3、使用 hprof 命令

第二步:分析堆文件,推荐用其他工具加载,例如:visualvm

#jhat -J-Xmx512M a1.log

说明:有时dump出来的堆很大,在启动时会报堆空间不足的错误,可加参数:jhat -J-Xmx512m 。这个内存大小可根据自己电脑进行设置。

解析Java堆转储文件,并启动一个 web server

第三步:查看html

http://ip:7000/

第四步,jmap -heap pid

using parallel threads in the new generation.  ##新生代采用的是并行线程处理方式

using thread-local object allocation.

Concurrent Mark-Sweep GC   ##同步并行垃圾回收

Heap Configuration:  ##堆配置情况

MinHeapFreeRatio = 40 ##最小堆使用比例

MaxHeapFreeRatio = 70 ##最大堆可用比例

MaxHeapSize      = 2147483648 (2048.0MB) ##最大堆空间大小

NewSize          = 268435456 (256.0MB) ##新生代分配大小

MaxNewSize       = 268435456 (256.0MB) ##最大可新生代分配大小

OldSize          = 5439488 (5.1875MB) ##老生代大小

NewRatio         = 2  ##新生代比例

SurvivorRatio    = 8 ##新生代与suvivor的比例

PermSize         = 134217728 (128.0MB) ##perm区大小

MaxPermSize      = 134217728 (128.0MB) ##最大可分配perm区大小

Heap Usage: ##堆使用情况

New Generation (Eden + 1 Survivor Space):  ##新生代(伊甸区 + survior空间)

capacity = 241631232 (230.4375MB)  ##伊甸区容量

used     = 77776272 (74.17323303222656MB) ##已经使用大小

free     = 163854960 (156.26426696777344MB) ##剩余容量

32.188004570534986% used ##使用比例

Eden Space:  ##伊甸区

capacity = 214827008 (204.875MB) ##伊甸区容量

used     = 74442288 (70.99369812011719MB) ##伊甸区使用

free     = 140384720 (133.8813018798828MB) ##伊甸区当前剩余容量

34.65220164496263% used ##伊甸区使用情况

From Space: ##survior1区

capacity = 26804224 (25.5625MB) ##survior1区容量

used     = 3333984 (3.179534912109375MB) ##surviror1区已使用情况

free     = 23470240 (22.382965087890625MB) ##surviror1区剩余容量

12.43827838477995% used ##survior1区使用比例

To Space: ##survior2 区

capacity = 26804224 (25.5625MB) ##survior2区容量

used     = 0 (0.0MB) ##survior2区已使用情况

free     = 26804224 (25.5625MB) ##survior2区剩余容量

0.0% used ## survior2区使用比例

concurrent mark-sweep generation: ##老生代使用情况

capacity = 1879048192 (1792.0MB) ##老生代容量

used     = 30847928 (29.41887664794922MB) ##老生代已使用容量

free     = 1848200264 (1762.5811233520508MB) ##老生代剩余容量

1.6416783843721663% used ##老生代使用比例

Perm Generation: ##perm区使用情况

capacity = 134217728 (128.0MB) ##perm区容量

used     = 47303016 (45.111671447753906MB) ##perm区已使用容量

free     = 86914712 (82.8883285522461MB) ##perm区剩余容量

35.24349331855774% used ##perm区使用比例

3、jstat 命令

jstat -gc pid 1000 或者 jstat -gc pid 1000 > out.txt: 每隔1000号码打印一次或导出 GC 的状态。

S0C S0U:Survivor 0区的大小及使用情况

S1C S1U:Survivor 1区的大小及使用情况

EC EU:Eden 区的大小及使用情况

OC OU:Old 区的大小及使用情况

PC PU:Perm 区的大小及使用情况(Java 8 中取消)

MC MU:Metaspace 区的大小及使用情况(Java 8 中用户替代 Perm 区)

YGC YGCT:Young Generation Minor GC 的数目及时间(单位秒)

FGC FGCT:Old Generation Full GC 的数目及时间(单位秒)

GCT:GC 总时间 = YGCT + FGCT(单位秒)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值