大家好,又见面了,我是你们的朋友全栈君。
为什么要进行JVM优化?
在本地开发环境中我们很少有需求对JVM进行优化,但是到了生产环境我们的程序可能出现如下问题:
- 运行的引用“卡住了”,日志不输出,程序没反应
- 服务器的CPU负载突然升高
- 在多线程应用下,如何合理的分配线程的数量
- 。。。。。。。。。
通过Java -server和java -client设置JVM的运行参数
- server VM的初始堆空间会大一些,默认使用的是并行垃圾回收器,启动慢运行快
- client VM初始堆空间相对较小,使用串行垃圾回收器,他的目标是为了让JVM的启动速度更快,但是运行速度相对较慢。
- JVM在启动时会根据硬件和操作系统自动选择运行哪种类型的JVM。
- 32位操作系统:
- 如果是Windows操作系统,无论硬件如何都会使用client类型的jvm;
- 如果是其他操作系统;如果内存在2G以上并且有2个以上CPU使用server类型,否则使用client类型
- 64位:
- 只有server,不支持client;
- 32位操作系统:
JVM运行参数-xint、-Xcomp、-Xmixed
-X参数
-Xint、Xcomp、-Xmixed
- 在解释模式下,-Xint标记会强制JVM执行所有的字节码,会降低运行速度,通常低10倍或者更多。
- -Xcomp参数与-Xint相反,它会使JVM在第一次使用时把所有的字节码编译成本地代码,从而带来最大程度的优化。
- 而很多应用在使用-Xcomp也会有一些性能损失,但是比使用-Xint损失少,原因是-Xcomp没有让JVM启动JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了。
- -Xmixed是混合模式,将解释模式预编译模式进行混合使用,由JVM自己决定 ,这是JVM默认的模式,也是瑞建使用的模式。
- 演示:
-XX参数
- -XX参数也是非标准参数,主要用于JVM调优和debug操作;
- 两种类型:boolean类型;非boolean类型;
- boolean类型
- 格式:-XX:[±] 表示启用( )或禁用(-)属性;
- 如:-XX: DisableExplicitGC 表示禁用手动调用gc操作
- 格式:-XX:[±] 表示启用( )或禁用(-)属性;
- 非boolean类型
- 格式:-XX=表示属性的值为
- 如:-XX:NewRatio=1表示新生代和老年代的比值 用法:
- 格式:-XX=表示属性的值为
- boolean类型
-Xms与-Xmx参数
- -Xms:JVM的堆内存的初始值大小;
- -Xms512m:等价于-XX:InitalHeapSize,设置JVM初始堆内存为512m;
- -Xmx:JVM的堆内存的最大大小;
- -Xmx2048m:等价于-XX:MaxHeapsSize,设置JVM最大堆内存为2048m; 演示:
查看JVM的运行参数
- 运行java命令时打印参数:添加-XX: PrintFlagsFinal参数
- 演示:
参数有boolean类型和数字类型,值的操作符是=或:=,分别代表默认值和被修改的值 演示:
查看正在运行的jvm参数
- 启动一个tomcat用于测试
- 访问成功后:
JVM内存模型
JDK1.7:
JDK1.8:
JDK1.7与1.8堆内存模型差异
- 1.7原有的永久区被废除,取而代之的是1.8中的MetaSpace(元空间)
- 废除是为了融合HotSpot JVM与JRockit VM
- 现实使用中,由于永久代内存经常不够用或发生内存泄漏,爆出异常OutOfMemooryError,基于此,将永久废除,而改用元空间代替,改了是为了使用本地空间。
通过jstat命令查看堆内存的使用情况
- 查看class加载统计
- 查看编译统计
- 垃圾回收统计
jmap的使用以及内存溢出分析
- 查看内存使用情况
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/130518.html原文链接:https://javaforall.cn