Java VM 对堆栈红色区域的无效访问

Posted

技术标签:

【中文标题】Java VM 对堆栈红色区域的无效访问【英文标题】:Invalid access of stack red zone from Java VM 【发布时间】:2010-12-02 20:57:15 【问题描述】:

我正在尝试找出在 Java 中可能导致此错误的原因:

Invalid access of stack red zone 0x115ee0ed0 rip=0x114973900

有没有人遇到过这个错误信息?它实际上是在杀死 JVM,一切都停在那里。

我目前正在使用这个版本的 Java:(在 OS X 10.6 上)

java version "1.6.0_15"
Java(TM) SE Runtime Environment (build 1.6.0_15-b03-219)
Java HotSpot(TM) 64-Bit Server VM (build 14.1-b02-90, mixed mode)

我正在寻找的只是一些关于如何避免再次遇到这种情况的解释和提示。

提前致谢!

【问题讨论】:

【参考方案1】:

如果这对其他人有帮助。 我遇到这个错误是因为如果一个错误的字符串传递给 JSONArray.fromObject(jsonString);

我正在跑步: java版本“1.6.0_29” Java(TM) SE 运行时环境 (build 1.6.0_29-b11-402-10M3527) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.4-b02-402,混合模式) OSX 10.6.8

jsonString一开始有一个空值,错误是:

堆栈红色区域0x10d446ba0 rip=0x10c384b87的访问无效

总线错误

这完全杀死了 jvm。

一旦我发现这是错误的 json 字符串,修复就很容易了。

希望对某人有所帮助。

【讨论】:

【参考方案2】:

如前所述,这似乎是隐蔽的堆栈溢出。提高堆栈大小 JVM 参数 (-Xss)。在我的例子中,从 -Xss128k 到 -Xss1024k 就可以了。

【讨论】:

【参考方案3】:

我今天在 OSX 上发现了同样的错误。追踪到相当于实体bean中的stackOverlfow

【讨论】:

【参考方案4】:

如果不查看您的代码,很难说出导致错误的原因,但这里是关于红色区域的解释以及讨论该问题的几个链接。

每个内存块分配给一个 应用程序带有领先和 尾随“redzone”,这是一个特殊的 之前在内存中的签名和 就在分配给 应用。如果申请是 要覆盖该区域之外,则 红区签名将是 覆盖。然后后来在 应用程序崩溃,你得到这个 返回内存时异常结束,并且 操作系统可以检查红色区域。

此问题已在 Mac OSX 上发现,因此当未找到类时,它可能与类加载器问题有关,但在 mac osx 上,它被报告为红色区域访问。 所以用 JDK 1.5 试试看能否重现问题。

http://osdir.com/ml/java.objectweb.asm/2007-07/msg00004.html

http://wiki.geneontology.org/index.php/OEWG_20090505

http://forums.oracle.com/forums/thread.jspa?threadID=429325

【讨论】:

有趣。我会试一试。 今天看到了。原来是堆栈溢出。显然,这些天来,您不能保证从无限递归方法调用中获得 ***Exception。

以上是关于Java VM 对堆栈红色区域的无效访问的主要内容,如果未能解决你的问题,请参考以下文章

合并复杂对象时堆栈红色区域的访问无效

堆栈红色区域的实际大小是多少? [复制]

linux是不是在较低的堆栈端下方提供了保证的不可访问的内存区域?

当我们有一个红色区域时,为啥我们需要堆栈分配?

雪花 - 使用舞台区域失败。原因:[您提供的 AWS 访问密钥 ID 无效。]

创建 azure vm 时,terraform 抛出“无效或未知的密钥:区域”