jvm优化

为什么要做jvm的优化,在正常的本地开发中很少能用到,但是一旦程序部署到生产环境中就很可能出现应用运行到一半卡住了没有日志输出,程序没有反应,或者说对服务器做请求但是服务器没有任何的响应,或者服务器的cpu突然升高,或者出现内存溢出的情况,多数情况重启可以解决但是并不能依赖重启来解决问题,所以就需要让程序不仅仅能够跑起来更需要跑的更快。

JVM三种参数类型

jvm 有三种参数类型,分别是 -help 、-version 标准参数,在各个jdk版本都有保留属于稳定参数;-X参数(-Xint、-Xcomp )非标准参数;-XX参数也属于非标准参数(-XX:newSIze、-XX:+UseSerialGC)往往都是用于jvm的调优或者jvm的debug,使用率表较高  ;

JVM标准参数

java -help 命令就可以检索出所有的标准参数

java jvm 参数能写到代码里面吗 jvm常用的参数_java


查看Jvm的版本 java -version

java jvm 参数能写到代码里面吗 jvm常用的参数_堆内存_02


可以通过-D 参数 来设置系统属性参数,例如创建一个普通的java 类javac 编译获取class文件并且执行,如果没有设置参数则打印test 有参数就将参数打印出来;

public class TestJVM {
    public static void main(String[] args) {
        String str = System.getProperty("str"); 
		if (str == null) {
            System.out.println("test");
        } else {
            System.out.println(str);
        }
    }
}

java jvm 参数能写到代码里面吗 jvm常用的参数_JVM_03


在jvm 中 可以通过-client 和-server 来设置jvm运行参数,区别在于-client相对保守使用-client 初始化堆空间相对小使用串行的垃圾回收器优点在于使jvm启动更快但是运行速度慢,-server模式相反初始化堆空间大使用并行的垃圾回收器启动慢但是运行快,Jvm在运行的时候会根据硬件条件自主选择相应的模式,64位系操作系统只能使用·-server模式,windows系统只支持-client模式例如我使用的是64位进行一下测试 是server模式

java jvm 参数能写到代码里面吗 jvm常用的参数_JVM_04

JVM中的-X 参数

-X参数是非标准参数 不同的JVM版本的参数是不同的 可以使用java -x 来查看非标准参数常用的-X 参数如-Xint:在解释器的模式下-Xint标记会强制JVM执行所有的字节码,效率较低,-Xcomp的有-Xint 相反会将所有的字节码编译成本地代码在去执行从而带来优化,在使用-Xcomp的时候也会有一些性能的损失,但是比-Xint要少,原因是-xcomp没有

让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义;

java jvm 参数能写到代码里面吗 jvm常用的参数_java_05


在上面的测试中 -Xcomp 会有点卡顿,是机上卡顿的时候就是将字节码编译成本地代码进行执行;Xint编译快执行慢-Xcomp编译慢 执行快

-Xmixd混合模式是jvm默认是使用模式

-XX非标准参数

-xx参数主要用来jvm的调优和debug操作,共有两种使用方式,一种是boolean类型一种是非boolean类型

boolean 类型: -XX [+ -] 表示启用或禁用属性

非boolean 类型::-XX:= 表示属性的值为

java jvm 参数能写到代码里面吗 jvm常用的参数_堆内存_06


-Xms与-Xmx参数-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。

-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M。

-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。

适当的调整jvm的内存大小,可以充分利用服务器资源,例如设置初始大小512和最大堆内存1024

java jvm 参数能写到代码里面吗 jvm常用的参数_堆内存_07

运行java命令是打印参数

运行java命令时打印参数,需要添加-XX:+PrintFlagsFinal参数即可

java jvm 参数能写到代码里面吗 jvm常用的参数_java_08


java jvm 参数能写到代码里面吗 jvm常用的参数_堆内存_09


参数有boolean类型和数字类型,值的操作符是=或:=,分别代表默认值和被修改的值

查看正在运行的JVM参数

可以启动一个tomcat 来查看

java jvm 参数能写到代码里面吗 jvm常用的参数_JVM_10


启动tomcat后通过jps -l 查看进程,通过jinfo -flags 进程id 查看所有的运行参数 和查看最大堆内存

java jvm 参数能写到代码里面吗 jvm常用的参数_堆内存_11


通过jinfo -flag MaxHeapSize 进程id 查看最大堆内存

java jvm 参数能写到代码里面吗 jvm常用的参数_java jvm 参数能写到代码里面吗_12