发布时间:2026-01-29
浏览次数:0
前面的时候学习了JVM的内存分布情况,就在今天要去进行验证的操作,顺便借助测试来学习一下JVM的几个参数,只是测试是在idea当中,所以首先要在idea上对JVM参数进行设置。
一、idea设置全局的JVM参数
总共是三步,进行第一步之时,要在菜单栏Help那里,去选择Edit VM .......
接下来的这一步:能够瞧见被选中之后的对应的那些参数intellij idea 配置,紧接着便能够去进行常规参数的设置操作,在设置完了之后可别忘了要重新启动一下 idea。接下来给张这样的图:
第三步,重启之后,去查看结果,于 idea 的 最右下角那儿将会展示总的以及使用的,要是没有展示的话能够进行设置展示,就如同下面这张图所示,在其中勾选那个呈现红色框的选项,点击应用而后完成。
二、针对应用配置JVM参数
第一步:选择Run下面的Edit ....
第二步:去挑选想要进行配置的应用,而后于右侧的VM那儿设置JVM参数。
三、JVM内存验证
又要祭出那张内存分布图了,
正如上面所呈现的图那样,程序计数器并不会把异常给抛出来,暂且先不去管它了,关键的是剩下那几个方面的验证 。
1、Java堆验证
根据之前所进行的学习了解到,堆之中放置的皆是对象以及数组,其中占据主要占比的构成部分是对象,首先存在两个控制堆大小的参数,分别为-Xms(其代表的是初始堆大小),还有-Xmx(此为最大对大小) 。
测试应用的JVM参数设置:
- - -XX:+
其中+
内存溢出存储内存快照能够作为参数,此参数可是用于误差剖析,测试结果呈现于下方图示 。
以红框所框住的,乃是创建而成的文件,此即为内存快照文件,其处于你项目的工作目录范围之内,这是在内存溢出之前所存储的内存状况情形,能够借助专门的工具予以分析。在此处分享一个在线的分析网站,将 Dump 文件上传上去便可进行简单的分析,网址就不予以写明了,详细情形如下图所示:
2、虚拟机栈和本地方法栈验证
具有不区分虚拟机栈以及本地方法栈特性的虚拟机(借助java -能够查看属于何种虚拟机),因此将二者放在一起进行测试了,与之对应的是名为-Xss的JVM参数(该参数用于表示每个线程的栈大小) 。
我们清楚,栈内部所存储的是栈帧,栈帧与之相对应的乃是线程的方法,于是,只要调用的方法数量较多,便能够测试出来,而最佳的办法便是进行递归。
测试应用的参数配置:
- -XX:+
测试结果如下图:
虚拟机栈,之前讲过存在两种溢出情形,其一为线程所请求的栈深度,大于虚拟机所允许的深度,此时将会抛出异常,其二是倘若虚拟机栈能够进行动态扩展,那么在扩展之际,若未申请到内存,便会抛出异常 。
这里,我们处于第一种情形。对于第二种情形而言,要是在单线程状况下,栈进行动态扩展致使内存不足,那么这理应也是属于栈无法申请到更多空间的情况,所以这便是栈溢出,能够明显地看出是存在包含关系的。要是处于多个线程的情况下,每个线程的栈都在扩展内存,就会将物理内存耗尽从而造成那种结果。
一机器的内存存有局限,建立过多个线程致使内存溢出,若无法减少线程,那么能够经由减少堆以及减少栈容量来换取更多线程,这部分能够深入探讨,主要探讨各个模块的关系,以及各自的限制 。
3、方法区验证
在方法区里,主要存放着的类信息、常量、静态变量以及即时编译器编译后的代码,是被虚拟机加载的。所以,我们平常碰到的这类异常,通常是因为加载的类数量过多。比如说,这类框架会对类实施增强操作,并且都会运用到CGLib这种字节码技术。增强的类所占数量越多,那么要保证动态生态所需class能够加载进内存,就需要越大的方法区进行支撑。
你所提到的jdk8,其方法区已然转变成为了元空间,而这元空间所运用的乃是直接内存,因此,它和jdk7所使用的参数并不相同,具体的参数情况如下:
jdk7:-XX:=10m -XX:=10m
jdk8:-XX:=10m -XX:=10m
结果如下图:
jdk8的异常更加明显,明确表明是了元空间内存溢出。
4、直接内存验证
若直接内存未被设定成与 -Xmx(堆最大)相同,能够借助参数 -XX:去对直接内存予以设置。直接内存一般而言和 NIO 存在关联,在其中经由操作的直接内存,是凭借计算得出内存不足进而抛出的异常,而(.())才算是去申请内存的方式。测试代码如图所示:
测试参数:- -XX:=10m
直接内存出现溢出这种情况相对较为简单,其生成的dump文件体积也比较小。要是察觉到内存发生溢出,且并未出现明显异常状况,同时dump文件体积较小,那么此时就应当考虑到有可能是直接内存出现了溢出,这是不是因为程序当中运用了NIO所导致的呢。
四、总结
学习了几个常用JVM参数,总结如下
简称为OOM,在学习了几个基本的内存溢出情况之后,对于往后才能够拥有更好的助力。在工作期间碰到内存溢出之际,可以依据异常信息从而断定是哪个区域出现内存溢出intellij idea 配置,并且还知道何种代码有可能引发这类区域呈现内存溢出,况且知晓一些处理办法。
Java程序员日常学习笔记,如理解有误欢迎各位交流讨论!
如有侵权请联系删除!
Copyright © 2023 江苏优软数字科技有限公司 All Rights Reserved.正版sublime text、Codejock、IntelliJ IDEA、sketch、Mestrenova、DNAstar服务提供商
13262879759
微信二维码