Wildfly、Jboss OutOfMemoryError

主要原因就是部署的Jar包或包含的lib文件太多或太大,或者有逻辑错误,导致程序的运行内存过大,超出限制。

比如在部署Drools规则引擎的 workbench时,其中包含了大量的jar包,也占用很多内存,则会出现内存溢出异常。

此时,在异常的描述信息中会显示,哪个区域的内存不足,是MetaSpace,还是其他。然后针对性进行修改即可。

关于如何配置内存参考文章《WILDFLY内存WILDFLY及内存配置》。

JVM参数的设置

JVM启动参数共分为三类
1. 标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容;
2. 非标准参数(-X),指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,并不保证所有jvm实现都满足,所以为了提高性能,往往需要调整这些参数,以求系统达到最佳性能。另外这些参数不保证向后兼容,也即是说“如有变更,恕不在后续版本的JDK通知”(这是官网上的原话);
3. 非Stable参数(-XX),这类参数在jvm中是不稳定的,不适合日常使用的,后续也是可能会在没有通知的情况下就直接取消了,需要慎重使用。
JVM 内存的三个主要的域
三个主要域:新生代、老年代以及永久域(jdk8及之后为元空间)。

JVM生成的所有新对象放在新生代中。一旦对象经历了一定数量的垃圾收集循环后,便进入老年代。而在元空间中是用来存储JVM的反射对象的,如class和method对象。

而且GC(Garbage Collection)不会在主程序运行期对元空间进行清理。其中新生代和老年代属于堆,永久代是与堆物理连续,但逻辑上不输于堆,即非堆。而jdk8之后的元空间,彻底与堆分离,存储在本地内存中。

各主要参数的作用
  -Xms:设置jvm内存的初始大小
        -Xmx:设置jvm内存的最大值
        -Xmn:设置新域的大小(这个似乎只对 jdk1.4来说是有效的,后来就废弃了)
        -Xss:设置每个线程的堆栈大小(也就是说,在相同物理内存下,减小这个值能生成更多的线程)
        -XX:NewRatio :设置新域与旧域之比,如-XX:NewRatio = 4就表示新域与旧域之比为1:4
        -XX:NewSize:设置新域的初始值
        -XX:MaxNewSize :设置新域的最大值
        -XX:PermSize:设置永久域的初始值
        -XX:MaxPermSize:设置永久域的最大值
        -XX:SurvivorRatio=n:设置新域中Eden区与两个Survivor区的比值。(Eden区主要是用来存放新生的对象,而两个 Survivor区则用来存放每次垃圾回收后存活下来的对象)

windows下修改参数

1. windows系统修改standalone.conf.bat 、linux系统修改standalone.conf

Wildfly、Jboss内存溢出异(OutOfMemoryError)常原因及解决方案插图

2. 修改JAVA_OPTS JVM内存参数那一行,提高JVM的最大内存。主要是Xmx和MaxMetaspaceSize这两个参数。

Wildfly、Jboss内存溢出异(OutOfMemoryError)常原因及解决方案插图1

3. 重启wildfly,部署war包



Wildfly、Jboss内存溢出异(OutOfMemoryError)常原因及解决方案插图2

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2019/10/31/wildfly-out-of-memory-error-2/