JVM client模式和Server模式的区别
JVM client模式和Server模式启动,分别针对桌面应用和服务器应用做了相应的优化,client版本加载速度较快,server版本加载速度较慢但运行起来较快。
Java HotSpot虚拟机默认不带参数启动会首先检测主机是否为服务器,如果是,则以Server模式启动,否则以client模式启动,而检测的根据是至少2个CPU和最低2GB内存。
虚拟机模式切换
如果只是临时切换,可以直接使用命令行执行,格式如:java -模式(client或server) classname
如果永久切换可以修改配置文件,配置文件在“JAVA_HOME/jre/lib/i386/jvm.cfg”,我们可以看到JVM默认的顺序:
- -client KNOWN
- -server KNOWN
- -hotspot ALIASED_TO -client
- -classic WARN
- -native ERROR
- -green ERROR
只需要把-server和-clent调换顺序即可
- -server KNOWN
- -client KNOWN
- -hotspot ALIASED_TO -client
- -classic WARN
- -native ERROR
- -green ERROR
JVM工作在Server模式可以大大提高性能,但应用的启动会比client模式慢大概10%。当JVM用于启动GUI界面的交互应用时适合于使用client模式,当JVM用于运行服务器后台程序时建议用Server模式。
默认Java堆大小 (即Xms和Xmx默认值)
hotspot虚拟机的默认堆大小如果未指定,他们是根据服务器物理内存计算而来的
client模式下,JVM初始和最大堆大小为:
在物理内存达到192MB之前,JVM最大堆大小为物理内存的一半,否则,在物理内存大于192MB,在到达1GB之前,JVM最大堆大小为物理内存的1/4,大于1GB的物理内存也按1GB计算,举个例子,如果你的电脑内存是128MB,那么最大堆大小就是64MB,如果你的物理内存大于或等于1GB,那么最大堆大小为256MB。
Java初始堆大小是物理内存的1/64,但最小是8MB。
server模式下:
与client模式类似,区别就是默认值可以更大,比如在32位JVM下,如果物理内存在4G或更高,最大堆大小可以提升至1GB,,如果是在64位JVM下,如果物理内存在128GB或更高,最大堆大小可以提升至32GB。
jdk 命令行工具
jps 虚拟机进程状况工具 jps -l -v -l 输出主类的全名 -v 输出虚拟机启动参数 -m 输出main函数的参数;
jstat 虚拟机统计信息监视工具 jstat -gcutil 2764
jinfo java配置信息工具
jinfo -flag MaxHeapSize 6950 打印VMID为6950的JVM进程的大Java堆大小
jinfo -flag InitialHeapSize 6950 打印VMID为6950的JVM进程的初始化Java堆大小
jinfo -flags 6950 打印VMID为6950的JVM进程的VM参数
jmap Java内存映像工具
例如,用jmap生成一个dump快照的命令为:
jmap -dump:format=b,file=dumpfile.bin 3500
jhat 启动web显示dump分析页面
jstack Java栈跟踪工具
jack -l 显示堆栈信息
hsdls jit生成代码反汇编
参考资料
本文参考:《深入理解Java虚拟机》