远程debug(转)
java -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8000 -jar test.jar
-Xdebug:通知JVM工作在debug模式下;
-Xrunjdwp:通知JVM使用(java debug wire protocol)来运行调试环境;
transport:监听Socket端口连接方式(也可以dt_shmem共享内存方式,但限于windows机器,并且服务提供端和调试端只能位于同一台机);
server:server=y表示当前是调试服务端,=n表示当前是调试客户端;
suspend:suspend=n表示启动时不中断,一般用于设置主动连接;suspend=y表示启动时就进入调试模式,一般用于被动连接;
本地监控参数
-Djava.rmi.server.hostname=localhost -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8087 -Dcom.sun.management.jmxremote.rmi.port=8087 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false
配置用户密码
jre/lib/management下
cp jmxremote.password.template jmxremote.password
chomd +w jmxremote.password 然后取消最后肉行注释即可
赋予文件权限:chmod 600 jmxremote.password jmxremote.access
放开防火墙
sudo firewall-cmd --zone=public --add-port=8087/tcp --permanent
sudo firewall-cmd --reload
监控后可用jconsole远程:如图效果:
从上到下(粗略解释)
- 堆:对象实例 (java8+字符串常量池)
- 非堆: 不解释
- EdenSpace::新建对象区 –Xmn指定
- SurviverSpace::eden GC后会存到幸存区
- OldGen :缓存对象
- MetaSpace::类的对象(有限制会报OOM异常)+方法、常量池(无限制,用系统内存)
- CodeCache JIT编译的热点代码缓存
- Compressed Class Space:类对象
顺便给出点vm参数意见
-Xmn Sun官方推荐配置为整个堆的3/8。
-XX:NewRatio=2
-XX:SurvivorRatio=4
根据2:8定律为1:4, YongGen /newGen = 4/(4+1*2)
关于CodeCache:,右边是默认值
64-bit server, Java 8* 48M
64-bit server with Tiered Compilation, Java 8 240 MB
Jdk8中server模式默认采用分层编译方式,如果需要关闭分层编译,需要加上启动参数-XX:-TieredCompilation
-XX:ReservedCodeCacheSize=256M
在jdk8中,提供了一个启动参数XX:+PrintCodeCache在jvm停止的时候打印出codeCache的使用情况。其中max_used就是在整个运行过程中codeCache的最大使用量。可以通过这个值来设置一个合理的codeCache大小,在保证应用正常运行的情况下减少内存使用。