存档

文章标签 ‘jvm’

Tomcat内存溢出的原因

2013年3月19日 没有评论

在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况:

1.OutOfMemoryError: Java heap space

2.OutOfMemoryError: PermGen space

3.OutOfMemoryError:unable to create new native thread.

tomcat

对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms, -Xmx, -XX:PermSize, -XX:MaxPermSize),最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。

第一种:是堆溢出。

在JVM中如果98%的时间是用于GC且可用的Heap size 不足2%的时候将抛出此异常信息。没有内存泄露的情况下,调整-Xms,-Xmx参数可以解决。

-Xms:初始堆大小

-Xmx:最大堆大小

但堆的大小受下面三方面影响:

1.相关操作系统的数据模型(32-bt还是64-bit)限制;(32位系统下,一般限制在1.5G~2G;我在2003 server 系统下(物理内存:4G和6G,jdk:1.6)测试 1612M,64为操作系统对内存无限制。)

2.系统的可用虚拟内存限制;

3.系统的可用物理内存限制。

堆的大小可以使用 java -Xmx***M version 命令来测试。支持的话会出现jdk的版本号,不支持会报错。

-Xms, -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m 阅读全文…

分类: java, jvm 标签: , ,

5个不能不知的JVM参数

2013年2月28日 没有评论

1. DisableExplicitGC
我已记不清有多少次用户要求我就应用程序性能问题提供咨询了,其实只要跨代码快速运行 grep,就会发现清单 1 所示的问题 — 原始 java 性能反模式:

清单 1. System.gc();

System.gc();

显式垃圾收集是一个非常糟糕的主意 — 就像将您和一个疯狂的斗牛犬锁在一个电话亭里。尽管调用的语法是依赖实现的,但如果您的 JVM 正在运行一个分代的垃圾回收器(大多数是)System.gc(); 强迫 VM 执行一个堆的 “全部清扫”,虽然有的没有必要。全部清扫比一个常规 GC 操作要昂贵好几个数量级,这只是个简单数学问题。
您可以不把我的话放在心上 — Sun 的工程师为这个特殊的人工错误提供一个 JVM 标志; -XX:+DisableExplicitGC 标志自动将 System.gc() 调用转换成一个空操作,为您提供运行代码的机会,您自己看看 System.gc() 对于整个 JVM 执行有害还是有利。

阅读全文…

分类: jvm 标签: , , ,

JVM内存分配与回收策略

2013年2月26日 1 条评论

对象的内存分配,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。
老年代GC(Major GC / Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程)。MajorGC的速度一般会比Minor GC慢10倍以上。

下面是最普遍的内存分配规则,并通过代码去验证这些规则。下面的代码在测试时使用Client模式虚拟机运行,没有手工指定收集器组合,验证的是使用Serial / Serial Old收集器下(ParNew / Serial Old收集器组合的规则也基本一致)的内存分配和回收的策略。

虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前内存各区域的分配情况。在实际应用中,内存回收日志一般是打印到文件后通过日志工具进行分析,不过本实验的日志并不多,直接阅读就能看得很清楚。

1. 对象优先在Eden分配

执行testAllocation()中分配allocation4对象的语句时会发生一次Minor GC,这次GC的结果是新生代6651KB变为148KB,而总内存占用量则几乎没有减少(因为allocation1、2、3三个对象都是存活的,虚拟机几乎没有找到可回收的对象)。这次GC发生的原因是给allocation4分配内存的时候,发现Eden已经被占用了6MB,剩余空间已不足以分配allocation4所需的4MB内存,因此发生Minor GC。GC期间虚拟机又发现已有的3个2MB大小的对象全部无法放入Survivor空间(Survivor空间只有1MB大小),所以只好通过分配担保机制提前转移到老年代去。这次GC结束后,4MB的allocation4对象被顺利分配在Eden中。因此程序执行完的结果是Eden占用4MB(被allocation4占用),Survivor空闲,老年代被占用6MB(被allocation1、2、3占用)。

阅读全文…

分类: jvm 标签: ,

JVM垃圾收集器

2013年2月23日 没有评论

垃圾收集器就是收集算法的具体实现,不同的虚拟机会提供不同的垃圾收集器。并且提供参数供用户根据自己的应用特点和要求组合各个年代所使用的收集器。本文讨论的收集器基于Sun Hotspot虚拟机1.6版。 下图中展示了jdk1.6中提供的6种作用于不同年代的收集器,两个收集器之间存在连线的话就说明它们可以搭配使用。没有最好的收集器,也没有万能的收集器,只有最合适的收集器。从Serial收集器到Parallel收集器,再到CMS收集器, G1收集器,用户线程的停顿时间在不断缩短,但是仍然没有办法完全消除。

jvm
1. Serial收集器

单线程收集器,使用复制收集算法,收集时会暂停所有工作线程(我们将这件事情称之为Stop The World),直到收集结束,虚拟机运行在Client模式时的默认新生代收集器。 优点是:简单高效(与其他收集器的单线程相比),对于限定单个CPU的环境来说,Serial收集器没有现成交互的开销。在堆比较小的情况下,一般停顿时间很短,是可以使用这种收集器的。如下图:

 jvm_Serial

2. ParNew收集器

阅读全文…

分类: jvm 标签:

JVM垃圾收集算法

2013年2月22日 没有评论

标记-清除(Mark-Sweep)

算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象(如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,对象将会被标记)。它是最基础的收集算法,因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。如下图:

jvm_mark-sweep

复制算法(Copying)

阅读全文…

分类: jvm 标签:

JVM中对象的引用类型

2013年2月21日 没有评论
JVM中有四种引用类型:强引用、软引用、弱引用、虚引用
 
强引用(Stong Reference):是指在程序代码中普遍存在的,类似:Object obj = new Object()这类的引用,只要强引用存在,gc永远不会回收掉被引用的对象;
 
软引用(Soft Reference):用来描述一些还有用,但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围之中并进行第二次回收。如果这次回收还是没有足够的内存,才会抛出内存溢出异常;
 
弱引用(Weak Reference):用于描述非必需对象,但是强度比软引用更弱一些,被弱引用关联的对象只能生存到下一次垃圾收集发生之前。当垃圾收集器工作时,无论当前内存是否足够,都会回收弱引用关联的对象;
 
虚引用(Phantom Refenrece):对对象的生存时间无影响,无法通过虚引用来取得对象实例。它的唯一目的就是希望能在这个对象别回收时收到一个系统通知。
分类: jvm 标签:

JVM类加载的原理及实现

2013年2月20日 没有评论

一、引言

Java虚拟机(JVM)的类装载就是指将包含在类文件中的字节码装载到JVM中, 并使其成为JVM一部分的过程。JVM的类动态装载技术能够在运行时刻动态地加载或者替换系统的某些功能模块, 而不影响系统其他功能模块的正常运行。本文将分析JVM中的类装载系统,探讨JVM中类装载的原理、实现以及应用。

二、Java虚拟机的类装载实现与应用

2.1 装载过程简介

所谓加载就是寻找一个类或是一个接口的二进制形式并用该二进制形式来构造代表这个类或是这个接口的class对象的过程,其中类或接口的名称是给定了的。当然名称也可以通过计算得到,但是更常见的是通过搜索源代码经过编译器编译后所得到的二进制形式来构造。
在Java中,类装载器把一个类装入JVM中,要经过三个步骤来完成:加载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
加载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。
至于在类加载和JVM启动的过程中的具体细节和可能会抛出的错误,请参看《JVM规范》以及《深入Java虚拟机》。

2.2 加载的实现

阅读全文…

分类: jvm 标签:

JVM之heap和stack的区别

2013年2月19日 没有评论

Heap(堆)

Stack(栈)

JVM中的功能

内存数据区

内存指令区

存储数据

对象实例

基本数据类型, 指令代码,常量,对象的引用地址

1. 保存对象实例,实际上是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在stack中)。

对象实例在heap中分配好以后,需要在stack中保存一个4字节的heap内存地址,用来定位该对象实例在heap中的位置,便于找到该对象实例。

2. 基本数据类型包括byte、int、char、long、float、double、boolean和short。函数方法属于指令.

"Java 的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。"

“栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。 ”

可见,垃圾回收GC是针对堆Heap的,而栈因为本身是FILO - first in, last out. 先进后出,能够自动释放。 这样就能明白到new创建的,都是放到堆Heap!

分类: 项目管理 标签: , ,

JVM统计监控工具-jstat

2013年2月18日 没有评论

jstat概要

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

generalOption
通用命令行选项 (-help, -options, or -version)
outputOptions
若干个输出选项(output option),可以包括单个statOption,加上其他的-t, -h 或者-J选项。
vmid
虚拟机ID(Virtual machine identifier), 代表目标JVM的字符串.vimid的一般语法格式是
[protocol:][//]lvmid[@hostname[:port]/servername]
该语法和URI的语法类似. vmid可以是个数字,也可以由协议+主机名+端口等更复杂的字串组成。
interval[s|ms]
采样时间间隔,以秒或者ms为单位,缺省为毫秒,必须是个正整数。设定此参数值后,jstat会在每个采样间隔内输出结果。
count
要显示的样本个数,缺省为无穷大,即直到目标JVM进程终结或者jstat进程终结为止,值必须是个正整数。

描述

jstat命令工具用于显示JVM的性能统计数据,目标虚拟机用vmid标示。

VIRTUAL MACHINE IDENTIFIER(VMID)
语法:

[protocol:][//]lvmid[@hostname][:port][/servername]
protocol
通讯协议,如果protocol 和hostname都未指定,则采用平台自身的最优本地协议,如果protocol 未指定但是hostname指定了,则缺省协议为rmi。
lvmid
本地虚拟机标识(The local virtual machine identifier for the target JVM),是vmid唯一一个必需指定的参数值。The lvmid 常常是操作系统目标JVM的进程ID,你可以用jps命令或者ps命令来查看lvmid。
hostname
主机名或者IP地址,未指定的话默认为localhost.
port
与远程服务器通讯的缺省端口,如果hostname或者protocol都未指定的话,port也不必指定。对于缺省的rmi协议,port指的是远程主机注册的rmi端口号,缺省为1099。
servername
如果protocol指定为本地最优协议(the optimized local protocol ),则该字段可忽略,对于rmi协议,servername代表的是远程主机中RMI远程对象的名字。

参数选项
jstat命令支持两种参数,通用参数(general options)和输出参数(output options)。通用参数用于显示jstat的基本用法和版本信息,输出参数决定了输出的统计数据的格式和内容。

通用选项(GENERAL OPTIONS)
有排他性,指定通用参数的其中一个则不能指定其他参数,包括其他通用参数和输出参数选项。

-help
帮助信息
-version
版本信息
-options
显示输出选项参数列表

输出选项(OUTPUT OPTIONS)
如果不设定通用选项,则可以设定输出选项。输出选项决定了jstat命令的输出内容和格式,它可以包含单个statOption,外加其他输出命令(-h, -t 和-J).
statOption 必须放在前面。如jstat -gccapacity -t 1234

输出内容被格式化为表格的形式,第一行为每一列的列明。可以使用-h参数来指定每隔多少行显示行名,
如jstat -gcnewcapacity -h 2 31538 250 7表示显示垃圾回收新生代的容量统计,每两行显示一次列名,采样时间间隔为250ms,共采样7次。

使用-t参数显示时间戳,作为第一列输出,列名为Timestamp它表示自从目标JVM启动以来逝去的时间,以秒为单位。

使用interval 和 count 参数来决定采样的频度和时间,如上个例子所示。

注意: jstat 输出内容格式在以后的版本中可能改变,所以不建议自己写脚本来解析。

-statOption
决定jstat 显示的统计信息。
下表列出了可用的选项(同事显示英文方便查看各个缩写的含义)。可以使用 -options查看系统平台上安装了哪些选项。
Option Displays…
class class loader的行为统计。Statistics on the behavior of the class loader.
compiler HotSpt JIT编译器行为统计。Statistics of the behavior of the HotSpot Just-in-Time compiler.
gc 垃圾回收堆的行为统计。Statistics of the behavior of the garbage collected heap.
gccapacity 各个垃圾回收代容量(young,old,perm)和他们相应的空间统计。Statistics of the capacities of the generations and their corresponding spaces.
gccause 垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。Summary of garbage collection statistics (same as -gcutil), with the cause of the last and
current (if applicable) garbage collection events.
gcnew 新生代行为统计。Statistics of the behavior of the new generation.
gcnewcapacity 新生代与其相应的内存空间的统计。Statistics of the sizes of the new generations and its corresponding spaces.
gcold 年老代和永生代行为统计。Statistics of the behavior of the old and permanent generations.
gcoldcapacity 年老代行为统计。Statistics of the sizes of the old generation.
gcpermcapacity 永生代行为统计。Statistics of the sizes of the permanent generation.
gcutil 垃圾回收统计概述。Summary of garbage collection statistics.
printcompilation HotSpot编译方法统计。HotSpot compilation method statistics.
-h n
每隔n个样本 (行),n是正整数,
缺省为0,代表只有第一行为列头。
-t n
第一行输出为时间戳,
它表示自从目标JVM启动以来逝去的时间,以秒为单位。
-JjavaOption
传递javaOption到java启动参数。
比如,-J-Xms48m 设置java启动最小内存为48M。
完整得启动参数清单,请查看:
java – the Java application launcher (Solaris)
java – the Java application launcher (Linux)
java – the Java application launcher (Windows)

-class Option
类加载器统计信息。Class Loader Statistics
列名 描述
Loaded 已加载的类个数。
Bytes 已加载类占用字节数(KB为单位)。
Unloaded 卸载的类个数。
Bytes 卸载的类占用字节数(KB为单位)。
Time 加载和卸载操作花费的时间。
-compiler Option
HotSpt JIT编译器行为统计
列名 描述
Compiled 执行过的编译任务个数
Failed 编译失败次数
Invalid 失效的编译任务个数
Time 编译任务执行花费的时间
FailedType 失败的编译任务类型
FailedMethod 上次编译失败的类名和方法
-gc Option
垃圾回收统计
列名 描述
S0C 当前survivor space 0容量。Current survivor space 0 capacity (KB).
S1C survivor space 1容量。Current survivor space 1 capacity (KB).
S0U Survivor space 0 利用情况。Survivor space 0 utilization (KB).
S1U Survivor space 1 利用情况。Survivor space 1 utilization (KB).
EC 当前新生代eden空间容量。Current eden space capacity (KB).
EU 新生代eden空间利用情况。Eden space utilization (KB).
OC 当前年老代空间容量。Current old space capacity (KB).
OU 年老代利用情况。Old space utilization (KB).
PC 当前永生代空间容量。Current permanent space capacity (KB).
PU 永生代空间利用情况。Permanent space utilization (KB).
YGC 新生代GC事件次数。 Number of young generation GC Events.
YGCT 新生代GC耗时。Young generation garbage collection time.
FGC full GC次数。Number of full GC events.
FGCT full gc耗时。Full garbage collection time.
GCT 总GC耗时。Total garbage collection time.
-gccapacity Option
GC内存空间使用统计
列名 描述
NGCMN 最小新生代容量。Minimum new generation capacity (KB).
NGCMX 最大新生代容量。Maximum new generation capacity (KB).
NGC 当前新生代容量。Current new generation capacity (KB).
S0C 当前新生代survivor 0区容量。Current survivor space 0 capacity (KB).
S1C 当前新生代survivor 1区容量。Current survivor space 1 capacity (KB).
EC 当前新生代eden空间容量。Current eden space capacity (KB).
OGCMN 最小年老代容量。Minimum old generation capacity (KB).
OGCMX 最大年老代容量。Maximum old generation capacity (KB).
OGC 当前年老代容量。Current old generation capacity (KB).
OC 当前年老代空间容量。Current old space capacity (KB).
PGCMN 最小永生代容量。Minimum permanent generation capacity (KB).
PGCMX 最大永生代容量。Maximum Permanent generation capacity (KB).
PGC 当前永生代容量。Current Permanent generation capacity (KB).
PC 最小永生代空间容量。Current Permanent space capacity (KB).
YGC 新生代GC次数。Number of Young generation GC Events.
FGC Full GC次数。Number of Full GC Events.
-gccause Option
垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。
相对 -gcutil给出的统计数据, gccause新增了以下几列:

Garbage Collection Statistics, Including GC Events
列名 描述
LGCC 上次GC原因。Cause of last Garbage Collection.
GCC 本次GC原因。Cause of current Garbage Collection.
-gcnew Option
新生代统计
列名 描述
S0C 当前survivor 0区容量。Current
survivor space 0 capacity (KB).
S1C 当前survivor 1区容量。Current
survivor space 1 capacity (KB).
S0U 当前survivor 0区利用情况。
Survivor space 0 utilization (KB).
S1U 当前survivor 1区利用情况。
Survivor space 1 utilization (KB).
TT 阀值, 用于控制对象在新生代存活的次数。
Tenuring threshold.
MTT 阀值, 用于控制对象在新生代存活的最大次数。Maximum tenuring threshold.
DSS 期望存活大小。
Desired survivor size (KB).
EC 当前eden空间容量。Current eden space capacity (KB).
EU eden空间利用情况。
Eden space utilization (KB).
YGC 年轻代gc次数。Number of young generation GC events.
YGCT 年轻代GC耗时。
Young generation garbage collection time.
note: 若某个age上的survivor space对象的大小如果超过Desired survivor size,则重新计算tenuring threshold,以age和MaxTenuringThreshold的最小值为准

-gcnewcapacity Option
新生代空间统计
列名 描述
NGCMN 最小新生代容量。Minimum new generation capacity (KB).
NGCMX 最大新生代容量。Maximum new generation capacity (KB).
NGC 当前新生代容量。Current new generation capacity (KB).
S0CMX 最大survivor 0区容量。Maximum survivor space 0 capacity (KB).
S0C 当前survivor 0区容量。Current survivor space 0 capacity (KB).
S1CMX 最大survivor 1区容量。Maximum
survivor space 1 capacity (KB).
S1C 当前survivor 1区容量。Current survivor space 1 capacity (KB).
ECMX 最大eden区容量。Maximum eden space capacity (KB).
EC 当前eden区容量。Current eden space capacity (KB).
YGC young gc次数。
Number of young generation GC events.
FGC full gc次数。Number of Full GC Events.
-gcold Option
年老代和永久代统计
列名 描述
PC 当前永久代空间容量。Current permanent space capacity (KB).
PU 永久代空间利用情况。Permanent space utilization (KB).
OC 当前年老代空间容量。Current old space capacity (KB).
OU 年老代空间利用情况。
old space utilization (KB).
YGC young gc次数。
Number of young generation GC events.
FGC full gc次数。Number of full GC events.
FGCT full gc耗时。
Full garbage collection time.
GCT gc总耗时。
Total garbage collection time.
-gcoldcapacity Option
年老代统计
列名 描述
OGCMN 最小年老代容量。Minimum
old generation capacity (KB).
OGCMX 最大年老代容量。Maximum
old generation capacity (KB).
OGC 当前年老代容量。Current
old generation capacity (KB).
OC 当前年老代空间容量。Current
old space capacity (KB).
YGC young gc次数。
Number of young generation GC events.
FGC full gc次数。
Number of full GC events.
FGCT full gc耗时。Full garbage collection time.
GCT 总GC耗时。
Total garbage collection time.
-gcpermcapacity Option
永生代统计
列名 描述
PGCMN Minimum permanent generation capacity (KB).
PGCMX Maximum permanent generation capacity (KB).
PGC Current permanent generation capacity (KB).
PC Current permanent space capacity (KB).
YGC Number of young generation GC events.
FGC Number of full GC events.
FGCT Full garbage collection time.
GCT Total garbage collection time.
-gcutil Option
Summary of Garbage Collection Statistics
列名 描述
S0 survivor 0区利用率。
Survivor space 0 utilization as a percentage of
the space’s current capacity.
S1 survivor 1区利用率。
Survivor space 1 utilization as a percentage of
the space’s current capacity.
E eden区利用率。
Eden space utilization as a percentage of
the space’s current capacity.
O 年老代空间利用率。
Old space utilization as a percentage of
the space’s current capacity.
P 永生代空间利用率。Permanent space utilization as a percentage of
the space’s current capacity.
YGC young gc次数。
Number of young generation GC events.
YGCT young gc耗时。
Young generation garbage collection time.
FGC full gc次数。
Number of full GC events.
FGCT full gc耗时。
Full garbage collection time.
GCT GC总耗时。
Total garbage collection time.
-printcompilation Option
HotSpot Compiler Method Statistics
列名 描述
Compiled 执行的编译任务次数
Size Number of bytes of bytecode for the method.
Type 编译类型。Compilation type.
Method 类名和方法名。类名使用”/”代替了原命名空间符号”.”

范例

以下范例代表了针对本地JVM(lvmid 为21891)的一些统计。

gcutil 使用范例

使用-gcutil展示gc统计信息,每个250ms采样一次,共采样7次。

jstat -gcutil 21891 250 7
S0 S1 E O P YGC YGCT FGC FGCT GCT
12.44 0.00 27.20 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 62.16 9.49 96.70 78 0.176 5 0.495 0.672
12.44 0.00 83.97 9.49 96.70 78 0.176 5 0.495 0.672
0.00 7.74 0.00 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 23.37 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 43.82 9.51 96.70 79 0.177 5 0.495 0.673
0.00 7.74 58.11 9.51 96.71 79 0.177 5 0.495 0.673
该范例显示了在第三和第四样本间发生了一次新生代GC,耗时0.001秒。
本次gc将一些对象从eden区(E)移至年老代空间(O),导致年老代空间
利用率从9.49%升至9.51%。在本次gc之前,survivor区利用率为12.44%,gc
之后变为7.44%。

重复显示列名

本范例展示了利用-h3选项使-gcnew的输出内容每3行显示一次列名。

jstat -gcnew -h3 21891 250
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 0.0 31.7 31 31 32.0 512.0 178.6 249 0.203
64.0 64.0 0.0 31.7 31 31 32.0 512.0 355.5 249 0.203
64.0 64.0 35.4 0.0 2 31 32.0 512.0 21.9 250 0.204
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 35.4 0.0 2 31 32.0 512.0 245.9 250 0.204
64.0 64.0 35.4 0.0 2 31 32.0 512.0 421.1 250 0.204
64.0 64.0 0.0 19.0 31 31 32.0 512.0 84.4 251 0.204
S0C S1C S0U S1U TT MTT DSS EC EU YGC YGCT
64.0 64.0 0.0 19.0 31 31 32.0 512.0 306.7 251 0.204
该范例展示了两次gc操作,第一次young gc发生在第二个样本和第三个样本之间,
持续了0.001秒。这次gc发现了 survivor 0区使用量超过了DSS,于是将对象移到了
老生代,TT从31降到了2.

另一次gc发生在第5和第6个样本间,这次gc将TT重设回31.

包含时间戳的范例

本范例每隔250ms采样一次共采样3次。
-t 选项用于在第一列显示时间戳。

jstat -gcoldcapacity -t 21891 250 3
Timestamp OGCMN OGCMX OGC OC YGC FGC FGCT GCT
150.1 1408.0 60544.0 11696.0 11696.0 194 80 2.874 3.799
150.4 1408.0 60544.0 13820.0 13820.0 194 81 2.938 3.863
150.7 1408.0 60544.0 13820.0 13820.0 194 81 2.938 3.863
Timestamp列显示了自从目标JVM启动以来逝去的时间,以
秒为单位。另外,-gcoldcapacity 选项输出显示了年老代容量 (OGC)
和年老代空间占用一直在增长。第81次Full GC之后OGC从11696KB涨到13820KB。
年老代最大容量为60544KB,所以空间还够用。

监控远程JVM

本范例显示了使用-gcutil 选项监控了系统名字为remote.domain lvmid 为40496的JVM,
每一秒输出一次。

jstat -gcutil 40496@remote.domain 1000
… 输出略
lvmid加远程主机名称组成了vmid 40496@remote.domain。vmid采用了
rmi协议连接远程主机缺省的jstatd服务。jstatd服务使用rmiregistry注册了1099端口

分类: jvm 标签: ,

jmap、jstack、jinfo在ubuntu下不起作用的解决方法

2013年2月16日 没有评论

1、问题:用jmap查看jvm heap信息时无法连接

javaranger@ubuntu:~/Downloads$ jmap -heap 3991
Attaching to process ID 3991, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process

2、解决方法:
1)修改/etc/sysctl.d/10-ptrace.conf文件如下:
kernel.yama.ptrace_scope = 1   ==>  kernel.yama.ptrace_scope = 0 (将1改成0)
2)重启
3、结果

Attaching to process ID 1793, please wait...
Debugger attached successfully.
Client compiler detected.
JVM version is 20.0-b12
using thread-local object allocation.
Mark Sweep Compact GC
Heap Configuration:
 MinHeapFreeRatio = 40
 MaxHeapFreeRatio = 70
 MaxHeapSize = 536870912 (512.0MB)
 NewSize = 1048576 (1.0MB)
 MaxNewSize = 4294901760 (4095.9375MB)
 OldSize = 4194304 (4.0MB)
 NewRatio = 2
 SurvivorRatio = 8
 PermSize = 12582912 (12.0MB)
 MaxPermSize = 67108864 (64.0MB)
Heap Usage:
New Generation (Eden + 1 Survivor Space):
 capacity = 5046272 (4.8125MB)
 used = 2888704 (2.7548828125MB)
 free = 2157568 (2.0576171875MB)
 57.24431818181818% used
Eden Space:
 capacity = 4521984 (4.3125MB)
 used = 2707016 (2.5816116333007812MB)
 free = 1814968 (1.7308883666992188MB)
 59.863458163496375% used
From Space:
 capacity = 524288 (0.5MB)
 used = 181688 (0.17327117919921875MB)
 free = 342600 (0.32672882080078125MB)
 34.65423583984375% used
To Space:
 capacity = 524288 (0.5MB)
 used = 0 (0.0MB)
 free = 524288 (0.5MB)
 0.0% used
tenured generation:
 capacity = 11206656 (10.6875MB)
 used = 2532152 (2.4148483276367188MB)
 free = 8674504 (8.272651672363281MB)
 22.595072071454677% used
Perm Generation:
 capacity = 12582912 (12.0MB)
 used = 7467776 (7.121826171875MB)
 free = 5115136 (4.878173828125MB)
 59.348551432291664% used

4、参考http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7050524

分类: jvm 标签: , , , , ,