查看程序占用tomcat内存情况

近期,公司线上tomcat常常无缘无辜宕机。总结了一下定位问题的方法,仅供參考:

报错信息:

Maximum number of threads (200) created for connector with address null and port 9443
# There is insufficient memory for the Java Runtime Environment to continue.
# Cannot create GC thread. Out of system resources.

一、查看当前用户线程和文件句柄数是否超出限制

(1)显示当前用户进程限制:ulimit -a

显示结果:

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 256612
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 1024
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

(2)改动全部 linux 用户的环境变量文件:

vi /etc/profile
ulimit -u 10000
ulimit -n 4096

保存后执行#source /etc/profile 使其生效

二、查看当前port号进程信息和GC使用情况

(1)显示port的PID:lsof -i:port

演示样例:lsof -i:7074

COMMAND  PID   USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    3195  ligang  34u  IPv4   37416693  0t0    TCP *:7074 (LISTEN)

(2)gc信息统计:jstat -gcutil PID

演示样例:jstat -gcutil 3195

 S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
12.63   0.00  52.03  78.63  99.13   4148   24.274   200   40.246   64.520

(3)输出线程数:ps -mp PID -o THREAD,tid,time | wc -l

演示样例:ps -mp 3195 -o THREAD,tid,time | wc -l

43

三、查看进程内存使用情况及定位到相应程序

(1)内存使用情况:top -p PID

演示样例:top 3195

top - 15:29:27 up 25 days, 20:05,  2 users,  load average: 0.01, 0.05, 0.01
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.1%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8058868k total,  6821684k used,  1237184k free,   181936k buffers
Swap:  2097144k total,   492300k used,  1604844k free,  1897320k cached

PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3195 ligang    20   0 4862m 196m  10m S  0.0  2.5   7:57.48 java

(2)找到该进程后。怎样定位详细线程或代码呢,首先显示线程列表,并依照CPU占用高的线程排序:

ps -mp PID -o THREAD,tid,time | sort -rn | head -10

演示样例:ps -mp PID -o THREAD,tid,time | sort -rn | head -10

USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
ligang    0.6   -    - -         -      -     - 00:07:58
ligang    0.2  19    - futex_    -      -  3270 00:02:49
ligang    0.0  19    - inet_c    -      -  3277 00:00:00
ligang    0.0  19    - inet_c    -      -  3273 00:00:00
ligang    0.0  19    - inet_c    -      -  3271 00:00:00
ligang    0.0  19    - inet_c    -      -  3203 00:00:05
ligang    0.0  19    - futex_    -      -  7644 00:00:00
ligang    0.0  19    - futex_    -      -  3420 00:00:00
ligang    0.0  19    - futex_    -      -  3288 00:00:06

(3)将须要的线程ID转换为16进制格式:printf "%x\n" TID

演示样例:printf "%x\n" 3270

cc6

(4)最后打印线程的堆栈信息:jstack PID |grep cc6 -A 30

演示样例:

jstack 2633 |grep e18 -A 30

结果就能够看到哪段代码导致的问题...

时间: 2024-11-05 16:01:24

查看程序占用tomcat内存情况的相关文章

查看进程占用的内存情况

可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看java用户的进程内存使用情况的话可以使用如下的命令: (1)top top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器 可以直接使用top命令后,查看%MEM的内容.可以选择按进程查看或者按用户查看,如想查看tomcat用户的进程内存使用情况的话可以使用如下的命令: $ top -u tomcat 内容解释: PID:进程的ID    US

linux下查看程序占用多少内存

执行 ps auxVSZ(或VSS)列 表示,程序占用了多少虚拟内存:RSS列 表示, 程序占用了多少物理内存:虚拟内存可以不用考虑,它并不占用实际物理内存. 或执行top 命令 VIRT(或VSS)列  表示,程序占用了多少虚拟内存, 同 ps aux 中的 VSZ列:RES列 表示, 程序占用了多少物理内存, 同 ps aux 中的RSS列. 参考 http://blog.chinaunix.net/uid-20492804-id-265809.html

Windows 查看程序占用的端口

一. 查看所有进程占用的端口  在开始-运行-cmd,输入:netstat –ano可以查看所有进程 二.查看占用指定端口的程序  当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr “指定端口号” 二.查看占用指定端口的程序 当你在用tomcat发布程序时,经常会遇到端口被占用的情况,我们想知道是哪个程序或进程占用了端口,可以用该命令 netstat –ano|findstr “指定端口号”

ubuntu查看系统资源占用(内存,cpu和进程)

http://blog.csdn.net/vivian187/article/details/51476043 http://bluexp29.blog.163.com/blog/static/33858148201071534450856/ ubuntu查看系统资源占用(内存,cpu和进程) 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/11 14:32 版本:V1.0 2010-08-15 03:44:50|  分类: ubunt

Linux下查看操作系统信息、内存情况及cpu信息:cpu个数、核心数、线程数

文章转载:http://blog.snsgou.com/post-793.html 1.查看物理CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l1 2.查看逻辑CPU的个数 [[email protected] ~]# cat /proc/cpuinfo |grep "processor"|wc -l4 3.查看CPU是几核(即,核心数) [[em

由C/C++编译的程序占用的内存分类

一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈. 2.堆区(heap) : 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static):,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区

一个由C/C++编译的程序占用的内存

一个由C/C++编译的程序占用的内存分为以下几个部分  1.栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.  2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵.  3.全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的

如何获知PHP程序占用多少内存

想要知道编写的 PHP 脚本需要占用多少内存么?很简单,直接使用 PHP 查看当前分配给 PHP 脚本的内存的函数 memory_get_usage() 就可以了. 下面是使用示例:赌王娱乐城 <?php echo memory_get_usage(), '<br />'; // 313864 $tmp = str_repeat('http://www.nowamagic.net/', 4000); echo memory_get_usage(), '<br />'; //

查看 android 的使用内存 情况 和cpu 信息

一.利用Android API函数查看1.1 ActivityManager查看可用内存.ActivityManager.MemoryInfo outInfo = new ActivityManager.MemoryInfo(); am.getMemoryInfo(outInfo); outInfo.availMem即为可用空闲内存.1.2.android.os.Debug查询PSS,VSS,USS等单个进程使用内存信息MemoryInfo[] memoryInfoArray = am.getP