- 浏览: 3049357 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
上一篇:通过JMX控制在full GC前后做heap dump
想像一个Java进程在远程服务器上突然遇到频繁full GC的状况。我们只是想动态的改变HeapDumpBeforeFullGC与HeapDumpAfterFullGC参数来获取full GC前后的heap dump,并不想在侵入到Java程序内去通过代码做这个工作。这种场景里jinfo就能派上用场了——它已经把相关的JMX操作给封装好了。
(提醒:如果找不到打出来的heap dump的话,请设置HeapDumpPath。这个参数指定heap dump的目录。
-XX:HeapDumpPath=path/to/your/heap/dumps/dir)
上一篇其实已经提到了,通过jinfo -flag同样可以设置标记为manageable的VM参数。参考jinfo的帮助文档:
于是上一篇的实验可以用jinfo来做一次。
同样是在当前目录下放一个.hotspotrc文件来显示GC日志:
然后开groovysh来执行三次System.gc()。其中,第一次System.gc()之后在命令行调用下列命令:
然后在第二次System.gc()之后再调用:
那么可以观察到Groovy Shell的运行状况是:
效果是:第二次System.gc()的时候,我们得到了两份HPROF格式的heap dump,而第一次与第三次都没有。
这样就可以很方便的在遇到full GC频繁的时候获取那么一两组heap dump来分析,而不需要在VM启动的时候就指定这两个参数——那样的话dump出来的文件就多了orz
抱歉,这个也不是我的现有知识范围内能解决的…
是用来看对象数量和大小的。但你可以无视它的输出,只要它的副作用,就是做full GC。
注意只有加了:live才有效果,不加就没这效果。
这篇文章是用Groovy shell来演示一个Java进程自己触发full GC。并不是触发别的Java进程做full GC。
要触发别的进程做full GC可以通过JMX来做;当然,Groovy也是可以用JMX去跟别的Java进程连接的。其实更简单的办法是用jmap -histo:live <pid>,这就足以让目标进程做一次full GC了。
这帖说的就是具体方法了呃
你知道一台server上跑着N个Java程序的话,每个Java程序的pid你也应该知道;不知道的话可以用jps来查询。
对你要关注的进程按这贴的方式执行jinfo让目标进程在full GC前后打出heap dump,
然后离线对heap dump做对比分析(可以用MAT或类似的工具),
在收集到足够数据之后再按这帖的方式用jinfo把full GC前后打heap dump的功能关闭掉。
要注意这样heap dump只会在full GC前后打出;如果你的程序很久都不做full GC那就别用这种方式。
直接用jmap -dump来得更直接些。具体用法请善用搜索引擎。
很简单,有两个注意点:
1、你虽然在命令行参数里设置了-XX:+UseConcMarkSweepGC,但实际上GC日志里看到的却是用了ParallelScavenge(也就是-XX:+UseParallelGC,server默认GC)。这足以说明你的命令行参数根本没正确传给你看的JVM。检查一下你是如何启动Java程序的吧,或许你的启动脚本里什么东西写错了。例如我们以前见过的情况就是:
看到最后那行发生什么事了么?前面设置的JAVA_OPTS全被覆盖了。
也见过脚本写错是把变量名写错了,前面设置的是JAVA_OTPS而后面用的是JAVA_OPTS
2、jinfo -flag +HeapDumpBeforeFullGC <pid>
这句正确执行之后本来就不会在console上输出任何东西。只是开启了VM的heap dump功能就完事了。然后在发生full GC的时候你就应该在Java进程的“工作目录”(或者说“当前目录”)看到相应的heap dump文件。
+HeapDumpBeforeFullGC才是启用,减号的话是禁用。你确定你前面有用过加号来启用并且随后发生过full GC么?
至于PermGen大小不对,请把完整的启动参数贴出来看看
jvm的启动参数如下:
按照你的提示,将原来的jinfo -flag -HeapDumpBeforeFullGC 16540修改为jinfo -flag +HeapDumpBeforeFullGC 16540,得到的控制台输出还是刚才我贴出来的那段,这里,PermGen、
YoungGen、OldGen的大小都是对不上的。
至于是否确认进行了FullGC,我是使用jstat -gcutil来统计的GC次数,具体的信息如下:
这个是之前统计的50s内的GC情况。
+HeapDumpBeforeFullGC才是启用,减号的话是禁用。你确定你前面有用过加号来启用并且随后发生过full GC么?
至于PermGen大小不对,请把完整的启动参数贴出来看看
方便做实验而已。Groovy也是跑在JVM上的,用它的shell能很方便的触发System.gc()。
换用Java写的话,
想像一个Java进程在远程服务器上突然遇到频繁full GC的状况。我们只是想动态的改变HeapDumpBeforeFullGC与HeapDumpAfterFullGC参数来获取full GC前后的heap dump,并不想在侵入到Java程序内去通过代码做这个工作。这种场景里jinfo就能派上用场了——它已经把相关的JMX操作给封装好了。
(提醒:如果找不到打出来的heap dump的话,请设置HeapDumpPath。这个参数指定heap dump的目录。
-XX:HeapDumpPath=path/to/your/heap/dumps/dir)
上一篇其实已经提到了,通过jinfo -flag同样可以设置标记为manageable的VM参数。参考jinfo的帮助文档:
引用
$ jinfo -help Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: -flag <name> to print the value of the named VM flag -flag [+|-]<name> to enable or disable the named VM flag -flag <name>=<value> to set the named VM flag to the given value -flags to print VM flags -sysprops to print Java system properties <no option> to print both of the above -h | -help to print this help message
于是上一篇的实验可以用jinfo来做一次。
同样是在当前目录下放一个.hotspotrc文件来显示GC日志:
+PrintGCDetails
然后开groovysh来执行三次System.gc()。其中,第一次System.gc()之后在命令行调用下列命令:
$ jps 18711 Jps 18650 GroovyStarter $ jinfo -flag +HeapDumpBeforeFullGC 18650 $ jinfo -flag +HeapDumpAfterFullGC 18650
然后在第二次System.gc()之后再调用:
$ jinfo -flag -HeapDumpBeforeFullGC 18650 $ jinfo -flag -HeapDumpAfterFullGC 18650
那么可以观察到Groovy Shell的运行状况是:
$ groovysh [GC [PSYoungGen: 14016K->1344K(16320K)] 14016K->1344K(53696K), 0.0072690 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [GC [PSYoungGen: 15360K->2288K(30336K)] 15360K->4824K(67712K), 0.0183850 secs] [Times: user=0.03 sys=0.00, real=0.01 secs] Groovy Shell (1.7.7, JVM: 1.6.0_25) Type 'help' or '\h' for help. ---------------------------------------------------------------------------------------------------------------------------- groovy:000> System.gc() [GC [PSYoungGen: 26693K->2288K(30336K)] 29229K->8748K(67712K), 0.0262440 secs] [Times: user=0.05 sys=0.00, real=0.02 secs] [Full GC (System) [PSYoungGen: 2288K->0K(30336K)] [PSOldGen: 6460K->8725K(37376K)] 8748K->8725K(67712K) [PSPermGen: 16933K->16933K(34176K)], 0.1172670 secs] [Times: user=0.11 sys=0.01, real=0.12 secs] ===> null groovy:000> System.gc() [GC [PSYoungGen: 2932K->256K(30336K)] 11658K->8981K(67712K), 0.0017600 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Heap Dump: Dumping heap to java_pid18650.hprof ... Heap dump file created [18535501 bytes in 0.317 secs] , 0.3208840 secs][Full GC (System) [PSYoungGen: 256K->0K(30336K)] [PSOldGen: 8725K->8918K(37376K)] 8981K->8918K(67712K) [PSPermGen: 17045K->17045K(38464K)], 0.1131950 secs] [Times: user=0.11 sys=0.00, real=0.11 secs] [Heap DumpDumping heap to java_pid18650.hprof.1 ... Heap dump file created [18440786 bytes in 0.318 secs] , 0.3179790 secs]===> null groovy:000> System.gc() [GC [PSYoungGen: 1016K->160K(30336K)] 9935K->9078K(67712K), 0.0020120 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] [Full GC (System) [PSYoungGen: 160K->0K(30336K)] [PSOldGen: 8918K->9028K(37376K)] 9078K->9028K(67712K) [PSPermGen: 17077K->17077K(36928K)], 0.1111340 secs] [Times: user=0.11 sys=0.00, real=0.11 secs] ===> null groovy:000> quit Heap PSYoungGen total 30336K, used 2427K [0x00000000edc00000, 0x00000000efbe0000, 0x0000000100000000) eden space 28032K, 8% used [0x00000000edc00000,0x00000000ede5ef68,0x00000000ef760000) from space 2304K, 0% used [0x00000000ef760000,0x00000000ef760000,0x00000000ef9a0000) to space 2304K, 0% used [0x00000000ef9a0000,0x00000000ef9a0000,0x00000000efbe0000) PSOldGen total 37376K, used 9028K [0x00000000c9400000, 0x00000000cb880000, 0x00000000edc00000) object space 37376K, 24% used [0x00000000c9400000,0x00000000c9cd12b0,0x00000000cb880000) PSPermGen total 36928K, used 17142K [0x00000000c4200000, 0x00000000c6610000, 0x00000000c9400000) object space 36928K, 46% used [0x00000000c4200000,0x00000000c52bdbb0,0x00000000c6610000)
效果是:第二次System.gc()的时候,我们得到了两份HPROF格式的heap dump,而第一次与第三次都没有。
这样就可以很方便的在遇到full GC频繁的时候获取那么一两组heap dump来分析,而不需要在VM启动的时候就指定这两个参数——那样的话dump出来的文件就多了orz
评论
16 楼
Nature_night
2012-04-01
哦,最近在做即时通信的项目,偶尔会有这方面的问题,造成消息丢失。
很谢谢你的帮忙。
很谢谢你的帮忙。
15 楼
RednaxelaFX
2012-04-01
Nature_night 写道
RednaxelaFX能不能帮忙解决1个题外问题: tcp/ip中tcp重发的次数和超时时间是多少?
(我请教了很多javaeye的朋友都不知道。)
(我请教了很多javaeye的朋友都不知道。)
抱歉,这个也不是我的现有知识范围内能解决的…
14 楼
Nature_night
2012-04-01
非常感谢你细致的回答。
RednaxelaFX能不能帮忙解决1个题外问题: tcp/ip中tcp重发的次数和超时时间是多少?
(我请教了很多javaeye的朋友都不知道。)
问题如下:
TCP/IP中,发送端在发送消息时,如若对方突然拔网线后,tcp的超时重发是9分钟吗?而这一点我们在socket编程中是没法及时获取send失败的,它由tcp协议来控制重发,重发一定次数超时后才通知我们sokcet有问题吧?我查了资料都没讲清楚。
1,server发送端发送消息时, 突然对方拔掉网线。而发送端此时还连接认为是好的,发送消息到缓冲队列,然后由系统层tcp/ip把消息取走并有序的发送数据,等待tcp段的ack确认。
若接收端突然拔网线后,就没有收到ack确认,就启动tcp重发机制和超时。
现在代码里,希望能及时处理这种消息丢失情况,请问RednaxelaFX如何处理较好,谢谢。
2,我查了linux c接口,里面有send timeout选项。而java socket类没有。
并且我怀疑c接口的send timeout选项,可能是指把数据从缓存队列拷到系统层发送。
我现在使用的是mina框架
以上有错误的认识,请RednaxelaFX指明。感激不尽。
RednaxelaFX能不能帮忙解决1个题外问题: tcp/ip中tcp重发的次数和超时时间是多少?
(我请教了很多javaeye的朋友都不知道。)
问题如下:
TCP/IP中,发送端在发送消息时,如若对方突然拔网线后,tcp的超时重发是9分钟吗?而这一点我们在socket编程中是没法及时获取send失败的,它由tcp协议来控制重发,重发一定次数超时后才通知我们sokcet有问题吧?我查了资料都没讲清楚。
1,server发送端发送消息时, 突然对方拔掉网线。而发送端此时还连接认为是好的,发送消息到缓冲队列,然后由系统层tcp/ip把消息取走并有序的发送数据,等待tcp段的ack确认。
若接收端突然拔网线后,就没有收到ack确认,就启动tcp重发机制和超时。
现在代码里,希望能及时处理这种消息丢失情况,请问RednaxelaFX如何处理较好,谢谢。
2,我查了linux c接口,里面有send timeout选项。而java socket类没有。
并且我怀疑c接口的send timeout选项,可能是指把数据从缓存队列拷到系统层发送。
我现在使用的是mina框架
以上有错误的认识,请RednaxelaFX指明。感激不尽。
13 楼
RednaxelaFX
2012-04-01
Nature_night 写道
请问: jmap -histo:live <pid>
这也命令不是查看存活的对象吗, 他也会触发来执行一次full GC吗?
哇,我还不知道呢。这命令我经常在用,竟然不清楚原理。惭愧呀
这也命令不是查看存活的对象吗, 他也会触发来执行一次full GC吗?
哇,我还不知道呢。这命令我经常在用,竟然不清楚原理。惭愧呀
是用来看对象数量和大小的。但你可以无视它的输出,只要它的副作用,就是做full GC。
注意只有加了:live才有效果,不加就没这效果。
12 楼
Nature_night
2012-04-01
请问: jmap -histo:live <pid>
这也命令不是查看存活的对象吗, 他也会触发来执行一次full GC吗?
哇,我还不知道呢。这命令我经常在用,竟然不清楚原理。惭愧呀
这也命令不是查看存活的对象吗, 他也会触发来执行一次full GC吗?
哇,我还不知道呢。这命令我经常在用,竟然不清楚原理。惭愧呀
11 楼
RednaxelaFX
2012-04-01
Nature_night 写道
谢谢RednaxelaFX。
你说的方法我都明白,我是想请教在Groovy Shell里如何针对某个java程序手动调用gc()。
文章中Groovysh没有指定是对哪个java进程进行gc吧?
再次谢谢你的帮忙。
你说的方法我都明白,我是想请教在Groovy Shell里如何针对某个java程序手动调用gc()。
文章中Groovysh没有指定是对哪个java进程进行gc吧?
再次谢谢你的帮忙。
这篇文章是用Groovy shell来演示一个Java进程自己触发full GC。并不是触发别的Java进程做full GC。
要触发别的进程做full GC可以通过JMX来做;当然,Groovy也是可以用JMX去跟别的Java进程连接的。其实更简单的办法是用jmap -histo:live <pid>,这就足以让目标进程做一次full GC了。
10 楼
Nature_night
2012-04-01
谢谢RednaxelaFX。
你说的方法我都明白,我是想请教在Groovy Shell里如何针对某个java程序手动调用gc()。
文章中Groovysh没有指定是对哪个java进程进行gc吧?
再次谢谢你的帮忙。
你说的方法我都明白,我是想请教在Groovy Shell里如何针对某个java程序手动调用gc()。
文章中Groovysh没有指定是对哪个java进程进行gc吧?
再次谢谢你的帮忙。
9 楼
RednaxelaFX
2012-04-01
Nature_night 写道
请问,这个可以应用在sun的jdk程序吗?
例如,我的一台server上跑了N个java程序,我要在线不中断某个程序,然后用你的方法监控某个程序是否内存泄露,请问可行吗? 谢谢。
具体怎么做,能否告诉我方法或者给个链接。
例如,我的一台server上跑了N个java程序,我要在线不中断某个程序,然后用你的方法监控某个程序是否内存泄露,请问可行吗? 谢谢。
具体怎么做,能否告诉我方法或者给个链接。
这帖说的就是具体方法了呃
你知道一台server上跑着N个Java程序的话,每个Java程序的pid你也应该知道;不知道的话可以用jps来查询。
对你要关注的进程按这贴的方式执行jinfo让目标进程在full GC前后打出heap dump,
然后离线对heap dump做对比分析(可以用MAT或类似的工具),
在收集到足够数据之后再按这帖的方式用jinfo把full GC前后打heap dump的功能关闭掉。
要注意这样heap dump只会在full GC前后打出;如果你的程序很久都不做full GC那就别用这种方式。
直接用jmap -dump来得更直接些。具体用法请善用搜索引擎。
8 楼
Nature_night
2012-04-01
请问,这个可以应用在sun的jdk程序吗?
例如,我的一台server上跑了N个java程序,我要在线不中断某个程序,然后用你的方法监控某个程序是否内存泄露,请问可行吗? 谢谢。
具体怎么做,能否告诉我方法或者给个链接。
非常感谢,RednaxelaFX
例如,我的一台server上跑了N个java程序,我要在线不中断某个程序,然后用你的方法监控某个程序是否内存泄露,请问可行吗? 谢谢。
具体怎么做,能否告诉我方法或者给个链接。
非常感谢,RednaxelaFX
7 楼
RednaxelaFX
2011-11-04
@hittyt
哈哈,原来是你的当前目录下有.hotspotrc里配了+PrintGCDetails,使得jinfo、jps这些工具执行的时候把它们自己的GC heap layout给打印出来了。那些跟你想要的信息是没关系的。
哈哈,原来是你的当前目录下有.hotspotrc里配了+PrintGCDetails,使得jinfo、jps这些工具执行的时候把它们自己的GC heap layout给打印出来了。那些跟你想要的信息是没关系的。
6 楼
RednaxelaFX
2011-11-04
hittyt 写道
按照你的提示,将原来的jinfo -flag -HeapDumpBeforeFullGC 16540修改为jinfo -flag +HeapDumpBeforeFullGC 16540,得到的控制台输出还是刚才我贴出来的那段,这里,PermGen、
YoungGen、OldGen的大小都是对不上的。
YoungGen、OldGen的大小都是对不上的。
很简单,有两个注意点:
1、你虽然在命令行参数里设置了-XX:+UseConcMarkSweepGC,但实际上GC日志里看到的却是用了ParallelScavenge(也就是-XX:+UseParallelGC,server默认GC)。这足以说明你的命令行参数根本没正确传给你看的JVM。检查一下你是如何启动Java程序的吧,或许你的启动脚本里什么东西写错了。例如我们以前见过的情况就是:
JAVA_OPTS='-XX:+UseConcMarkSweepGC ...' JAVA_OPTS='$JAVA_OPTS -XX:PermSize=192m ...' JAVA_OPTS='...'
看到最后那行发生什么事了么?前面设置的JAVA_OPTS全被覆盖了。
也见过脚本写错是把变量名写错了,前面设置的是JAVA_OTPS而后面用的是JAVA_OPTS
2、jinfo -flag +HeapDumpBeforeFullGC <pid>
这句正确执行之后本来就不会在console上输出任何东西。只是开启了VM的heap dump功能就完事了。然后在发生full GC的时候你就应该在Java进程的“工作目录”(或者说“当前目录”)看到相应的heap dump文件。
5 楼
hittyt
2011-11-04
RednaxelaFX 写道
hittyt 写道
楼主你好,我尝试这按照你说的方法希望找出Full GC时的一些上下文:
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
jinfo -flag -HeapDumpBeforeFullGC 16540
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
+HeapDumpBeforeFullGC才是启用,减号的话是禁用。你确定你前面有用过加号来启用并且随后发生过full GC么?
至于PermGen大小不对,请把完整的启动参数贴出来看看
jvm的启动参数如下:
-server -Xmx2g -Xms2g -Xmn256m -XX:PermSize=192m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70
按照你的提示,将原来的jinfo -flag -HeapDumpBeforeFullGC 16540修改为jinfo -flag +HeapDumpBeforeFullGC 16540,得到的控制台输出还是刚才我贴出来的那段,这里,PermGen、
YoungGen、OldGen的大小都是对不上的。
至于是否确认进行了FullGC,我是使用jstat -gcutil来统计的GC次数,具体的信息如下:
jstat -gcutil 16540 5s 10 [GC [PSYoungGen: 4032K->480K(4672K)] 4032K->480K(7552K), 0.0017910 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] S0 S1 E O P YGC YGCT FGC FGCT GCT 92.94 0.00 82.12 63.19 72.48 7422 138.845 292 7.029 145.874 73.05 0.00 63.06 64.12 72.48 7424 138.877 292 7.029 145.906 53.76 0.00 56.87 65.08 72.48 7426 138.906 292 7.029 145.936 100.00 0.00 49.34 65.57 72.48 7428 138.939 292 7.029 145.968 70.13 0.00 78.23 67.23 72.49 7430 138.974 292 7.029 146.003 94.27 0.00 55.79 68.41 72.49 7432 139.007 292 7.029 146.036 100.00 0.00 35.08 69.19 72.49 7434 139.051 292 7.029 146.080 0.00 100.00 35.76 70.35 72.49 7435 139.104 293 7.047 146.151 69.75 0.00 35.95 70.54 72.49 7436 139.128 293 7.047 146.175 [GC [PSYoungGen: 4512K->464K(8448K)] 4512K->464K(11328K), 0.0022880 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 0.00 82.30 43.67 43.73 72.49 7437 139.140 294 7.071 146.210 Heap PSYoungGen total 8448K, used 719K [0x00002aaae8b60000, 0x00002aaae9460000, 0x00002aab03600000) eden space 7936K, 3% used [0x00002aaae8b60000,0x00002aaae8b9fec0,0x00002aaae9320000) from space 512K, 90% used [0x00002aaae93e0000,0x00002aaae9454018,0x00002aaae9460000) to space 640K, 0% used [0x00002aaae9320000,0x00002aaae9320000,0x00002aaae93c0000) PSOldGen total 2880K, used 0K [0x00002aaab3600000, 0x00002aaab38d0000, 0x00002aaae8b60000) object space 2880K, 0% used [0x00002aaab3600000,0x00002aaab3600000,0x00002aaab38d0000) PSPermGen total 21248K, used 4208K [0x00002aaaae200000, 0x00002aaaaf6c0000, 0x00002aaab3600000) object space 21248K, 19% used [0x00002aaaae200000,0x00002aaaae61c160,0x00002aaaaf6c0000)
这个是之前统计的50s内的GC情况。
4 楼
RednaxelaFX
2011-11-04
hittyt 写道
楼主你好,我尝试这按照你说的方法希望找出Full GC时的一些上下文:
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
jinfo -flag -HeapDumpBeforeFullGC 16540
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
+HeapDumpBeforeFullGC才是启用,减号的话是禁用。你确定你前面有用过加号来启用并且随后发生过full GC么?
至于PermGen大小不对,请把完整的启动参数贴出来看看
3 楼
hittyt
2011-11-04
楼主你好,我尝试这按照你说的方法希望找出Full GC时的一些上下文:
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
jinfo -flag -HeapDumpBeforeFullGC 16540 Heap PSYoungGen total 23872K, used 2867K [0x00002aaae8b60000, 0x00002aaaea600000, 0x00002aab03600000) eden space 20480K, 14% used [0x00002aaae8b60000,0x00002aaae8e2cea8,0x00002aaae9f60000) from space 3392K, 0% used [0x00002aaaea2b0000,0x00002aaaea2b0000,0x00002aaaea600000) to space 3392K, 0% used [0x00002aaae9f60000,0x00002aaae9f60000,0x00002aaaea2b0000) PSOldGen total 54656K, used 0K [0x00002aaab3600000, 0x00002aaab6b60000, 0x00002aaae8b60000) object space 54656K, 0% used [0x00002aaab3600000,0x00002aaab3600000,0x00002aaab6b60000) PSPermGen total 21248K, used 3607K [0x00002aaaae200000, 0x00002aaaaf6c0000, 0x00002aaab3600000) object space 21248K, 16% used [0x00002aaaae200000,0x00002aaaae585ee0,0x00002aaaaf6c0000)
但是在控制台得到的这些输出好像有些不对头啊。
比如:我的PermSize明明设置成了192m,但这里的PSPermGen显示的total却只有21248K?这是为什么呢?
还有full GC是的heap dump是在哪里生成的呢?我在当前目录下没有看到任何文件生成呢?
2 楼
RednaxelaFX
2011-05-23
ordinary 写道
没懂,怎么出了个groovy?
方便做实验而已。Groovy也是跑在JVM上的,用它的shell能很方便的触发System.gc()。
换用Java写的话,
System.gc(); System.in.read();System.in.read(); System.gc(); System.in.read();System.in.read(); System.gc();
1 楼
ordinary
2011-05-23
没懂,怎么出了个groovy?
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16278以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10453先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
基于LLVM实现VM的JIT的一些痛点
2014-01-07 17:25 0同事Philip Reames Sanjoy Das http ... -
tailcall notes
2013-12-27 07:42 0http://blogs.msdn.com/b/clrcode ... -
《自制编程语言》的一些笔记
2013-11-24 00:20 0http://kmaebashi.com/programmer ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22396(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局 (0): 拿在手上的是什么
2013-11-04 18:22 21495(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21874之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ...
相关推荐
《JVM Full GC 之 MAT 工具分析实践》 在Java开发中,理解JVM内存管理和垃圾收集机制至关重要,因为这直接关系到应用程序的性能和稳定性。当遇到内存溢出(OutOfMemoryError)、系统异常或者性能下降等问题时,我们...
JVM监控工具是Java开发者和运维人员不可或缺的工具,通过这些工具可以监控和诊断Java应用程序的性能和资源使用情况。本文将介绍五种JVM监控工具:jstack、jconsole、jinfo、jmap和jdb。 jstack jstack是一款命令行...
- **使用场景**:当怀疑应用程序存在内存泄漏时,使用 jmap 生成 heap dump 文件,进一步通过其他工具(如 MAT 或 VisualVM)进行分析。 - **命令格式**:`jmap [options] <pid>` 或 `jmap [options] core` ##### 5...
虽然JHAT在现代Java开发中使用较少,但它仍然是一个能够分析heapdump文件的工具。它能够启动一个web服务器,允许开发者通过浏览器查看对象的引用情况,这对于理解对象间的相互引用非常有用。 在实际使用中,开发者...
`jinfo`在`java`目录的`bin`子目录下,通过指定进程ID可以实时获取或修改JVM参数。 ### 1. jinfo指令格式 `jinfo`的基本用法是`jinfo [option] pid`,其中`option`是你要执行的操作,`pid`是你要操作的目标Java...
- **使用方法**:`jhat <heapdumpfile>` 或 `jhat -J<options> <heapdumpfile>`。 ##### 5. jmap:内存映像工具 - **功能**:`jmap` 可以获取堆内存的快照,并将其输出为一个文件,也可以显示堆中的对象信息。 - **...
通过`jstat -gc <pid> <interval> <count>`,我们可以定期获取JVM的垃圾回收状况,这对于优化内存配置和识别潜在的内存泄漏问题非常有帮助。 总的来说,这些工具为Java开发者提供了一套全面的诊断和监控手段,能够...
【Java JVM内存监控工具详解】 Java JVM内存监控是优化Java应用程序性能的关键环节,而VisualVM作为一款集成...在实际开发过程中,结合VisualVM等工具进行综合分析,能够更好地理解和解决问题,提升Java应用的性能。
通过`jconsole`,用户可以监控Java应用的内存使用、Heap大小、线程状态、类加载状态等信息。其图形界面直观易用,适合于快速检查和分析JVM运行状态。 #### 3. jinfo —— Java Configuration Information `jinfo` ...
- **GC类型**:主要分为Minor GC(年轻代GC)、Major GC(老年代GC)和Full GC(全局GC)。 - **GC策略**:包括复制算法、标记-清除算法、标记-整理算法、分代收集策略等,根据JVM版本和配置不同而有所不同。 - *...
jhat与jmap配合使用,它是一个命令行工具,用于分析由jmap生成的heap dump文件。它建立一个基于HTTP/HTTPS的服务,通过浏览器界面查看堆内存使用情况,识别可能的内存泄漏。虽然jhat功能强大,但由于现代内存分析...
本文将深入探讨JVM内存结构、监控工具及其在调优和GC优化中的应用。 **JVM内存机构** JVM内存主要分为以下几个区域: 1. **堆内存(Heap)**:这是JVM中最大的一块内存区域,主要用于存储对象实例。堆被进一步...
在GC监控方面,除了使用JMX参数外,还可以使用-Xloggc:文件参数来记录GC日志,并通过-XX:+PrintGCDetails等参数打印GC的详细信息。 优化建议包括合理设置堆内存大小,选择合适的垃圾回收器,调整新生代与老年代的...
通过jvisualvm工具,可以查看线程堆栈,监控GC行为,甚至在内存溢出时获取堆dump文件来分析内存使用情况。这些信息对于诊断和解决内存相关的问题至关重要。 综上所述,Java性能调优涉及多个层面,包括但不限于监控...
在实际使用中,我们可以利用这些工具对Java应用进行监控,比如在Jboss这样的应用服务器中,通过添加特定的Java选项(如`-agentpath:libjprofilerti.so=port=8849`)启用JProfiler进行远程监控。通过分析CPU视图和堆...
在故障排查过程中,使用了多种工具来排查问题,包括MAT(heap dump分析工具)、jstack(线程dump工具)、jmap(内存dump工具)、gcore(核心dump工具)、btrace(性能分析工具)、gperftools(性能分析工具)、ulimit(系统资源...
例如,如果需要快速定位内存泄漏,可以使用`jmap -histo` 或者结合`jstat -gc` 和`jmap -heap`。如果关心线程状态,`jstack` 是首选。对于整体性能的可视化监控,`jconsole` 是个不错的选择。熟练掌握这些工具的使用...
1. **获取堆文件**: 使用Jvisualvm工具在远程服务器上生成堆文件`heapdump-xxxxxxxxxx.hprof`。 2. **使用MemoryAnalyzer分析**: MemoryAnalyzer是一款由Eclipse提供的免费内存分析工具,它可以独立使用也可以作为...
这些工具通常包含在Java Development Kit (JDK) 中,为开发者提供了深入洞察JVM (Java Virtual Machine) 运行时行为的能力。以下是一些主要的Java监控工具及其用途: 1. **jcmd**: jcmd 是一个命令行工具,用于获取...
Java虚拟机(JVM)性能调优是优化Java应用程序的关键环节,而监控工具在此过程中扮演着至关重要的角色。本文将详细介绍几个常用的JVM性能监控工具及其功能,包括Jinfo、Jstat、Jmap和Jstack。 1. **Jinfo**: ...