首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >任意JVM行为

任意JVM行为
EN

Stack Overflow用户
提问于 2010-07-05 13:18:41
回答 2查看 158关注 0票数 1

假设6-7服务器的设置与相同的java版本"1.6.0_18“OpenJDK运行时环境(IcedTea6 1.8) (fedora-36.b18.fc11-i 386) OpenJDK服务器VM (build 14.0-b16,混合模式)相同。

每个程序运行一个程序(内存和CPU密集型)数小时甚至几天,多次成功地完成(获取统计数据之类的东西),但在一台机器上,无论参数或我是如何编写的(javac -source 1.5 *. javac /javac -O -source 1.5,javac **,想象一下自己的组合:)

或者运行它(-Xms200000k或只运行java blabla.java,您就知道了)

我最终得到,而不是在特定的时刻或迭代"java.lang.ArrayIndexOutOfBoundsException:-1341472392“?!第一件事,程序将永远不会工作这么大的值,更不用说负。(代码行是一个包含整数的ArrayList调用)(正如我注意到的那样,这个数字每次都是不同的)

还请注意,我可以“恢复”一个崩溃的测试,我可以在这台机器上,它很少做更多的测试,再次崩溃。

没什么大不了的,我不拥有这些盒子,其他的也都在工作,但这对我来说很奇怪。

出于个人兴趣,这是如何发生在不太乐观-无论如何,OpenJDK?

EN

回答 2

Stack Overflow用户

发布于 2010-07-05 13:33:16

听起来很奇怪。用于索引数组的变量是长的,还是曾经受到长变量的影响?在这种情况下,对变量的访问不能保证是原子的:

来自http://java.sun.com/docs/books/jls/second_edition/html/memory.doc.html#28733

如果一个双变量或长变量未声明为易失性变量,则为了加载、存储、读取和写入操作,它们将被视为是两个变量,每个变量为32位:规则要求这些操作之一的地方,执行两个这样的操作,每32位半执行一个操作。双变量或长变量的64位编码成两个32位量的方式是与实现相关的。对易失性变量的加载、存储、读和写操作是原子的,即使变量的类型是双倍或长的。

如果您怀疑这可能是问题所在,可以尝试将索引变量声明为易失性变量,或者使用其他同步方法(例如使用AtomicLong或类似的方法)。

票数 3
EN

Stack Overflow用户

发布于 2010-07-05 14:30:02

如果这是一个单线程Java应用程序,我怀疑是硬件故障。当然,除非您有办法运行硬件(例如内存)诊断,否则很难证明这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3179771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档