我以前了解过JVM的内存分配,所以让我们今天进行验证。顺便说一下,通过测试学习了JVM的一些参数,但是测试是在构想中的,因此您必须首先在构想中设置JVM参数。
一、 idea设置全局JVM参数
共分三个步骤,第一步是在菜单栏中的“帮助”下选择“编辑客户VM选项”。


步骤2:您可以看到选定的参数,然后可以设置常规参数。记住在设置后重新启动创意。如下图所示:


第3步:重新启动后,检查结果。总和使用的值将显示在该想法的右下角。如果没有显示,则可以设置显示,如下图所示。选中设置中的红色框,然后单击“应用”以完成。


二、为应用程序配置JVM参数
第一步:在“运行”下选择“编辑配置”。


第2步:选择要配置的应用程序,然后在右侧的VM选项中设置JVM参数。


三、 JVM内存验证
是时候再次提供该内存分布图了,


如上图所示,程序计数器不会抛出异常,只是忽略它,主要是针对其余的少数验证。
1、 Java堆验证
从先前的研究中,我们知道所有对象和数组都存储在堆中,主要是对象。第一个是控制堆大小Xms(初始堆大小)和-Xmx(最大对大小)的两个参数。
测试应用程序的JVM参数设置:
-Xms20m -Xmx20m -XX:+ HeapDumpOnOutOfMemoryError
+ HeapDumpOnOutOfMemoryError参数可以是内存溢出存储内存的快照,可用于分析错误。测试结果如下:


在红色框中创建的文件是内存快照文件。在项目的工作目录中,这是在内存溢出之前存储的内存条件。您可以使用特殊工具进行分析。这是一个分析网站,上载转储文件,您可以对其进行简单分析,并且不会键入URL。详细信息如下:


2、虚拟机堆栈和本地方法堆栈验证
HotSpot虚拟机无法区分虚拟机堆栈和本地方法堆栈(您可以通过java -version检查哪个虚拟机),因此我们一起对其进行了测试。相应的JVM参数-Xss(每个线程的堆栈大小)
我们知道堆栈中有堆栈框架,并且该堆栈框架与线程的方法相对应,因此,只要您调用更多方法,就可以对其进行测试。最好的方法是递归。
测试应用程序的参数配置:
-Xss128k -XX:+ HeapDumpOnOutOfMemoryError
测试结果如下:


虚拟机堆栈以前曾说过,有两种类型的溢出。线程请求的堆栈深度大于虚拟机的允许深度,并且将引发StackOverflowError异常。如果可以动态扩展虚拟机堆栈,则在扩展期间不申请内存时将引发OutOfMemoryError。
这是第一种情况。对于第二种情况,如果堆栈在单线程情况下动态扩展并且内存不足,那么它也应该属于不能申请更多空间的堆栈,因此这是堆栈溢出。可以清楚地看到OutOfMemoryError和StackOverflowError具有包含关系。如果在多个线程中。每个线程的堆栈都在扩展内存,这将消耗物理内存并导致OutOfMemoryError。
机器的内存是有限的。建立太多线程导致内存溢出。如果无法减少线程数,则可以减少堆并减少堆栈容量,以换取更多线程。可以深入讨论这一部分,主要讨论各个模块之间的关系及其各自的局限性。
3、方法区域验证
方法区域主要存储类信息,常量,静态变量和由虚拟机加载的即时编译器编译的代码。因此,我们通常会遇到这样的异常:已加载的类太多。例如,诸如spring之类的框架将增强类,并使用诸如CGLib之类的字节码技术。增强的类越多,需要的类就越多。大的方法区域,确保可以将动态生态类加载到内存中。
jdk8的方法区域已成为使用直接内存的元空间。因此它不同于jdk7使用的参数。具体参数如下:
jdk7:-XX:PermSize = 10m -XX:MaxPermSize = 10m
jdk8:-XX:MetaspaceSize = 10m -XX:MaxMetaspaceSize = 10m
结果如下:





jdk8的异常现象更加明显,清楚地表明元空间内存正在溢出。
4、直接内存验证
如果未设置直接内存,则它与-Xmx(最大堆)相同。可以通过参数-XX:MaxDirectMemorySize设置直接存储器。直接内存通常与NIO有关。在DirectByteBuffer中,由Unsafe操纵的直接内存,DirectByteBuffer是计算抛出的异常,它知道内存不足,而unsafe.allocateMemory()是申请内存的方法。测试代码如下:
测试参数:-Xms20m -XX:MaxDirectMemorySize = 10m


直接存储器的溢出相对简单,转储文件相对较小。如果您发现内存溢出没有明显的异常,并且转储文件相对较小,则应考虑直接内存溢出,这是否是在程序中使用NIO的原因。
四、摘要
学习了几个常用的JVM参数,总结如下


OutOfMemoryError缩写为OOM。在学习了一些基本的内存溢出之后,它将在将来有更好的帮助。当您在工作中遇到内存溢出时,您可以根据异常信息判断该区域中的内存溢出,了解哪些代码可能导致这些区域中的内存溢出,并了解一些处理方法。
每天为Java程序员提供的学习笔记,如果您对它的理解不正确,欢迎交流和讨论!


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-375169-1.html
美舰在我军的严厉警告下夹着尾巴逃跑了