idea使用Jrebel或Tomcat运行时,提示堆栈内存溢出(java.lang.StackOverflowError)

在IDEA中使用JRebel启动项目时出现内存溢出错误,导致Spring框架处理请求失败,StackOverflowError异常。问题源于JRebel需要大量内存而JVM设置的堆内存不足。解决方案包括调整JVM参数增大 PermSize 和 MaxPermSize,或者尝试使用Jrebel+Xrebel模式运行项目。

idea里面装JRebel后,启动出现内存溢出问题

问题场景复现:

2021-04-21 09:21:29.302 [http-nio-8080-exec-3] ERROR o.jeecg.common.exception.JeecgBootExceptionHandler:64 - Handler dispatch failed; nested exception is java.lang.StackOverflowError
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.StackOverflowError
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1055)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)

Caused by: java.lang.StackOverflowError: null
	at java.base/java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:64)
	at org.bouncycastle.asn1.ASN1Object.getEncoded(Unknown Source)
	at org.bouncycastle.asn1.pkcs.RSAPublicKey.toASN1Primitive(Unknown Source)
	at org.bouncycastle.asn1.ASN1OutputStream.writeObject(Unknown Source)
	at org.bouncycastle.asn1.ASN1Object.encodeTo(Unknown Source)
	at org.bouncycastle.asn1.ASN1Object.getEncoded(Unknown Source)

问题具体原因:

JRebel启动时需要大量的内存,JVM对永久区内存设置太小,堆内存过小所致

解决方案:

(1)不推荐:使用run或debug运行项目;
(2):切换使用Jrebel+Xrebel模式运行(前提:需更新ide插件Jrebel最新即可);
(3)配置tomcat内存大小
例:-server -XX:PermSize=512M -XX:MaxPermSize=1024m ;
在这里插入图片描述

使用 JRebel ,用户可能会遇到 `java.lang.VerifyError` 与 `JVMTI_ERROR_FAILS_VERIFICATION` 相关的错误。此类问题通常出现在 JVM 工具接口(JVMTI)验证失败的情况下,尤其是在使用 JRebel 进行热部署,JVM 无法正确验证某些类的字节码。 ### 原因分析 1. **JRebel 与 JVM 字节码增强机制冲突**:JRebel 通过字节码增强实现类的热替换,在某些情况下,JVM 的类验证机制(如 JVMTI)可能无法正确识别增强后的字节码,从而导致 `VerifyError` [^5]。 2. **JDK 版本不兼容**:JRebel 对某些 JDK 版本的支持可能存在兼容性问题,尤其是当 JDK 更新引入了新的字节码格式验证规则,可能导致 JRebel 生成的类无法通过验证 [^1]。 3. **类结构复杂使用了 Lambda 表达式**:当类中包含复杂的继承结构、匿名内部类 Lambda 表达式JRebel 的字节码增强过程可能生成 JVM 无法正确验证的类文件 [^5]。 ### 解决方案 1. **更新 JRebel 版本**:确保使用的是最新版本的 JRebel,官方通常会针对新 JDK 版本和字节码增强机制进行优化和修复 。 2. **禁用 JRebel 对特定类的增强**: - 在 `rebel.xml` 配置文件中排除特定类包,避免对某些复杂类进行热部署。 - 示例配置: ```xml <classpath> <dir name="/path/to/classes"> <exclude name="com.example.unsupported.*"/> </dir> </classpath> ``` 3. **调整 JVM 参数**: - 在启动参数中添加 `-Xverify:none`,禁用类验证(适用于开发环境): ```bash java -Xverify:none -javaagent:/path/to/jrebel.jar -jar your-app.jar ``` 4. **升级 JDK 版本**:确保 JDK 版本与 JRebel 兼容。如果当前使用的是较旧的 JDK,建议升级到官方推荐的版本 [^1]。 5. **检查 Lambda 表达式使用方式**:避免在 JRebel 热部署环境中使用复杂的 Lambda 表达式外部类引用,以减少字节码增强的复杂度 [^5]。 ### 示例代码:禁用类验证 以下是一个启动 Java 应用禁用类验证的示例命令: ```bash java -Xverify:none -javaagent:/path/to/jrebel.jar -jar your-application.jar ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值