`
can_do
  • 浏览: 248754 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【Do家】如何通过shell命令行执行jmx中Mbean方法System.gc()?

阅读更多
如何通过shell命令行执行jmx中Mbean方法System.gc()?

可以按如下步骤实施:

<1/6>配置jvm参数,两个目标:其一是开启jmx,其二是启用显式执行GC命令-XX:-DisableExplicitGC
-XX:-DisableExplicitGC -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10240 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.3.168

注意:
1> jvm参数配置时,需要指定port和host,尤其是跨网络访问时;
2> jmx启动后,会listen两个port,一个是jvm参数指定的,另一个是随机端口号,如果跨网络访问,注意两个port都需要在防火墙上开启;
3> 访问jmx的完整uri类似:【service:jmx:rmi:///jndi/rmi:192.168.3.168:10240】/jmxrmi,一般客户端都是将协议固化下来,仅需要ip和port即可;
4> 通过jndi方式访问,uri类似:【jndi:rmi://192.168.3.168:10098/jmxrmi】



<2/6>启动目标Java进程,检查jmx是否Listen就绪;
# netstat -tnulp|grep 3058
tcp6       0      0 :::40188                :::*                    LISTEN      3058/java          
tcp6       0      0 :::10240                :::*                    LISTEN      3058/java          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      3058/java          
tcp6       0      0 :::8080                 :::*                    LISTEN      3058/java          
tcp6       0      0 :::34035                :::*                    LISTEN      3058/java 


<3/6> 获取cmdline-jmxclient-0.10.3.jar资源,其中仅一个Client java类,通过jmx获取Mbean信息;

<4/6> 通过cmdline-jmxclient获取MBean成功的例子,如下:
# java -jar cmdline-jmxclient-0.10.3.jar - 192.168.3.168:10240 java.lang:type=Memory
Attributes:
ObjectPendingFinalizationCount: ObjectPendingFinalizationCount (type=int)
HeapMemoryUsage: HeapMemoryUsage (type=javax.management.openmbean.CompositeData)
NonHeapMemoryUsage: NonHeapMemoryUsage (type=javax.management.openmbean.CompositeData)
Verbose: Verbose (type=boolean)
ObjectName: ObjectName (type=javax.management.ObjectName)
Operations:
gc: gc
  Parameters 0, return type=void
 
<5/6> 通过命令行执行jmx中的MBean方法,System.gc()
java -jar cmdline-jmxclient-0.10.3.jar - 192.168.3.168:10240 java.lang:type=Memory gc

注意:此处jmx认证未开启,没有username和password,用【-】代替;


<6/6> 通过jdk命令jstat监控gc执行情况,发现FGC次数在增加,gccause是System.gc(),说明通过命令行jmx调用System.gc()执行成功
  # jstat -gccause 3514 3000 10
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC                
  0.00   0.00   5.54   6.20  96.48  89.04      1    0.023     2    0.057    0.080 System.gc()          No GC              
  0.00   0.00   5.54   6.20  96.48  89.04      1    0.023     2    0.057    0.080 System.gc()          No GC              
  0.00   0.00   5.50   6.21  96.65  89.04      1    0.023     3    0.082    0.105 System.gc()          No GC              
  0.00   0.00   1.50   6.21  96.75  89.09      1    0.023     4    0.109    0.132 System.gc()          No GC              
  0.00   0.00   5.50   6.21  96.75  89.09      1    0.023     4    0.109    0.132 System.gc()          No GC              
  0.00   0.00   6.47   6.21  96.90  89.09      1    0.023     5    0.131    0.154 System.gc()          No GC
 
【小结】
1> 通过命令行执行jmx中注册MBean的其他方法,也可用此方式,实际应用场景,比如:方便监控并及时干预目标Java应用;

2> 执行System.gc()方法,可以释放Java进程中某些线程访问本地内存,比如DMA,Netty-NIO等产生的内存占用;


 


【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics