JVM参数


1. 标配参数


java -version
java -help
java =showversion


2. -X参数


-Xint  //解释执行
-Xcomp //第一次使用就编译成本地代码
-Xmixed //混和模式


3. -XX参数

3.1 Boolean类型

公式:-XX:+代表增加,-代表剔除某个属性值

查看某个Java进程是否开启了某些JVM参数的方法:

  • jps -l获取所有后台运行的Java进程
  • jinfo -flag JVM参数 进程ID获取这个Java程序对该JVM参数的开启状况

**案例:**当前程序是否打印了GC收集细节


javassist动态修改类demo 动态修改jvm参数_jvm 参数


代表当前程序没有开启垃圾回收


javassist动态修改类demo 动态修改jvm参数_软引用_02


这是开启以后的

3.2 KV类型

公式:-XX:属性key=属性值value

案例:

-XX:MetaspaceSize=128m修改元空间大小

-XX:MaxTenuringThreshold修改对象最大存活年龄

-XX:InitialHeapSize初始堆大小

修改前


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_03


修改后


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_04


jinfo -flags获取所有JVM开启的参数


javassist动态修改类demo 动态修改jvm参数_java_05


3.2.1 Xms和-Xmx

XmsXmx分别代表堆的标准大小和最大空间。

Xms相当于-XX:InitialHeapSize

Xmx相当于-XX:MaxHeapSize

3.3 查看JVM默认参数

java -XX:+PrintFlagsInitial -version打印Java版本信息和初始默认JVM参数设置


javassist动态修改类demo 动态修改jvm参数_java_06


java -XX:+PrintFlagsFinal -version打印被更新过的JVM参数设置

  • 冒号表示由于平台或者开发者的缘故导致该参数被修改


javassist动态修改类demo 动态修改jvm参数_java_07


java -XX:+PrintCommandLineFlags打印一些基本信息,包括使用的垃圾回收器


javassist动态修改类demo 动态修改jvm参数_JVM_08


打印了使用的垃圾回收器

4. JVM常用参数


-Xms 初始大小为物理内存的1/64  等价于-XX:InitialHeapSize
-Xmx 默认为物理内存的1/4    等价于-XX:MaxHeapSize
-Xss 单个线程栈大小 一般为512~1024k
-Xmn 设置年轻代大小
-XX:MetaspaceSize 设置元空间大小
-XX:+PrintGCDetails 输出GC日志信息
-XX:SurvivorRatio  设置Ende区在新生代中的占比
-XX:NewRatio  设置老年代在堆中的占比
-XX:MaxTenuringThreashold 设置对象的最大年龄


关于新生代中的Eden和Survivor的占比问题:笔者JDK得出的是6:1,但查看官方文档得出的结论是8:1


javassist动态修改类demo 动态修改jvm参数_软引用_09


5. 对象的引用类型


javassist动态修改类demo 动态修改jvm参数_JVM_10


5.1 强引用

Java的默认引用类型,所有的对象创建都是强引用,当对象引用变量为null的时候被回收

5.2 软引用

通过SoftReference设置软引用,当内存空间不足的时候,软引用对象被直接回收


javassist动态修改类demo 动态修改jvm参数_JVM_11


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_12


5.3 弱引用

通过WeakReference设置若引用,当GC运行的时候,就会将这个类型的对象回收


javassist动态修改类demo 动态修改jvm参数_jvm 参数_13


javassist动态修改类demo 动态修改jvm参数_JVM_14


5.3.1 什么实用实用软引用或者虚引用

本地图片加载的时候,通常我们会将之加载到缓存中。但是当图片数量急剧增加的时候就有可能发生OOM,所以我们可以通过虚引用或者软引用保存图片的对象

例如我们可以构建一个HashMap对象封装URL和图片对象映射,其中的图片对象使用弱引用或者软引用的方式。当内存不足的时候自动回收内存中的图片对象


HashMap<String,SoftReference<Bitmap>> imageCache =
    new HashMap<>();


5.3.2 WeakHashMap

存储一个弱引用的Key,当一个key是无效的时候,该键将被移除


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_15


javassist动态修改类demo 动态修改jvm参数_软引用_16


5.4 虚引用

通过PhantomReference设置虚引用,该引用相当于没有引用,通过get方法不能获取引用的值,唯一的作用就是配合ReferenceQueue使用,在gC以后被放入引用队列中,做一些后续操作,比如通知等等。

5.5 引用队列

软引用,弱引用,虚引用被GC以后不会立即消失,而是添加到了ReferenceQueue引用队列中,可以做后续的操作。

案例演示


javassist动态修改类demo 动态修改jvm参数_JVM_17


javassist动态修改类demo 动态修改jvm参数_java_18


可以看到在GC以后引用队列中有值了

6. OOM

6.1 栈溢出

java.lang.StackOverflowError栈溢出,栈的默认空间大小为512~1024k当超过这个界限以后就会触发这个错误


javassist动态修改类demo 动态修改jvm参数_软引用_19


6.2 堆溢出

java.lang.OutOfMemoryError:Java heap space堆溢出。

常见的场景:大对象(直接超过老年区大小);强引用对象的不断出现


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_20


6.3 GC超出资源限制

java.lang.OutOfMemoryError:overhead limit exceededGC占据了系统98%的运行,但是仅仅回收了2%不到的内存空间。导致重复GC,但空间没法释放。爆出这个错误


javassist动态修改类demo 动态修改jvm参数_JVM_21


6.4 堆外内存溢出(直接内存溢出)

java.lang.OutOfMemoryError:Direct buffer memory堆外内存溢出,使用NIO的时候会出现

NIO中使用


javassist动态修改类demo 动态修改jvm参数_javassist动态修改类demo_22


6.5 不能够再创建本地线程

java.lang.OutOfMemoryError:unable to create new native thread

默认大小为1024个

6.6 元空间溢出

java.lang.OutOfMemoryError:Metaspace

默认大小为20M