文章目录
首先,最司空见惯的一条初始堆内存大小和最大堆内存大小必须配成一样的,也就是-Xms=-Xmx。
基础知识复习
案例:
查看堆的初始值和最大值,可以用程序级别和命令级别,上述就是程序级别,命令级别就是jinfo -flag 参数名称 java进程号。
这俩是输入XX参数,是初始堆内存和最大堆内存的缩写。
线程栈是线程私有的。思考下面这种现象,线程栈的大小在运行起来的时候是0?
如果设置一下vm options,那么再重复查看,则变成设置的值。
查一下oracle官网的文档:
从这个位置定位你的知识域,如果是java虚拟机,就点进去相应的位置查找就行了。
-Xss的大小是依赖平台的,其他平台基本都是默认1024k,但是windows平台是依赖于虚拟内存的(默认出厂值)。
关于这个解释jdk8-9-10的解释都是一样的。
Xmn这个参数一般不用调。除非你的业务比较特殊。
对于元空间这种参数,就是应该调整的那种,一般是调大。
元空间只受本地内存(native memory)的限制,但是出厂调的并不大,所以有时也会发生元空间的溢出。下图是16gwin系统的默认大小,此时没启动java程序:
换算之后,元空间只设置了21M,所以可能会发生OOm异常(元空间溢出)。
就可以配置大一些来解决这个问题:
这是一个典型设置案例(上图):
初始堆空间是128m,最大堆空间4g,初始栈大小1024k,元空间512m,打印常见命令行参数,打印gc日志,使用串行垃圾回收器。
先什么都不配置,打印一下常见的命令行参数,会得到16gwin系统的jvm配置:这是java8出厂自带的,没有修改过。使用的并行垃圾回收器。
设置这个典型配置到idea的vm options:
这个典型配置用到的参数,面试的时候答上去就可以了。主要是答这些点。
修改之后,打印的内容改为:
设置的参数都产生了效果,发生了改变。
在vm options参数种加入-XX:PrintGCDetails.然后打印个helloi world。查看控制台的情况。
打印出了垃圾回收的细节情况。
通过设置堆的初始大小和max大小为10m,然后创建一个大对象:
就会看到喜闻乐见的oom:
GC
解析GC信息,如上图:
FULL GC
该参数用来设置幸存区的比例。堆的结构如下:
具体内容:
默认的eden区跟survivor区是8:1:1.可以通过详细gc信息看出来,通过SurvivorRatio这个参数,可以该百年比例,这个参数说明的是eden区的比例,from区和to区是一样大的。
设置之后,比例就变了,如上图。2368:512:512,接近4:1:1
正常使用默认的2:1就好了。如果新生代配置的份额特别小,那么会频繁的触发gc,性能也不好。
设置vm options 查看打印区别。
修改之前:
修改之后:
通过这个参数调整新生代:老年代的比例。
这个参数jvm出厂默认为15.如果设置的超过15,则jvm运行失败,如下图:
jvm规定不允许超过15.
以前jdk6-7的时候,可以设置为31,这样养老区有很少的对象,就不容易触发full gc,可以提升效率。
但是jdk8之后,就不允许乱改了,有了取值范围[0-15].