我记得Java中有一个神奇的命令行选项,可以打开当前执行到控制台的操作.输出看起来像字节码.
-verbose 不匹配,因为它只打印类加载,而此选项输出内存分配,设置局部变量等信息.它非常详细,如"Hello world"的10行.
我在这里找不到它http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp,也没有http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java. html 我也在这里找到了一些标志,但大多数只在openjdk或开发模式下工作.也许有一种方法可以在这种开发模式下在Windows上启动java.exe?或者可能还有另一组标记错过了?
任何人都可以告诉我,Hotspot或Dalvik是否足够聪明,可以内联调用返回常量(静态最终)int值的final方法?理想情况下,方法调用将被常量替换.这可能是在类加载时或通过JIT.
这对我正在研究的一些代码的设计有影响.
我需要做一些实验,显示内联对我的代码的影响.有谁知道如何禁用sun jvm内联?我搜索了http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html并了解-XX:InlineSmallCode = n可以控制内联候选者的阈值.那么-xx:InlineSmallCode = 0会起作用吗?
Java JIT是否在同一台机器上的每次运行中使用相同的优化编译字节码?
是否考虑了特定时刻的CPU使用率等动态因素,或者无论临时因素如何,它都会每次进行相同的优化?
当我在Java Hotspot客户端中运行我的计时测试程序时,我得到了一致的行为.但是,当我在Hotspot服务器中运行它时,我得到了意想不到的结果.从本质上讲,在我试图复制的某些情况下,多态性的成本是高得令人无法接受的.
这是Hotspot服务器的已知问题/错误,还是我做错了什么?
测试程序和时间如下:
Intel i7, Windows 8
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode)
Mine2: 0.387028831 <--- polymorphic call with expected timing
Trivial: 1.545411765 <--- some more polymorphic calls
Mine: 0.727726371 <--- polymorphic call with unexpected timing. Should be about 0.38
Mine: 0.383132698 <--- direct call with expected timing
Run Code Online (Sandbox Code Playgroud)
随着我添加额外的测试,情况变得更糟.列表末尾附近的测试时间完全关闭.
interface canDoIsSquare {
boolean isSquare(long x);
}
final class Trivial implements canDoIsSquare {
@Override final public boolean isSquare(long x) {
if (x > 0) {
long t …Run Code Online (Sandbox Code Playgroud) 这里的片段来自java.util.ArrayList:
/**
* Constructs an IndexOutOfBoundsException detail message.
* Of the many possible refactorings of the error handling code,
* this "outlining" performs best with both server and client VMs.
*/
private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}
Run Code Online (Sandbox Code Playgroud)
这里的片段来自com.google.collect.Preconditions:
/*
* All recent hotspots (as of 2009) *really* like to have the natural code
*
* if (guardExpression) {
* throw new BadException(messageExpression);
* }
*
* refactored so that messageExpression is …Run Code Online (Sandbox Code Playgroud) 升级到Java 1.8.0_20后,我们的测试系统报告错误,但代码没有更改.我发现,Math.pow()使用完全相同的输入参数调用会在重新调用的调用时产生不同的结果.在Java 1.8.0_11中,它的行为与预期的一样,并且总是返回相同的值,但是对于Java 1.8.0_20及更高版本,它有时会返回稍微不同的值.
这类似于Math.pow根据java版本产生不同结果的问题,但不同,因为pow()的结果在一个VM中不同.
在Java 1.8.0_20及更高版本下运行时,以下JUint测试失败
import static org.junit.Assert.assertEquals;
import java.util.function.BiFunction;
import org.junit.BeforeClass;
import org.junit.Test;
public class PowerTest {
private static final int N = 1000000;
private static final double base = 5350.456329377186;
private static final double exp = 2.0;
private static double eval(final BiFunction<Double, Double, Double> f) {
return f.apply(base, exp);
}
private void loop(final BiFunction<Double, Double, Double> f) {
final double x = eval(f);
for (int i = 0; i < N; i++) …Run Code Online (Sandbox Code Playgroud) 我只是想知道远程调试的额外开销.我使用HotSpot使用以下参数启动应用程序:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
Run Code Online (Sandbox Code Playgroud)
我听说很多旧版本的HotSpot会对性能产生很大影响,但我的应用程序现在使用java 8,我找不到任何有关它的最新信息.
我听说JIT自动内联小方法,比如getter(它们大约有5个字节).边界是什么?有没有JVM标志?
有人可以解释GraalVM和Jvm-Hotspot之间的区别,以及GraalVM与OpenJDK的HotSpot有何关系。
java ×10
jvm-hotspot ×10
jit ×3
jvm ×3
android ×1
arraylist ×1
command-line ×1
dalvik ×1
graalvm ×1
guava ×1
jdwp ×1
math ×1
optimization ×1
performance ×1
pow ×1