偶遇奇怪的JVM报错:JVMTI_ERROR_WRONG_PHASE(112)

本文分享了一段Java代码,定义了一个名为Die的类,并进行了简单的测试。在Eclipse环境下运行时偶尔出现了JVMTI_ERROR_WRONG_PHASE错误,经过多次测试该错误未再次出现。

写了一个很简单的类,代码如下,接着就做简单的测试。

public class Die {
	private int mCurrentPoint;

	public Die() {
		mCurrentPoint = getRandom();
	}

	public int roll() {
		int p = getRandom();
		setCurrentPoint(p);
		return p;
	}

	public int getCurrentPoint() {
		return this.mCurrentPoint;
	}

	private void setCurrentPoint(int p) {
		this.mCurrentPoint = p;
	}

	private int getRandom() {
		int r = (int) (Math.random() * 10) + 1;
		if (r > 6) {
			r -= 6;
		}
		return r;
	}

	public static void main(String args[]) {
		Die d = new Die();
		System.out.println(d.getCurrentPoint());
		d.roll();
		System.out.println(d.getCurrentPoint());

	}

}

在Eclipse下,按F11,运行Main方法进行测试。按了大概六七次那样,突然报出来一个这样的错误。

6
2
FATAL ERROR in native method: JDWP on checking for an interface, jvmtiError=JVMTI_ERROR_WRONG_PHASE(112)
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATIONJDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on checking for an interface [../../../src/share/back/util.c:1311]

用的是JDK1.7,没加其它运行参数。再看一下代码,好像也没什么问题啊。

于是继续测试,这一次,连续按F11十几次,也没发现再出现那个错误。又长见识了。。。

在使用 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 ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值