堆内存初始大小快速复习

首先,最司空见惯的一条初始堆内存大小和最大堆内存大小必须配成一样的,也就是-Xms=-Xmx。
15.互联网大厂高频面试题-JVMGC·下_其他

基础知识复习

15.互联网大厂高频面试题-JVMGC·下_命令行参数_02
案例:
15.互联网大厂高频面试题-JVMGC·下_堆内存_03
查看堆的初始值和最大值,可以用程序级别和命令级别,上述就是程序级别,命令级别就是jinfo -flag 参数名称 java进程号。

常用参数-栈内存Xss

15.互联网大厂高频面试题-JVMGC·下_命令行参数_04
15.互联网大厂高频面试题-JVMGC·下_java_05
这俩是输入XX参数,是初始堆内存和最大堆内存的缩写。
15.互联网大厂高频面试题-JVMGC·下_堆内存_06
线程栈是线程私有的。思考下面这种现象,线程栈的大小在运行起来的时候是0?
15.互联网大厂高频面试题-JVMGC·下_命令行参数_07
如果设置一下vm options,那么再重复查看,则变成设置的值。
15.互联网大厂高频面试题-JVMGC·下_java_08
查一下oracle官网的文档:
15.互联网大厂高频面试题-JVMGC·下_堆内存_09
从这个位置定位你的知识域,如果是java虚拟机,就点进去相应的位置查找就行了。
15.互联网大厂高频面试题-JVMGC·下_堆内存_10
-Xss的大小是依赖平台的,其他平台基本都是默认1024k,但是windows平台是依赖于虚拟内存的(默认出厂值)。
关于这个解释jdk8-9-10的解释都是一样的。

常用参数-元空间MetaSpaceSize,Xmn

15.互联网大厂高频面试题-JVMGC·下_命令行参数_11
Xmn这个参数一般不用调。除非你的业务比较特殊。
15.互联网大厂高频面试题-JVMGC·下_其他_12

对于元空间这种参数,就是应该调整的那种,一般是调大。
元空间只受本地内存(native memory)的限制,但是出厂调的并不大,所以有时也会发生元空间的溢出。下图是16gwin系统的默认大小,此时没启动java程序:
15.互联网大厂高频面试题-JVMGC·下_其他_13
15.互联网大厂高频面试题-JVMGC·下_命令行参数_14
换算之后,元空间只设置了21M,所以可能会发生OOm异常(元空间溢出)。
就可以配置大一些来解决这个问题:
15.互联网大厂高频面试题-JVMGC·下_其他_15
15.互联网大厂高频面试题-JVMGC·下_命令行参数_16
这是一个典型设置案例(上图):
初始堆空间是128m,最大堆空间4g,初始栈大小1024k,元空间512m,打印常见命令行参数,打印gc日志,使用串行垃圾回收器。
先什么都不配置,打印一下常见的命令行参数,会得到16gwin系统的jvm配置:这是java8出厂自带的,没有修改过。使用的并行垃圾回收器。
15.互联网大厂高频面试题-JVMGC·下_堆内存_17
设置这个典型配置到idea的vm options:
15.互联网大厂高频面试题-JVMGC·下_java_18
这个典型配置用到的参数,面试的时候答上去就可以了。主要是答这些点。
修改之后,打印的内容改为:
15.互联网大厂高频面试题-JVMGC·下_堆内存_19
设置的参数都产生了效果,发生了改变。

常见基础参数PrintGCDetail回收前后对比讲解

在vm options参数种加入-XX:PrintGCDetails.然后打印个helloi world。查看控制台的情况。
15.互联网大厂高频面试题-JVMGC·下_java_20
打印出了垃圾回收的细节情况。
通过设置堆的初始大小和max大小为10m,然后创建一个大对象:
15.互联网大厂高频面试题-JVMGC·下_堆内存_21
就会看到喜闻乐见的oom:
15.互联网大厂高频面试题-JVMGC·下_java_22
15.互联网大厂高频面试题-JVMGC·下_其他_23

GC

15.互联网大厂高频面试题-JVMGC·下_java_24
解析GC信息,如上图:

FULL GC

15.互联网大厂高频面试题-JVMGC·下_堆内存_25
15.互联网大厂高频面试题-JVMGC·下_其他_26

15.互联网大厂高频面试题-JVMGC·下_java_27

常用基础参数SurvivorRatio

该参数用来设置幸存区的比例。堆的结构如下:
15.互联网大厂高频面试题-JVMGC·下_命令行参数_28
15.互联网大厂高频面试题-JVMGC·下_命令行参数_29
具体内容:
15.互联网大厂高频面试题-JVMGC·下_命令行参数_30
默认的eden区跟survivor区是8:1:1.可以通过详细gc信息看出来,通过SurvivorRatio这个参数,可以该百年比例,这个参数说明的是eden区的比例,from区和to区是一样大的。
15.互联网大厂高频面试题-JVMGC·下_命令行参数_31
设置之后,比例就变了,如上图。2368:512:512,接近4:1:1

常用基础参数NewRatio讲解

15.互联网大厂高频面试题-JVMGC·下_堆内存_32
正常使用默认的2:1就好了。如果新生代配置的份额特别小,那么会频繁的触发gc,性能也不好。
15.互联网大厂高频面试题-JVMGC·下_堆内存_33
设置vm options 查看打印区别。
15.互联网大厂高频面试题-JVMGC·下_命令行参数_34
修改之前:
15.互联网大厂高频面试题-JVMGC·下_堆内存_35
修改之后:
15.互联网大厂高频面试题-JVMGC·下_堆内存_36
通过这个参数调整新生代:老年代的比例。

常用参数之MaxTenuringThreshold

15.互联网大厂高频面试题-JVMGC·下_其他_37
15.互联网大厂高频面试题-JVMGC·下_命令行参数_38
这个参数jvm出厂默认为15.如果设置的超过15,则jvm运行失败,如下图:
15.互联网大厂高频面试题-JVMGC·下_java_39
jvm规定不允许超过15.
以前jdk6-7的时候,可以设置为31,这样养老区有很少的对象,就不容易触发full gc,可以提升效率。
但是jdk8之后,就不允许乱改了,有了取值范围[0-15].