问题标签 [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.
java - 为什么生成执行操作的 Java 代码比“解释器循环”运行得更慢?
我有一些对 BitSet 执行按位运算的 Java 代码。我有一个操作列表,可以通过循环来“解释”它们,但对我来说重要的是我可以尽快执行这些操作,所以我一直在尝试动态生成代码来应用它们。我生成 Java 源代码来执行操作并使用 Javassist 编译实现这些操作的类。
不幸的是,我动态生成的代码比解释代码运行得慢。这似乎是因为 HotSpot 正在优化解释代码,但没有优化编译代码:在我运行它几千次之后,我的解释代码运行速度是最初的两倍,但我的编译代码显示没有加速。与这个假设一致,我的解释代码最初比编译代码慢,但最终更快。
我不确定为什么会这样。我的猜测是 Javassist 可能使用了一个类加载器,它的类 HotSpot 没有触及。但我不是 Java 类加载方面的专家,所以我不确定这是否是一个合理的猜测或如何进行测试。以下是我使用 Javassist 创建和加载类的方法:
有没有人知道这里发生了什么?我真的很感激你能提供的任何帮助。
我在 Windows XP 32 位上使用 Sun 1.6 服务器 JVM。
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。
java - JVM -XX:+StringCache 参数?
我最近在阅读 JRE 6 [ Java VM Options ] 中可用的所有 JVM 参数,并看到了这个:
-XX:+StringCache :启用常用分配字符串的缓存。
现在我一直认为 Java 保留了一个实习(正确的词?)字符串池,并且在使用文字进行字符串连接之类的操作时,它不是创建新对象,而是将它们从该池中拉出。有没有人使用过这个论点,或者可以解释为什么需要它?
编辑:我试图运行一个基准测试,看看这个参数是否有任何影响,并且无法让 Sun JVM 识别它。这是与:
所以我不确定这个论点是否有效。
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 ”。根据小程序程序员的说法,他的错误指向一个文件,该文件甚至没有在他的代码中的任何地方指定。
用户的错误如下:
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
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 循环来处理文字和反向引用模式之间的不同逻辑。它减少了阵列访问和模式之间的检查。
最终编辑:
到目前为止,我已将最佳答案标记为已接受,因为截止日期快到了。由于我在决定发布代码之前花了很长时间,因此我将继续投票并在可能的情况下回复评论。 如果代码混乱,请道歉:这代表开发中的代码,没有为提交而完善。
java - 调试java混淆代码
我们将混淆我们的项目,但不想失去远程调试和热交换的能力。
可能吗?哪些工具可以处理这个问题?我会对简单的混淆感到满意——只需重命名类/方法/变量。
[已编辑] 我们正在使用 Intellij IDEA,但找不到此任务的任何插件。
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
谢谢。
java - HotSpot JVM 的 -server 选项有什么作用?
我找不到任何关于-server
在启动 sun HotSpot JVM 时传递该选项的确切效果的明确文档。
任何人都可以总结它的作用吗?
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!