默认配置大小_还说不知道jvm常用基本配置参数吗?

8cd2925cd4527c127d2aed907834c21a.png

一、你平时工作用过的jvm常用基本配置参数有哪些?

1、回顾堆内存初始大小

jdk1.8之后将最初永久代取消了,由元空间取代。

44e5bbc47538a7579d3fb68155bad6fc.png

在jdk1.8中,永久已经被移除,被一个称为元空间的区域取代。元空间的本质和永久代类似。

元空间(java8)与永久代(java7)之间最大的区别在于:

永久代使用的jvm的堆内存,但是java8以后的元空间并不在虚拟机中而是使用本机物理内存

因此,默认情况下,元空间的大小仅受本地内存的限制。类的元数据放入native memory,字符串池和类的静态变量放入到java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。

代码案例:

package com.study.jvmgc;

public class HelloGC01 {
    public static void main(String[] args) throws Exception{

		long totalMemory = Runtime.getRuntime().totalMemory();  // 返回java虚拟机中的内存总量
		long maxMemory = Runtime.getRuntime().maxMemory();	   // 返回java虚拟机试图使用的最大内存量

		System.out.println("TotalMemory(-Xms) = " + totalMemory + " (字节)、" + (totalMemory / (double) 1024 / 1024) + " MB");

		System.out.println("MaxMemory(-Xmx) = " + maxMemory + " (字节)、" + (maxMemory / (double) 1024 / 1024) + " MB");

    }
}

运行程序,输出:

3ce8f00b7aa62f6f4bf401716f854e09.png

2、常用基础参数栈内存Xss讲解

(1)-Xms:初始大小内存,默认为物理内存1/64 —— 等价于-XX:InitialHeapSize

(2)-Xmx:最大分配内存,默认为物理内存1/4 —— 等价于-XX:MaxHeapSize

(3)-Xss:设置单个线程的大小,一般默认为512K~102 —— 等价于-XX:ThreadStackSize

代码案例:

package com.study.jvmgc;

public class HelloGC {
    public static void main(String[] args) throws Exception{
        System.out.println("************HelloGC");

        Thread.sleep(Integer.MAX_VALUE);
    }
}

运行程序后,执行查看

c2069506e10d2903cefcc392b6e0ae45.png

解决以上问题:

把参数-XX:MetaspaceSize=1204m改成-Xss128K

dbb47e6eee2f1a38f6f73e182fe08153.png

再次启动运行并执行命令:

a16914678109224713c2e9a87e8e9c10.png

原理:如-XX:ThreadStackSize=0时,代表用户系统出场默认值;

查看oracle官网资料:https://docs.oracle.com/javase/8/docs/index.html

4a5370ca602e75d01da578793801848f.png
1

8851c1d9d2176a06d3c9ad2c5a086c0f.png
2

在java虚拟机中,栈管运行,堆管存储

d421edc5cc920076956ced42cfd14cc1.png

由栈空间有128,如图所示:

e596d5c555c33ce9c28a95fbed0d3da9.png

若无指定配置Vm参数,它的栈空间的值为0,这个问题我们又当如何解释呢?

我们可以根据java8的官网信息去验证:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html

235560f2a907f339214d189bcea60e6e.png

其次,不管时java9、java10、java11、java12都是默认于平台。

https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE

51a5b2ba7d543e0690ccf5e86b69bbdf.png
java10

https://docs.oracle.com/en/java/javase/12/docs/specs/man/java.html

36e8df34e606f07131b91100dfe99bab.png
java12

3、常用基础参数元空间MetaspaceSize

(1)-Xmn:设置年轻代大小

2-XX:MetaspaceSize:设置元空间大小

其中,元空间的本质与永久代类似,都是对jvm规范中方法区的实现。不过元空间与永久代之间最大的区别在于: 元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制

查看初始参数

-XX:+PrintCommandLineFlags

38e6db283d537e9bb52338fbe85281cc.png
1

运行程序后,如下图,发现会自定义参数打印数据(串行垃圾回收器)

9f75b03d9aef80e9f7bc48cdb6e943a8.png

其中:

-XX:+UseSerialGC 串行垃圾回收器
-XX:+UseParallelGC 并行垃圾回收器 ( jdk1.8 默认)

运行的参数值:

//串行垃圾回收器
-XX:InitialHeapSize=132335808 
-XX:MaxHeapSize=2117372928 
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC 

另一种配置参数:并行垃圾回收器

-Xms128m -Xmx4096m -Xss1024k -XX:MetaspaceSize=512m -XX:+PrintCommandLineFlags
-XX:+PrintGCDetails -XX:+UseSerialGC

a71220cfa477e2c5cc16e52ce28e4041.png

运行程序后,如下图:

24fa8daf3e5dc0eb123b617d62a8acb9.png

运行的参数值:

//并行垃圾回收器 ( jdk1.8 默认)
-XX:InitialHeapSize=134217728 
-XX:MaxHeapSize=4294967296 
-XX:MetaspaceSize=536870912 
-XX:+PrintCommandLineFlags 
-XX:+PrintGCDetails 
-XX:ThreadStackSize=1024
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseSerialGC 

4、常用基础参数PrintCDetails回收前后对比讲解

(1)查看垃圾回收细节情况信息

-XX:+PrintGCDetails

启动程序:垃圾回收细节情况信息

661e5c024318f3dd1128da82dfc50437.png

若在生产环境中,出现另类的情况,比如说把垃圾回收内存爆出现象,配置参数

-Xms10m -Xmx10m -XX:+PrintGCDetails

34e2852ba636a6d2decc30e0ffa4c049.png
//代码演示:
package com.study.jvmgc;

public class HelloGC {
    public static void main(String[] args) throws Exception{
        System.out.println("************HelloGC");
        byte[]byteArray=new byte[50*1024*1024];
    }
}

启动程序,控制台打印输出:

29aa35419d552a8d507aa37de00afe57.png

oom挂了

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at com.study.jvmgc.HelloGC.main(HelloGC.java:7)

一般了说,GC在新生区

9001d452fa6cc6fb4639c86a30f4d797.png
GC垃圾回收信息解读(针对控制台打印信息案例来看)

而Full GC在年老区

c207e84c03380672d17dad68a1352ad6.png
Full GC垃圾回收信息解读(针对控制台打印信息案例来看)

5、常用基础参数SurvivorRation讲解

设置新生代中eden和S0/S1空间的比例默认:

-XX:SurvivorRation=8, Eden:S0:S1=8:1:1

假如:

-XX:SurvivorRation=4,Eden:S0:S1=4:1:1

SurvivorRation值就是设置eden区的比例占多少,S0/S1相同

代码案例演示:

配置jvm参数:

//配置串行垃圾回收
-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m

69cfafdeed7534500fc486135915e158.png

启动程序,输出:默认值,参数没有做更改

227d7501dc21a0e0d5582fda5d0a92a4.png

若想要更改默认参数,在idea修改jvm的配置参数即可:

-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRation=8  //默认值

打印输出:

ab471125bee399dc82510424370fe6a5.png

若想更改别的参数,比如设置为4

-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRation=4  //4倍

打印输出:

5c96b3c80c401f6030d1c4c01673e6e5.png

6、常用基础参数NewRation

配置年轻代与老年代在堆结构的占比默认,-XX:NewRation=2,新生代占1,老年代占2,年轻代占整个堆的1/3。
假如:-XX:NewRation=4,新生代占1,老年代占4,年轻代占整个堆的1/5。
NewRation值就是设置老年代的占比,剩下的1给新生代

代码案例演示:

配置jvm参数,串行垃圾回收信息

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC

021c357e6153bc51755c717ae2e8594f.png

打印输出:

3b0a8f8b28b63fc0061d5a880770c7b8.png

若想要更改默认参数,在idea修改jvm的配置参数即可,修改后新生代与老年代都会发生变化

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=4

打印输出:

457527953295ed4eadd2db4ee07433b4.png

若想要更改参数2

-Xms10m -Xmx10m -XX:+PrintGCDetails -XX:+UseSerialGC -XX:NewRatio=2

打印输出:

bbcf69b9890a627ad4d2b54dd6fe144b.png

75b4eabc0477e20da2eabf1cf591bd59.png

7、常用基础参数MaxTenuringThreshold

若我们在idea不配置虚拟机参数

d9176b64780e49fb459f64f6d6c45207.png

代码案例:

package com.study.jvmgc;

public class HelloGC {
    public static void main(String[] args) throws Exception{

        System.out.println("************HelloGC");

        Thread.sleep(Integer.MAX_VALUE);
    }
}

启动程序,打印输出,查看

E:interview2020-master>jinfo -flag MaxTenuringThreshold 5368

48d71fc3641a528fc6641dc7f1d2a52a.png

注意:在java8默认参数的范围0~15,调优参数系统已经配置好了,若超过15系统不许,会出现错误。

如设置参数为20

-XX:MaxTenuringThreshold=20

运行报错信息,如图所示:java8限制了

4d7b3f4f60b7774d4b2283c7f7ee24f8.png

不超过15即可,如设置参数为12

-XX:MaxTenuringThreshold=12

efa5987416d858059583cf81e24e79ef.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值