我在Java应用程序中遇到问题,JIT破坏了代码.如果我禁用JIT,一切正常,但运行速度慢10-20倍.
有没有办法为特定方法或类禁用JIT?
编辑:我正在使用Ubuntu 10.10,获得相同的结果:
OpenJDK Runtime Environment (IcedTea6 1.9) (6b20-1.9-0ubuntu1)
OpenJDK 64-Bit Server VM (build 17.0-b16, mixed mode)
Run Code Online (Sandbox Code Playgroud)
和:
Java(TM) SE Runtime Environment (build 1.6.0_16-b01)
Java HotSpot(TM) 64-Bit Server VM (build 14.2-b01, mixed mode)
Run Code Online (Sandbox Code Playgroud) 到目前为止,我知道:
我的问题是:
没有找到任何关于此的文档.
如果没有读取OpenJDK源代码(我不反对),那么Hotspot JVM(比如英特尔)中的内部操作列表是否相当全面(或"官方" )?
例如,确定是否Math.abs()通常会将其直接转换为几个本机指令的最快方法是什么?
我听说这些术语正在使用,但我似乎无法在Java框架中找到它们在一起的最佳位置.我知道JIT是一个编译机制,但它是JVM的一部分吗?什么是热点?它是一种新型VM吗?
我有一个Java应用程序,它在不同的环境中显示不同的GC行为.在一个环境中,堆使用图是一个缓慢的锯齿,每10个小时左右就有一个主要的GC,只有当堆大于90%时才会填满.在另一个环境中,JVM每小时在点上执行主要GC(在这些时间堆通常在10%到30%之间).
我的问题是,导致JVM决定执行主要GC的因素是什么?
显然它会在堆几乎满了时收集,但是还有一些其他原因在起作用,我猜这与我应用程序中的每小时计划任务有关(尽管此时内存使用没有峰值).
我假设GC行为在很大程度上取决于JVM; 我在用:
其他信息:
拜托,没有猜测.JVM必须具有用于决定何时执行主要GC的规则,并且这些规则必须在源中深处编码.如果有人知道它们是什么,或者它们被记录在哪里,请分享!
我正在将我的应用程序从java 1.6升级到1.7.当我尝试使用Maven 3.2.1进行构建时,我的构建失败并出现以下错误消息:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.0.2:compile (default-compile) on project my-app5: Compilation failure: Compilation failure:
[ERROR] could not parse error message: warning: [options] bootstrap class path not set in conjunction with -source 1.6
Run Code Online (Sandbox Code Playgroud)
我正在使用java 1.7热点,之前我使用的是1.6 jrockit.我的应用程序是多模块,很少有模块像往常一样编译和构建,这个模块失败了.
我已正确设置java home并且mvn --version显示在输出下方:
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T23:07:52+05:30)
Maven home: C:\Users\me\Maven3\apache-maven-3.2.1-bin\apache-maven-3.2.1\bin\..
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: C:\Program Files\jdk17051\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows"
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?
我想知道Oracle Java 7(或8)Hotspot VM执行的循环优化是什么?
以下是我尝试从" 逃避分析 "主题的Java Performance:The Definitive Guide,第97页重现的示例.这可能是应该发生的事情:
getSum()必须变得足够热并且使用适当的JVM参数必须将其内联到调用者中main().list和sum变量都没有从main()方法中转义,因此可以将它们标记为,NoEscape因此JVM可以使用堆栈分配而不是堆分配.但是我通过jitwatch运行它,结果显示getSum()编译成本机程序集并且没有内联main().更不用说因此堆栈分配也没有发生.
我在这里做错了什么?(我已将整个代码和热点日志放在这里.)
这是代码:
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.stream.IntStream;
public class EscapeAnalysisTest {
private static class Sum {
private BigInteger sum;
private int n;
Sum(int n) {
this.n = n;
}
synchronized final BigInteger getSum() {
if (sum == null) {
sum = BigInteger.ZERO;
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我正在使用 Oracle 的 Java 1.8.0_231。
设置-XX:ActiveProcessorCount=n有什么作用?我不是 C++ 人员,但我想我在 HotSpot 源代码中看到了这两个用途:
然而,它实际上限制了 JVM 可以使用的 CPU 数量吗?Java 10 发行说明明确指出:
此外,此更改添加了一个 JVM 选项,可以指定 JVM 将使用的 CPU 数量。
我担心的是,我的测试结果(在任何 Docker、CF 等容器之外)似乎显示应用程序平等地使用所有 8 个 CPU,而不是我设置的 4 个:

那么,设置 ActiveProcessorCount 实际上应该限制 JVM 使用的 CPU 数量吗?我在 HotSpot 代码中没有看到任何这样做的内容,而且我的测试结果似乎也说不。
谢谢
正如此答案中所建议的,我在运行性能测试时使用以下标志。
-XX:+PrintCompilation
-verbose:gc
Run Code Online (Sandbox Code Playgroud)
这对于调试计时阶段发生的 JVM 活动非常有用,但是当我只是计算统计信息并打印有关刚刚运行的基准测试的输出时,输出就没那么有用了。
有没有办法在运行时禁用这些标志中的一个或两个,以便我可以在计时阶段后关闭它们?
jvm-hotspot ×10
java ×9
jvm ×5
jit ×4
classpath ×1
heap-memory ×1
loops ×1
maven-3 ×1
optimization ×1
performance ×1