Java通过jvm自己管理内存,同时Java提供了一些命令行工具,用于查看内存使用情况。
这里主要介绍一下jstat、jmap命令以及相关工具。

一、jstat查看 gc实时执行情况
jstat命令命令格式:
jstat [Options] vmid [interval] [count]
 
命令参数说明:
Options,一般使用 -gcutil 或  -gc 查看gc 情况
pid,当前运行的 java进程号 
interval,间隔时间,单位为秒或者毫秒 
count,打印次数,如果缺省则打印无数次
 
Options 参数如下:
-gc:统计 jdk gc时 heap信息,以使用空间字节数表示
-gcutil:统计 gc时, heap情况,以使用空间的百分比表示
-class:统计 class loader行为信息
-compile:统计编译行为信息
-gccapacity:统计不同 generations(新生代,老年代,持久代)的 heap容量情况
-gccause:统计引起 gc的事件
-gcnew:统计 gc时,新生代的情况
-gcnewcapacity:统计 gc时,新生代 heap容量
-gcold:统计 gc时,老年代的情况
-gcoldcapacity:统计 gc时,老年代 heap容量
-gcpermcapacity:统计 gc时, permanent区 heap容量
 
示例 
  $ jstat -gc 12538 5000
每5 秒一次显示进程号为 12538的 java进成的 GC情况,结果如下图:
 
 
结果说明
标志
说明
S0C
年轻代中第一个survivor区的容量 (字节)
S1C
年轻代中第二个survivor区的容量 (字节)
S0U
年轻代中第一个survivor区目前已使用空间 (字节)
S1U
年轻代中第二个survivor区目前已使用空间 (字节)
EC
年轻代中Eden的容量 (字节)
EU
年轻代中Eden目前已使用空间 (字节)
OC
Old代的容量 (字节)
OU
Old代目前已使用空间 (字节)
PC
Perm(持久代)的容量 (字节)
PU
Perm(持久代)目前已使用空间 (字节)
YGC
从应用程序启动到采样时年轻代中gc次数
YGCT
从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
从应用程序启动到采样时old代(全gc)gc次数
FGCT
从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
从应用程序启动到采样时gc用的总时间(s)
NGCMN
年轻代(young)中初始化(最小)的大小 (字节)
NGCMX
年轻代(young)的最大容量 (字节)
NGC
年轻代(young)中当前的容量 (字节)
OGCMN
old代中初始化(最小)的大小 (字节)
OGCMX
old代的最大容量 (字节)
OGC
old代当前新生成的容量 (字节)
PGCMN
perm代中初始化(最小)的大小 (字节)
PGCMX
perm代的最大容量 (字节)  
PGC
perm代当前新生成的容量 (字节)
S0
年轻代中第一个survivor区已使用的占当前容量百分比
S1
年轻代中第二个survivor区已使用的占当前容量百分比
E
年轻代中Eden已使用的占当前容量百分比
O
old代已使用的占当前容量百分比
P
perm代已使用的占当前容量百分比
S0CMX
年轻代中第一个survivor区的最大容量 (字节)
S1CMX
年轻代中第二个survivor区的最大容量 (字节)
ECMX
年轻代中Eden的最大容量 (字节)
DSS
当前需要survivor区的容量 (字节)(Eden区已满)
TT
持有次数限制
MTT
最大持有次数限制
 
 
jstatd 启动jvm 监控服务
它是一个基于 rmi的应用,向远程机器提供本机 jvm应用程序的信息。默认端口 1099。
  $ jstatd -J-Djava.security.policy=my.policy
 
my.policy文件需要自己建立,是安全策略文件,因为 jdk对 jvm做了 jaas的安全检测,所以我们必须设置一些策略,使 jstatd被允许作网络操作,内容如下:
grant codebase " file:$JAVA_HOME/lib/tools.jar " {

    permission java.security.AllPermission;
};
 
 
二、jmap查看各个代的内存使用
jmap 可以从 core文件或进程中获得内存的具体匹配情况,包括 Heap size, Perm size等等。
 
jmap命令格式:
     jmap [ option ] <pid> | <executable core> | <[server-id@]remote-hostname-or-IP>
 
1)参数说明  
pid:java进程 id
executable:产生 core dump的 java可执行程序
core:core dump文件
remote-hostname-or-IP:远程 debug服务的主机名或 ip
server-id:远程 debug服务的 id 
 
2) option参数:
-heap 
打印heap的概要信息,GC 使用的算法,heap的配置及使用情况 .
 
-histo[:live] 
打印jvm heap 的直方图。输出类名、每个类的实例数目、对象占用大小。 VM的内部类名字开头会加上前缀 ”*”. 
如果加上live 则只统计活的对象数量。
 
-dump:[live,]format=b,file=<filename> 
使用hprof二进制形式,导出heap 内容到文件filename。
假如指定live 选项,那么只输出活的对象到文件 . 
 
-finalizerinfo 
打印正等候回收的对象的信息 .
 
-permstat 
打印classload 和jvm heap 持久代的信息。
包含每个classloader 的名字、是否存活、地址、父 classloade、加载的 class数量、内部 String的数量和占用内存数。
 
-F
当pid没有响应的时候,与-dump或者 -histo共同使用,强制生成 dump文件或 histo信息 . 在这个模式下 ,live子参数无效 . 
 
-J
传递参数给启动jmap 的jvm.
64位机上使用需要使用如下方式: jmap -J-d64 -heap pid
 
使用  jmap -heap pid ,可以查看各个代的内存使用情况。
$ jmap -heap 2083
  可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
 
$ jmap -dump:format=b,file=heapdump.hprof <pid>
  导出heap dump到文件heapdump.hprof
 
$ jmap -histo 2083 | jmap -histo:live 2083
   可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
 
jmap输出的 class name结果中:
[C is a char[]
[S is a short[]
[I is a int[]
[B is a byte[]
[[I is a int[][]
 
 
heap输出实例
$ jmap -heap 12264
JVM version is 25.65-b01

using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC

Heap Configuration:
   MinHeapFreeRatio         = 40
   MaxHeapFreeRatio         = 70
   MaxHeapSize              = 8388608000 (8000.0MB)
   NewSize                  = 2006515712 (1913.5625MB)
   MaxNewSize               = 2006515712 (1913.5625MB)
   OldSize                  = 90636288 (86.4375MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 1805910016 (1722.25MB)
   used     = 788045040 (751.5383148193359MB)
   free     = 1017864976 (970.7116851806641MB)
   43.637004779755316% used
Eden Space:
   capacity = 1605304320 (1530.9375MB)
   used     = 630378472 (601.1757583618164MB)
   free     = 974925848 (929.7617416381836MB)
   39.26847166274367% used
From Space:
   capacity = 200605696 (191.3125MB)
   used     = 157666568 (150.36255645751953MB)
   free     = 42939128 (40.94994354248047MB)
   78.59525982751757% used
To Space:
   capacity = 200605696 (191.3125MB)
   used     = 0 (0.0MB)
   free     = 200605696 (191.3125MB)
   0.0% used
concurrent mark-sweep generation:
   capacity = 6382092288 (6086.4375MB)
   used     = 4612472232 (4398.79630279541MB)
   free     = 1769620056 (1687.6411972045898MB)
   72.27210174745753% used

18841 interned Strings occupying 1633048 bytes.

 
 
jmap 相关工具
  jmap dump生成的 heap dump文件,可以使用 IBM HeapAnalyzer分析工具分析
  下载:
 
  运行:java –Xmx800m –jar ha456.jar
 
 
三、jstack和 jinfo分析java core文件
jstack工具可以用来获得 core文件的 java stack和 native stack的信息,从而可以知道 java程序是如何崩溃和在程序何处发生问题。
另外,jstack 工具还可以附属到正在运行的 java程序中,看到 java程序的 java stack和native stack 的信息,如果现在运行的 java程序呈现 hung的状态, jstack是非常有用的。
命令格式:$ jstack pid
 
jinfo可以从 core文件里面知道崩溃的 Java应用程序的配置信息。
命令额格式:$ jinfo pid

Java内存使用情况查看工具的更多相关文章

  1. Windows查看Java内存使用情况

    Windows查看Java程序运行时内存使用情况 1.在cmd命令窗口输入 jconsole  ,弹出Java监视和管理控制台窗口 2.连接本地进程,首先需要知道想查看的进程ID ( pid ) 在c ...

  2. 如何在eclipse dump Java内存占用情况和打印GC LOG

     当使用java开发应用程序发生内存泄露的时候,经常会需要dump内存,然后使用内存分析工具,比如Eclipse Memory Analyzer(一般称作MAT)工具. 本文将介绍如何在eclipse ...

  3. python的__slots__节约内存的魔法;检查python每一行代码内存占用情况的工具

    在Python中,每个类都有实例属性.默认情况下Python用一个字典来保存一个对象的实例属性.这非常有用,因为它允许我们在运行时去设置任意的新属性. 然而,对于有着已知属性的小类来说,它可能是个瓶颈 ...

  4. 【转】Linux下进程/程序网络带宽占用情况查看工具 -- NetHogs

    http://www.cnblogs.com/carbon3/p/5930803.html 之前VPS侦探曾经介绍过流量带宽相关的工具如:iftop.vnstat,这几个都是统计和监控网卡流量的.但是 ...

  5. Linux下进程/程序网络带宽占用情况查看工具 -- NetHogs

    http://www.vpser.net/manage/nethogs.html   来自.  最后略有修改 之前VPS侦探曾经介绍过流量带宽相关的工具如:iftop.vnstat,这几个都是统计和监 ...

  6. Java逆向之UML查看工具(检索记录)

    花了几个钟头时间,搜索了一下,如何从源代码得到UML,因为WCI(Writing Compilers and Interpreters,下同)越往后代码越多,必须得借助工具才能把握整个工程了.初次涉猎 ...

  7. java内存溢出分析工具:jmap使用实战

    在一次解决系统tomcat老是内存撑到头,然后崩溃的问题时,使用到了jmap. 1 使用命令 在环境是linux+jdk1.5以上,这个工具是自带的,路径在JDK_HOME/bin/下 jmap -h ...

  8. 【GC概述以及查看堆内存使用】Java内存管理和GC学习

    内存划分 1.JAVA内存主要划分为方法栈.方法区.堆. 2.方法栈上内存会自动释放: 3.方法区上主要加载了类的元信息.静态变量.常量.改区域又称为持久代(Perm Gen),默认是最小16M,最大 ...

  9. Java内存泄露监控工具:JVM监控工具介绍【转】

    jstack?-- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程 ...

随机推荐

  1. springmvc的json数据交互

    准备 @RequestBody 作用: @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json ...

  2. ZOJ 3769 Diablo III

    描述 Diablo III is an action role-playing video game. A few days ago, Reaper of Souls (ROS), the new e ...

  3. jdk 自动化脚本

    添加没有登录权限 需要理解linux用户,首先登陆的是root用户,拥有所有的权限,但是该权限太大,一般都会分配其他用户使用,并且在部署程序时,需要分配一个没有登录权限的用户,这样改程序不能随意被修改 ...

  4. 登录mysql 报 Access denied for user 'root'@'localhost' 错误

    安装mysql后登录提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:yes) 解决如下 ...

  5. [PY3]——根据某个特定的字段来分组迭代访问一个字段或序列?/ itertools.groupby( )函数

    问题 你有一个字典或者实例的序列,然后你想根据某个特定的字段(比如‘date’)来分组迭代访问. 解决方案 itertools.groupby( )函数 itertools.groupby(rows, ...

  6. SQL update 多表连接方法

    SQL Update多表联合更新的方法 () sqlite 多表更新方法 //---------------------------------- update t1 set col1=t2.col1 ...

  7. JavaScript(JS)计算某年某月的天数(月末)

    方法1 /** * 获取某年月的天数 * @param year 年 * @param month 月(0-11) * @returns {number} 天数 */ var getDaysOfMon ...

  8. git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解

    由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...

  9. Html5本地存储+本地数据库+离线存储

    首先介绍什么叫存储: cache:通常把它叫做缓存,功能就是把从DB,或者磁盘拿出来的东西放在缓存里面,这样的话可以减少读取磁盘的IO. 磁盘文件:通常把一些图片或者一些视频都存放在磁盘上. 数据库: ...

  10. 老生常谈:++a与a--区别

    a++的作用是先对a进行操作再++:a--则相反. 如: int a = 1;int b = a++; //此时先运算b=a,再a++,故b=1,a=2int c = --a; //此时先--a,再运 ...