![3f757fb82d962f722a329808edc033a0.png](https://i-blog.csdnimg.cn/blog_migrate/4bf5b46d828cf59e40fb456baf0bc575.jpeg)
一、你平时工作用过的jvm常用基本配置参数有哪些?
1、回顾堆内存初始大小
jdk1.8之后将最初永久代取消了,由元空间取代。
![34459566271468ed0a2cb4e300e2f028.png](https://i-blog.csdnimg.cn/blog_migrate/45c985f3da5f8842f4ad06a746d59069.png)
在jdk1.8中,永久已经被移除,被一个称为元空间的区域取代。元空间的本质和永久代类似。
元空间(java8)与永久代(java7)之间最大的区别在于:
永久代使用的jvm的堆内存,但是java8以后的元空间并不在虚拟机中而是使用本机物理内存
因此,默认情况下,元空间的大小仅受本地内存的限制。类的元数据放入native memory,字符串池和类的静态变量放入到java堆中,这样可以加载多少类的元数据就不再由MaxPermSize控制,而由系统的实际可用空间来控制。
代码案例:
package
运行程序,输出:
![2e567a1e7eca9749dae6993803d9f21d.png](https://i-blog.csdnimg.cn/blog_migrate/54a468ec3948b8d28df43efc203b278a.png)
2、常用基础参数栈内存Xss讲解
(1)-Xms:初始大小内存,默认为物理内存1/64 —— 等价于-XX:InitialHeapSize
(2)-Xmx:最大分配内存,默认为物理内存1/4 —— 等价于-XX:MaxHeapSize
(3)-Xss:设置单个线程的大小,一般默认为512K~102 —— 等价于-XX:ThreadStackSize
代码案例:
package
运行程序后,执行查看
![af2bcfc8eb1357d74b28f60213c71a6d.png](https://i-blog.csdnimg.cn/blog_migrate/05ad1fb5cbb759c352678a385e62ad33.jpeg)
解决以上问题:
把参数-XX:MetaspaceSize=1204m改成-Xss128K
![4a057a5aa3886419ce3d1cc72ca9ec2e.png](https://i-blog.csdnimg.cn/blog_migrate/5e1b103744afe99acbcf6b1a4a3b2d64.jpeg)
再次启动运行并执行命令:
![7ec805d417ae149aa399aac0960ec959.png](https://i-blog.csdnimg.cn/blog_migrate/f465e7df7548577ed9f37eaac2c44d3e.jpeg)
原理:如-XX:ThreadStackSize=0时,代表用户系统出场默认值;
查看oracle官网资料:https://docs.oracle.com/javase/8/docs/index.html
![999b2cf066e357e6bb32f4010136d368.png](https://i-blog.csdnimg.cn/blog_migrate/e08964553f8874be773630f94a2af261.jpeg)
![2028f116d37f46695db888e03a334432.png](https://i-blog.csdnimg.cn/blog_migrate/ce9d88eb062e499e61383d4b79f30bc7.jpeg)
在java虚拟机中,栈管运行,堆管存储
![7f65c150a19d598dca1427c17eade688.png](https://i-blog.csdnimg.cn/blog_migrate/1e044ef4549639a8c28810f9ae6ed600.jpeg)
由栈空间有128,如图所示:
![437c74fcc93bf0827450f24b622e973a.png](https://i-blog.csdnimg.cn/blog_migrate/640051ec2fffb237bfb7ebd00348462e.jpeg)
若无指定配置Vm参数,它的栈空间的值为0,这个问题我们又当如何解释呢?
我们可以根据java8的官网信息去验证:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html
![13975e0ede9522f6d3b055a60fc8b5f4.png](https://i-blog.csdnimg.cn/blog_migrate/89318472f218a936494afd1ac18f0a97.jpeg)
其次,不管时java9、java10、java11、java12都是默认于平台。
https://docs.oracle.com/en/java/javase/11/tools/java.html#GUID-3B1CE181-CD30-4178-9602-230B800D4FAE
![c4b055d73e47713eb27da5afb15ca59e.png](https://i-blog.csdnimg.cn/blog_migrate/806560fe06421d9340e8880ff305c41d.jpeg)
https://docs.oracle.com/en/java/javase/12/docs/specs/man/java.html
![29b45d68345c3a47b6df7413eafc4d37.png](https://i-blog.csdnimg.cn/blog_migrate/111953016bb871365e3f871d903cd350.jpeg)
3、常用基础参数元空间MetaspaceSize
(1)-Xmn:设置年轻代大小
(2)-XX:MetaspaceSize:设置元空间大小
其中,元空间的本质与永久代类似,都是对jvm规范中方法区的实现。不过元空间与永久代之间最大的区别在于: 元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制
查看初始参数
-
![95865567bb4a7d027429697643f3b1c3.png](https://i-blog.csdnimg.cn/blog_migrate/9041cade564b211ac54599350bda5151.jpeg)
运行程序后,如下图,发现会自定义参数打印数据(串行垃圾回收器)
![bfbba94cbf74135cd483b1e17f0b238a.png](https://i-blog.csdnimg.cn/blog_migrate/b8a915ebdc3b395e01f15fea3de5326b.jpeg)
其中:
-XX:+UseSerialGC 串行垃圾回收器
-XX:+UseParallelGC 并行垃圾回收器 ( jdk1.8 默认)
运行的参数值:
//串行垃圾回收器
另一种配置参数:并行垃圾回收器
-
![09fea7e6728bdcead423a47d3201038f.png](https://i-blog.csdnimg.cn/blog_migrate/da6bc4265f5a842c7291b73fb2c1c060.jpeg)
运行程序后,如下图:
![4d4a07645bd962e7b13af48bbc0024d3.png](https://i-blog.csdnimg.cn/blog_migrate/4c9f2f4f3cdd179f413a0a5a51b93bbf.jpeg)
运行的参数值:
//并行垃圾回收器 ( jdk1.8 默认)
4、常用基础参数PrintCDetails回收前后对比讲解
(1)查看垃圾回收细节情况信息
-
启动程序:垃圾回收细节情况信息
![a2b115a669336fa38daba3919da81c0c.png](https://i-blog.csdnimg.cn/blog_migrate/1fff0a90af747d2e75ea280047c870c3.jpeg)
若在生产环境中,出现另类的情况,比如说把垃圾回收内存爆出现象,配置参数
-
![25f9090c77497d4592aa8d23f51b0a6a.png](https://i-blog.csdnimg.cn/blog_migrate/f04202bd732fe89f97d6e27b9392ca29.jpeg)
//代码演示:
启动程序,控制台打印输出:
![8214d81873161ee73381a3e411d9b39f.png](https://i-blog.csdnimg.cn/blog_migrate/cba3fa064d346c562cb5ed594477dc20.jpeg)
oom挂了
Exception
一般了说,GC在新生区
![fdf8d9f5b251234ff6541150ef6199f5.png](https://i-blog.csdnimg.cn/blog_migrate/578d6debf32cd9f9e11cf6d396aeb55d.jpeg)
而Full GC在年老区
![b20912f2628fa876618d2cfde8dd7124.png](https://i-blog.csdnimg.cn/blog_migrate/a6c1b06839b1bd21c2d44a46a67ee9f7.jpeg)
5、常用基础参数SurvivorRation讲解
设置新生代中eden和S0/S1空间的比例默认:
-
假如:
-
SurvivorRation值就是设置eden区的比例占多少,S0/S1相同
代码案例演示:
配置jvm参数:
//配置串行垃圾回收
![0727f231cdd7619361db53bcef13278f.png](https://i-blog.csdnimg.cn/blog_migrate/00993bfac5105f8181438fcd13f6fed4.jpeg)
启动程序,输出:默认值,参数没有做更改
![f6d582d7bad493666e2f21c9f5399c75.png](https://i-blog.csdnimg.cn/blog_migrate/f0f1972399744e363c7efcc7afb8e766.jpeg)
若想要更改默认参数,在idea修改jvm的配置参数即可:
-
打印输出:
![ec61d08b155ac58db991de10622f33e4.png](https://i-blog.csdnimg.cn/blog_migrate/65c29279999b1e8b4d7de6100b54927a.jpeg)
若想更改别的参数,比如设置为4
-XX:+PrintGCDetails -XX:+UseSerialGC -Xms10m -Xmx10m -XX:SurvivorRation=4 //4倍
打印输出:
![cf60fe794e82f78bc89e6562786d1912.png](https://i-blog.csdnimg.cn/blog_migrate/9fabafb4bac0a1385555084a4f333fd4.jpeg)
6、常用基础参数NewRation
配置年轻代与老年代在堆结构的占比默认,-XX:NewRation=2,新生代占1,老年代占2,年轻代占整个堆的1/3。
假如:-XX:NewRation=4,新生代占1,老年代占4,年轻代占整个堆的1/5。
NewRation值就是设置老年代的占比,剩下的1给新生代
代码案例演示:
配置jvm参数,串行垃圾回收信息
-
![9dbe92f4159697c89b8c77855f472d24.png](https://i-blog.csdnimg.cn/blog_migrate/51e27c644037019ff4f095c46c968c23.jpeg)
打印输出:
![9e13a0cd47c4e9281d9344531d4a764e.png](https://i-blog.csdnimg.cn/blog_migrate/eae18dc650d8cad16c28a70427f42f70.jpeg)
若想要更改默认参数,在idea修改jvm的配置参数即可,修改后新生代与老年代都会发生变化
-
打印输出:
![6d61fd61305ead5b0e94170ccc571efc.png](https://i-blog.csdnimg.cn/blog_migrate/0d578b02026c9ced359f182867ecafc0.jpeg)
若想要更改参数2
-
打印输出:
![c1fb409cf750d5bc579bfb18b87bc1e2.png](https://i-blog.csdnimg.cn/blog_migrate/e6342d55cebd30c7af91c7cf9a6281ad.jpeg)
![7fe427b3bec889161be967ffd526209a.png](https://i-blog.csdnimg.cn/blog_migrate/3d71ccec89c7925ff994ad6857790448.png)
7、常用基础参数MaxTenuringThreshold
若我们在idea不配置虚拟机参数
![9bb54c705141d898480feeaece450c2b.png](https://i-blog.csdnimg.cn/blog_migrate/46890f4a4514996bb3a0d2003249d5e9.jpeg)
代码案例:
package
启动程序,打印输出,查看
E:
![e1547e50b5023430179356ecfcc21a59.png](https://i-blog.csdnimg.cn/blog_migrate/2cdf443eb5479847c82abe6c1f4f7c9c.jpeg)
注意:在java8默认参数的范围0~15,调优参数系统已经配置好了,若超过15系统不许,会出现错误。
如设置参数为20
-
运行报错信息,如图所示:java8限制了
![082809d1e5c5e117e4a7b5c85b6ec8a5.png](https://i-blog.csdnimg.cn/blog_migrate/e923c30e13cc1114a0f6a1906a1f8327.jpeg)
不超过15即可,如设置参数为12
-
![3e10ae19759a8dab577bf4abd7679586.png](https://i-blog.csdnimg.cn/blog_migrate/9d3c3275a0484927a8f4e330e6ef8c28.jpeg)