标签: jvm-hotspot

第一次Java循环运行时,为什么?[Sun HotSpot 1.5,sparc]

在对Solaris SPARC盒子上的一些Java代码进行基准测试时,我注意到我第一次调用基准测试函数时,它运行得很慢(10倍差异):

  • 首先| 1 | 25295.979毫秒
  • 第二| 1 | 2256.990毫秒
  • 第三| 1 | 2250.575毫秒

为什么是这样?我怀疑是JIT编译器,有没有办法验证这个?

编辑:根据一些答案,我想澄清一下,这段代码是最简单的测试案例,我可以找到展示这种行为.所以我的目标不是让它快速运行,而是要了解发生了什么,所以我可以在我真正的基准测试中避免它.

解决: Tom Hawtin正确地指出我的"慢"时间实际上是合理的.根据这一观察,我将调试器附加到Java进程.在第一个中,内循环看起来像这样:

0xf9037218:     cmp      %l0, 100
0xf903721c:     bge,pn   %icc,0xf90371f4        ! 0xf90371f4
0xf9037220:     nop
0xf9037224:     ld       [%l3 + 92], %l2
0xf9037228:     ld       [%l2 + 8], %l6
0xf903722c:     add      %l6, 1, %l5
0xf9037230:     st       %l5, [%l2 + 8]
0xf9037234:     inc      %l0
0xf9037238:     ld       [%l1], %g0
0xf903723c:     ba,pt    %icc,0xf9037218        ! 0xf9037218
Run Code Online (Sandbox Code Playgroud)

在接下来的迭代中,循环如下所示:

0xf90377d4:     sub      %l2, %l0, %l3
0xf90377d8:     add      %l3, %l0, %l2
0xf90377dc:     add      %l2, …
Run Code Online (Sandbox Code Playgroud)

java performance jvm-hotspot microbenchmark

11
推荐指数
2
解决办法
4921
查看次数

为什么java.lang.Object.getClass()(和反射)比平常慢?

我们遇到了一些奇怪的JVM性能问题.

我们有一个大而有些不透明的GUI组件(Actuate Formula 1电子表格).

如果我们从Event Dispatch Thread初始化它(就像你应该的那样),我们会发现代码的运行速度要慢得多(拖动鼠标选择单元格,会有明显的滞后).

如果我们在主启动器线程中第一次初始化它,然后才开始在EDT中使用它,它运行得更快.

当我查看为什么它使用分析器缓慢执行时,所有时间的方法调用是:

  • java.lang.Object.getClass()
  • java.lang.reflect.Array.newInstance(Class,int)
  • java.lang.Class.getComponentType()
  • java.lang.Thread.currentThread()

我们在Windows 7上使用64位Sun Hotspot JVM(JDK附带的那个).

有没有人知道为什么上述方法的表现可能会比平时慢得多?

我在想,也许它与加载类的顺序有关......这是一个合理的理论吗?有没有人知道我可以诊断为什么这些方法调用可能需要很长时间的任何其他方式?

我已经从探查器附加了两个截图.在两者中,我所做的只是在分析器运行时将鼠标拖动到电子表格单元格周围.所以它只是更新GUI组件而不是做很多其他事情.

第一个是在一个名为"releaseLock()"的方法中花费大量时间.出于某种原因,这需要很长时间,因为"getComponentType()"比平时花费的时间要长得多.

RELEASELOCK

第二个是在我做了"hack"以消除"releaseLock()"的成本之后 - 但现在它只是花了很多时间在"getLock()"中,因为getClass()和currentThread()花费的时间比正常时间长得多:

GETLOCK

但重要的是,如果我只是简单地改变代码初始化的顺序,那么这些代码都不需要很长时间才能执行(它甚至根本不会出现在探查器中).

如果我要优化getLock(),应用程序的执行速度会慢得多.问题实际上似乎是像getClass()这样的方法花费的时间太长了.没有办法弥补这一点 - 在太多的地方调用getClass()!

即使没有运行探查器,性能差异也很明显.

还请记住,我们无法更改任何此代码 - 它是一个外部组件.挑战在于解释为什么代码在某些情况下执行速度比其他情况慢得多.

java reflection jvm jvm-hotspot

11
推荐指数
1
解决办法
1622
查看次数

JRE 32位对比64位

我一直在使用Java一段时间,而我设置新开发机器的典型仪式需要从Oracle网站下载和安装最新JDK的规范.

这引发了一个不寻常的问题, does it matter if I use the 32bit or 64bit JRE bundle?

回过头来看,我之前已经安装了两个版本,而且我的普通工具链很快就插入了(Eclipse).在我的日常编程中,我不记得曾经因为我使用的是64位JRE(或针对这方面的目标是64位JRE)而不得不以不同的方式改变某些东西或思考某些东西.

根据我对64位与32位的理解 - 它实际上归结为数字如何存储在封面下...我知道这int是32位并且long是64位...与float32位相同并且double是64位 - 所以只是Java已经抽象出了这个微妙之处,并且可能一直都是"64位兼容"吗?

我确定我在这里遗漏了一些东西,除了无法在32位系统上安装64位JRE.

java x86 x86-64 jvm-hotspot

11
推荐指数
2
解决办法
2万
查看次数

Oracle的服务器JRE包含JDK?

我刚刚下载了用于Java SE 7的Oracle服务器JRE(链接)我下载的文件是server-jre-7u45-linux-x64.tar.gz.当我解压缩这个文件时,我很惊讶地发现创建了一个名为jdk1.7.0_45的目录,其中包含完整的Java JDK.不是我对JRE安装的期望.这里发生了什么?

java jvm-hotspot

11
推荐指数
1
解决办法
6232
查看次数

weakCompareAndSwap vs compareAndSwap

这个问题不是关于它们之间的区别 - 我知道什么是虚假故障以及为什么它会发生在LL/SC上.我的问题是,如果我使用的是intel x86并使用java-9(build 149),为什么它们的汇编代码有区别?

public class WeakVsNonWeak {

    static jdk.internal.misc.Unsafe UNSAFE = jdk.internal.misc.Unsafe.getUnsafe();

    public static void main(String[] args) throws NoSuchFieldException, SecurityException {

        Holder h = new Holder();
        h.setValue(33);
        Class<?> holderClass = Holder.class;
        long valueOffset = UNSAFE.objectFieldOffset(holderClass.getDeclaredField("value"));

        int result = 0;
        for (int i = 0; i < 30_000; ++i) {
            result = strong(h, valueOffset);
        }
        System.out.println(result);

    }

    private static int strong(Holder h, long offset) {
        int sum = 0;
        for (int i = 33; i < 11_000; ++i) { …
Run Code Online (Sandbox Code Playgroud)

java jvm jvm-hotspot compare-and-swap java-9

11
推荐指数
2
解决办法
830
查看次数

边界检查Java

"Hotspot可以删除Java中的边界检查." 有人可以解释一下吗?实际上我正在分析C++和Java之间的差异.这不是一个功课,我正在分析自己的兴趣.

java runtime jvm-hotspot bounds-check-elimination

10
推荐指数
1
解决办法
4738
查看次数

JVM上的内存分配是无锁的

当你new Object()在Java中执行时,jvm是使用无锁算法来分配内存还是需要锁定?

在这种情况下我指的JVM是Hotspot VM.从我所知道的一点点来看,它只需要增加一个指针以超快地分配内存.但是在多线程的情况下,这种增量是否需要锁定或CAS?

java jvm bytecode jvm-hotspot

10
推荐指数
2
解决办法
1288
查看次数

什么是HotSpot JIT中的去反射优化?它是如何实现的?

观看通用VM演示文稿,我研究了这张幻灯片,其中列出了HotSpot JIT所做的所有优化:在此输入图像描述

在该language-specific techniques部分中有一个去反射.我试图在互联网上找到有关它的一些信息,但失败了.我知道这种优化在某种程度上消除了反射成本,但我对细节很感兴趣.有人可以澄清一下,还是给出一些有用的链接?

java optimization jit jvm jvm-hotspot

10
推荐指数
1
解决办法
947
查看次数

是什么导致一个方法被热点编译器归类为"'不可编译(禁用)"?

在对应用程序进行一些更改之后,它遭受了显着的性能下降,并且在调查中,最常调用的方法之一不再被编译.启用:-XX:+LogCompilation显示在更改之前,此方法是:排队进行编译,编译,然后成功内联到调用者; 而在更改之后,没有编译尝试的记录,并且内联尝试说:

inline_fail reason ='not compilable(disabled)'

原始方法如下,其中_maxRepeats一个实例变量声明为a Map(没有泛型,很久以前编写的代码),使用的是键是类的对象,DadNode值是a Integer.

  private int cnsGetMaxRepeats(DadNode dn) {
    if (_maxRepeats != null) {
      Integer max = (Integer)_maxRepeats.get(dn);
      if (max != null) {
        return max;
      }
    }
    return dn.getMaxOccurs().getValue();
  }
Run Code Online (Sandbox Code Playgroud)

修正案涉及将_maxRepeats地图更改为使用泛型:

  Map<Integer, Integer>
Run Code Online (Sandbox Code Playgroud)

并在方法中添加了一个新参数:

   private int cnsGetMaxRepeats(int childIdx, DadNode dn) {
    if (_maxRepeats != null) {
      Integer max = _maxRepeats.get(childIdx);
      if (max != null) {
        return max;
      }
    }
    return dn.getMaxOccurs().getValue();
  }
Run Code Online (Sandbox Code Playgroud)

使用显式调用Integer.valueOf和 …

java jvm-hotspot

10
推荐指数
1
解决办法
102
查看次数

设置-XX:MaxRam

根据此链接,可以选择手动设置MaxRamSize以限制JVM不使用超出此范围的内存.但我没有看到任何相同的文件.我从来不知道这一点.有这样的东西还是类似的东西?PS.我知道,我不打算设置堆/堆栈/元空间/本机内存大小.我只是想知道是否有整体内存限制选项.

尝试它没有帮助,因为它错误:

Improperly specified VM option 'MaxRAM=1073741824B'
Could not create the Java Virtual Machine.
A fatal exception has occurred. Program will exit.
Run Code Online (Sandbox Code Playgroud)

事实上根据这个链接 open-jdk似乎有这些选项.我发现的另一个链接指向设置堆大小.这也是不寻找的.但我认为这是针对Oracle的.

为什么我正在寻找这种选项来在容器(如Docker)中运行应用程序,并防止应用程序被OOM Killer杀死.我相信如果有一个这样的java应用程序的设置会错误或崩溃,java.lang.OutOfMemoryError而不是容器被终止.

我的假设和理解可能完全错误.这个问题也可能是完全错误和无关紧要的.但当然,要求是前进的方向:).

java memory performance jvm jvm-hotspot

10
推荐指数
2
解决办法
5700
查看次数