问题标签 [jvm-hotspot]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
432 浏览

java - 为什么生成执行操作的 Java 代码比“解释器循环”运行得更慢?

我有一些对 BitSet 执行按位运算的 Java 代码。我有一个操作列表,可以通过循环来“解释”它们,但对我来说重要的是我可以尽快执行这些操作,所以我一直在尝试动态生成代码来应用它们。我生成 Java 源代码来执行操作并使用 Javassist 编译实现这些操作的类。

不幸的是,我动态生成的代码比解释代码运行得慢。这似乎是因为 HotSpot 正在优化解释代码,但没有优化编译代码:在我运行它几千次之后,我的解释代码运行速度是最初的两倍,但我的编译代码显示没有加速。与这个假设一致,我的解释代码最初比编译代码慢,但最终更快。

我不确定为什么会这样。我的猜测是 Javassist 可能使用了一个类加载器,它的类 HotSpot 没有触及。但我不是 Java 类加载方面的专家,所以我不确定这是否是一个合理的猜测或如何进行测试。以下是我使用 Javassist 创建和加载类的方法:

有没有人知道这里发生了什么?我真的很感激你能提供的任何帮助。

我在 Windows XP 32 位上使用 Sun 1.6 服务器 JVM。

0 投票
7 回答
1839 浏览

java - 有没有去除无用 goto 的 Java 字节码优化器?

问题:我有一个方法可以编译成超过 8000 字节的 Java 字节码。HotSpot 有一个神奇的限制,使 JIT 不会为超过 8000 字节的方法启动。(是的,拥有一个巨大的方法是合理的。这是一个标记器循环。)该方法在一个库中,我不想要求该库的用户必须配置 HotSpot 才能停用魔法限制。

观察:反编译字节码表明 Eclipse Java 编译器生成了很多无意义的 goto。(javac 甚至更糟。)也就是说,有些 goto 只能通过跳转到达。显然,跳转到 goto 的跳转应该直接跳转到 goto 跳转的地方,并且 goto 应该被消除。

问题:是否有针对 Java 5 类文件的字节码优化器,它可以扁平化无意义的跳转链,然后删除不必要的 goto?

编辑:我的意思是这样的模式:

显然,第二个 goto 只能通过跳转到 8701 来达到,这也可能是直接跳转到 0。

在第二次调查中,这种可疑的模式更为常见:

显然,人们希望编译器将“不等于”比较反转为“相等”比较,跳转到 8704 并消除 goto。

0 投票
6 回答
12862 浏览

java - JVM -XX:+StringCache 参数?

我最近在阅读 JRE 6 [ Java VM Options ] 中可用的所有 JVM 参数,并看到了这个:

-XX:+StringCache :启用常用分配字符串的缓存。

现在我一直认为 Java 保留了一个实习(正确的词?)字符串池,并且在使用文字进行字符串连接之类的操作时,它不是创建新对象,而是将它们从该池中拉出。有没有人使用过这个论点,或者可以解释为什么需要它?

编辑:我试图运行一个基准测试,看看这个参数是否有任何影响,并且无法让 Sun JVM 识别它。这是与:

所以我不确定这个论点是否有效。

0 投票
3 回答
4524 浏览

java - Java 小程序失败

我正在我的一台服务器上运行 Java Web 小程序。由于某种原因,特定用户无法访问它(错误文本出现在小程序的位置,上面写着“错误。点击查看详细信息”;这不是我放在标签之间的文本,即他的 JRE 已安装并出现在至少要正确安装,但由于某种原因它不能在我的小程序上运行。

我认为这与他对 JRE 的特殊“风味”有关——这个所谓的“HotSpot”版本。(请参阅:http ://www.experts-exchange.com/Programming/Languages/Java/Q_24405442.html如果您有 EE 帐户,我不记得我的副手了)。我对 Java 本身或它的变种不太熟悉 - 我只是页面中小程序的实现者(我没有编写它)。

该小程序对我和迄今为止的所有其他用户都适用。此外,它不应该引用他的错误中列出的文件,例如“ http://mywebsite.com/java/JavaVersionDisplayApplet/class.class ”。该文件位于“ http://mywebsite.com/java/JavaVersionDisplay.class ”。根据小程序程序员的说法,他的错误指向一个文件,该文件甚至没有在他的代码中的任何地方指定。

用户的错误如下:

0 投票
1 回答
29971 浏览

java - Java Class.getSimpleName() 和 .getName() 在 Cacao 和 Sun Java 上的行为不同

有谁知道为什么会发生这种情况?

这是来自 Java DBus 绑定 (2.6) 的一些修改行

现在查看 Cacao (0.99.4) 与 Sun 1.5 的输出差异

相对...

异常并不重要 - 它是由这种行为引起的......有什么想法吗?或者这是可可的一些奇怪的错误。

有谁知道 .getName() 是否依赖于虚拟机?

信息:

两个 JVM 上的 GNU Classpath 0.98 DBus 绑定 2.6

0 投票
4 回答
11351 浏览

java - 如何编写 Java 代码以允许使用 SSE 和消除边界检查(或其他高级优化)?

情况:

我正在优化 LZF 压缩算法的纯 java 实现,它涉及大量 byte[] 访问和基本的 int 数学,用于散列和比较。性能确实很重要,因为压缩的目标是减少 I/O 需求。我没有发布代码,因为它还没有被清理,并且可能会被大量重组。

问题:

  • 如何编写代码以使用更快的 SSE 操作将其 JIT 编译为表单?
  • 如何构造它以便编译器可以轻松消除数组边界检查?
  • 是否有关于特定数学运算的相对速度的广泛参考(等于正常加/减需要多少增量/减量,移位或与数组访问相比有多快)?
  • 我该如何优化分支——拥有大量带有短主体的条件语句,或者一些长的,还是带有嵌套条件的短的条件语句更好?
  • 使用当前的 1.6 JVM,在 System.arraycopy 击败复制循环之前必须复制多少元素?

我已经做了什么:

在我因过早优化而受到攻击之前:基本算法已经很出色了,但 Java 实现的速度不到等效 C 的 2/3。我已经用 System.arraycopy 替换了复制循环,致力于优化循环并消除了 un - 需要的操作。

我大量使用位旋转并将字节打包到整数中以提高性能,以及移位和屏蔽。

出于法律原因,我无法查看类似库中的实现,并且现有库的使用许可条款过于严格。

良好(已接受)答案的要求:

  • 不可接受的答案: “这更快”没有解释多少和为什么,或者没有用 JIT 编译器测试。
  • 边界答案:在 Hotspot 1.4 之前没有经过任何测试
  • 基本答案:将提供一般规则和解释,说明为什么它在编译器级别更快,以及大概快多少
  • 好的答案:包括几个代码示例来演示
  • 很好的答案:有 JRE 1.5 和 1.6 的基准
  • 完美答案:由从事 HotSpot 编译器工作的人提供,并且可以完全解释或参考要使用的优化的条件,以及它通常的速度有多快。可能包括由 HotSpot 生成的 java 代码和示例汇编代码。

另外:如果有人有详细说明热点优化和分支性能的链接,欢迎提供。我对字节码有足够的了解,因此在字节码而不是源代码级别分析性能的网站会有所帮助。

(编辑)部分答案:边界检查消除:

这取自提供的 HotSpot 内部 wiki 链接:https ://wikis.oracle.com/display/HotSpotInternals/RangeCheckElimination

HotSpot 将在以下条件下消除所有 for 循环中的边界检查:

  • 数组是循环不变的(不在循环内重新分配)
  • 索引变量有一个恒定的步幅(以恒定的量增加/减少,如果可能的话,只在一个点上)
  • 数组由变量的线性函数索引。

例子: int val = array[index*2 + 5]

或者: int val = array[index+9]

不是: int val = array[Math.min(var,index)+7]


早期版本的代码:

这是一个示例版本。不要盗用它,因为它是 H2 数据库项目的未发布版本代码。最终版本将是开源的。这是对此处代码的优化:H2 CompressLZF 代码

从逻辑上讲,这与开发版本相同,但它使用 for(...) 循环来单步执行输入,并使用 if/else 循环来处理文字和反向引用模式之间的不同逻辑。它减少了阵列访问和模式之间的检查。


最终编辑:

到目前为止,我已将最佳答案标记为已接受,因为截止日期快到了。由于我在决定发布代码之前花了很长时间,因此我将继续投票并在可能的情况下回复评论。 如果代码混乱,请道歉:这代表开发中的代码,没有为提交而完善。

0 投票
2 回答
3278 浏览

java - 调试java混淆代码

我们将混淆我们的项目,但不想失去远程调试和热交换的能力。

可能吗?哪些工具可以处理这个问题?我会对简单的混淆感到满意——只需重命名类/方法/变量。

[已编辑] 我们正在使用 Intellij IDEA,但找不到此任务的任何插件。

0 投票
3 回答
1748 浏览

java - Java 条件运算符速度与热点 VM 的版本

请考虑以下java源:

如您所见,这是针对 3 个版本的if(false)条件的测试。

  • 我对为什么结果首先在各种条件语句中不同感兴趣。((我知道这显然是编译器将 .java 解释为字节码的方式。))还有比这更多的吗?
  • 第二。查看不同 Hotspot VM 的差异。见底部。这是因为更新/改进了虚拟机的版本吗?或者还有更多?
  • 这是测试这样的东西的最好方法吗?

---结果 Mac OS X---

JavaVM 热点 1.6.0

不等于运算符的 Avr:1937
等于“假”运算符的 Avr:1937
非运算符的 Avr:1941

JavaVM 热点 1.5.0

不等于运算符的 Avr:5023
等于“假”运算符的 Avr:5035
非运算符的 Avr:5067

JavaVM 热点 1.4.2

不等于运算符的 Avr:3993
等于“假”运算符的 Avr:4015
非运算符的 Avr:4009

JavaVM 热点 1.4.0

不等于运算符的 Avr:3961
等于“假”运算符的 Avr:3960
非运算符的 Avr:3961

谢谢。

0 投票
3 回答
2047 浏览

java - HotSpot JVM 的 -server 选项有什么作用?

我找不到任何关于-server在启动 sun HotSpot JVM 时传递该选项的确切效果的明确文档。

任何人都可以总结它的作用吗?

0 投票
4 回答
5840 浏览

java - Invalid access of stack red zone from Java VM

I'm trying to figure out what can cause this error in Java:

Has anyone ever encountered this error message? It's literally killing the JVM and everything stops there.

I'm currently using this version of Java:(on OS X 10.6)

All I'm looking for is some sort of explanation and tips on how to avoid hitting this again.

Thanks in advance!