问题标签 [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 投票
1 回答
426 浏览

java - 激活服务器 JIT 后,什么会导致我的代码运行速度变慢?

我正在对 MPEG 解码器进行一些优化。为了确保我的优化不会破坏任何东西,我有一个测试套件可以对整个代码库(优化的和原始的)进行基准测试,并验证它们是否产生相同的结果(基本上只是通过解码器和 crc32 提供几个不同的流输出)。

在 Sun 1.6.0_18 中使用“-server”选项时,测试套件在预热后的优化版本上运行大约慢 12%(与默认的“-client”设置相比),而原始代码库获得了良好的提升运行速度大约是客户端模式下的两倍。

虽然起初这对我来说似乎只是一个热身问题,但我添加了一个循环来多次重复整个测试套件。然后从测试的第 3 次迭代开始,每次通过的执行时间变得恒定,但优化后的版本仍然比客户端模式慢 12%。

我也很确定这不是垃圾收集问题,因为代码在启动后绝对不涉及对象分配。该代码主要由一些位操作操作(流解码)和许多基本的浮动数学(生成 PCM 音频)组成。唯一涉及的 JDK 类是 ByteArrayInputStream(将流提供给测试并从测试中排除磁盘 IO)和 CRC32(用于验证结果)。我还观察到 Sun JDK 1.7.0_b98 的相同行为(只有 15% 而不是那里的 12%)。哦,测试都是在同一台机器(单核)上完成的,没有运行其他应用程序(WinXP)。虽然测量的执行时间存在一些不可避免的变化(使用 System.nanoTime btw),但使用相同设置的不同测试运行之间的变化从未超过 2%,通常小于 1%(预热后),

是否有任何已知的编码模式在服务器 JIT 上表现更差?如果做不到这一点,哪些选项可用于“窥视”引擎盖并观察 JIT 在那里做什么?

  • 也许我用错了我的“热身”描述。没有明确的预热代码。整个测试套件(由 12 个不同的 mpeg 流组成,总共包含约 180K 音频帧)执行 10 次,我将前 3 次运行视为“热身”。在我的机器上,一轮测试大约需要 40 秒 100% cpu。

  • 我按照建议使用 JVM 选项并使用“-Xms512m -Xmx512m -Xss128k -server -XX:CompileThreshold=1 -XX:+PrintCompilation -XX:+AggressiveOpts -XX:+PrintGC”我可以验证所有编译都发生在前3轮。垃圾收集每 3-4 轮启动一次,最多耗时 40ms(512m 非常大,因为测试可以用 16m 运行就好了)。由此我得出结论,垃圾收集在这里没有影响。尽管如此,将客户端与服务器进行比较(其他选项不变)仍然存在 12/15% 的差异。

0 投票
4 回答
9079 浏览

java - java PrintCompilation 输出:“made not entrant”和“madezombie”是什么意思

在运行 Java 1.6 (1.6.0_03-b05) 应用程序时,我添加了-XX:+PrintCompilation标志。在某些方法的输出上,特别是我知道的一些方法被调用了很多,我看到了文本made not entrantmade zombie.

这些是什么意思?最好的猜测是,在重新编译该方法或具有更大优化的依赖项之前,这是一个反编译步骤。真的吗?为什么是“僵尸”和“进入者”?

例如,其中一些行之间有相当长的时间:

0 投票
4 回答
265 浏览

java - System.out 中的 Java 执行细节

我记得在 Java 中有一个神奇的命令行选项,可以打开当前执行到控制台的操作的写入。输出看起来像字节码。

-verbose不匹配,因为它只打印类加载,而此选项输出诸如内存分配、设置局部变量等信息。它非常详细,例如“Hello world”的 10 行。

我在这里没有找到它https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html或在这里https://docs.oracle.com/javase/1.5.0/docs/tooldocs/ solaris/java.html。我还发现了一些标志,但大多数只在 openjdk 或开发模式下工作。也许有一种方法可以在这种开发模式下在 Windows 上启动 java.exe?或者这些列表可能缺少另一组标志?

0 投票
1 回答
327 浏览

java - 调试 JNI HotSpot 崩溃

我正在基于远程 Linux 的系统上测试一些自定义 JNI 代码。我不想安装 DBX,而 JDB 并不能完全帮助诊断问题。是否有任何其他轻量级 Java JNI 调试器实际上会告诉我 JNI 代码中哪里出错了?

谢谢

0 投票
2 回答
253 浏览

java - Hotspot JVM 中未编译方法的原因

有可用的标志提供有关已编译方法的日志信息。有关未编译的方法以及为什么未编译的方法的信息在哪里?能够看到热点编译器如何做出决定以及它不编译某些方法的原因将使我对 JVM 有更好的理解,并允许我编写更好的代码并可能优化我的一些方法。有人对这个问题有任何想法吗?

0 投票
4 回答
284 浏览

java - Java 标准库如何与本机代码通信?

他们是否使用 Mono 的 PInvoke 之类的东西?还是更像是在运行时启动之前注册的内部调用?java 是否有用于处理诸如 mscorlib.dll 之类的本机调用的基础库?如果我想在 C 代码中调用 JVM,它的库会查找 .so/.dll 文件吗?如果我静态链接所有 JRE 本机库,它会对 Java 标准库产生影响吗?

0 投票
2 回答
616 浏览

java - Bitwise AND (&) expression in Java

I am debugging code that has in it expr1 & expr2 where expr1 has a side effect that affects expr2 evaluation result. I suspect that expr2 gets evaluated before expr1, since JLS guarantees left-to-right evaluation for &&, but not necessarily for &. I also suspect that change of evaluation order may be a result of optimization performed by HotSpot (we're running Java 6u20). Do you know if HotSpot can make such an optimization? Better yet, provide any pointers to documentation that either support or eliminate the suspicion. Thanks in advance.

EDIT: Thanks for those suggesting to rewrite the code so it's both correct and readable - you're right, but I already did, so it's not what I am looking for. Unfortunately it is hard to test the change, which is why I'm asking the question here.

0 投票
3 回答
304 浏览

java - ASP.NET / .net 新手问题 - Java Hotspot 等价物?

我是一位经验丰富的 Java 开发人员,他开始学习 .net 方面的知识,并且打算选择一个 asp.net 项目作为我的开始领域(所以我可以与 grails、spring mvc 等进行比较)

我发现很烦人的一件事是每次代码更改都必须重新启动我的网络服务器。在开发过程中的 Java 端,我使用标准 JVM 热点动态重新加载我的类。我们还购买了 JRebel http://www.zeroturnaround.com/jrebel/,它将这种能力提升到了更高的水平!

任何 .net 大师都可以告诉我是否有类似的 java 热点,用于 .net 的 JRebel 技术(esp c#)?

谢谢

0 投票
2 回答
11053 浏览

java - Java VM 调优 - Xbatch 和 -Xcomp

我正在查看运行 Alfresco 的 JVM 配置选项,主要是Alfresco Wiki上的这个文档。其中一项建议是使用 JVM 标志和. 这样做的理由是:-Xcomp-Xbatch

如果您希望 Hotspot 预编译这些类,您可以添加 [-Xcomp 和 -Xbatch]。但是,这将显着增加服务器启动时间,但会突出显示稍后可能会遇到的缺失依赖项。

从我在其他地方读到的关于-Xcompand-Xbatch标志的内容,我想知道它们是否真的提供了任何好处。

  • -Xcomp让 HotSpot 以最大程度的优化预先编译所有代码,从而避免 VM 将通过系统的标准运行获得的任何分析。
  • -Xbatch停止后台编译,这意味着导致代码被编译的线程会阻塞,直到编译完成。但是,编译完成后,之前被阻塞的线程不会运行编译后的代码它仍然会运行解释后的代码。这是 Java 6 (Mustang) 中的一个变化——在 Mustang 之前,由于存在-Xbatch标志而阻塞编译的线程保证在编译完成后立即在编译后的代码中运行。因此,我猜测该-Xbatch标志的推荐是在旧 VM 上运行 Alfresco 的遗留物。

有人有想法吗?我的倾向是摆脱这两个标志并依靠虚拟机来解决问题。

我想添加两件事,首先我还没有访问 Alfresco 实例来测试它,其次,我真的不知道托管 Alfresco 的机器是什么规格,除了查看另一个配置选项 它必须是 64 位 VM。尽管如此,我希望社区能够提供一些有用的意见,也许是从一般的 HotSpot 调整的角度来看。

0 投票
1 回答
1645 浏览

java - 在 Android 2.2 上:同时处于网络共享模式和扫描 wifi

嗨:通常是否可以打开 Wifi Tethering(创建热点)并同时扫描 Wifi 设备?我想要几个设备相互发现(不连接)并记录信号强度。为此,必须通过 Wifi 发现所有设备,同时发现其他设备。对于某些特定的用例,我只需要它..