标签: jvm-hotspot

是否可以在JMX中监控"Full GC"频率(在HotSpot上)?

我想在JMX中监控Full GC频率.MBean暴露GC计数.(参见http://download.oracle.com/javase/1.5.0/docs/api/java/lang/management/GarbageCollectorMXBean.html - java.lang:type = GarbageCollector,name =).

问题是MBean不区分次要和完整的gc.

有人有想法吗?

谢谢.

阿尔诺

monitoring garbage-collection jvm jmx jvm-hotspot

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

如果字节码是在1.4中编译的,我们仍然可以获得Java 6的性能提升

我假设在浏览本文档后,Java 1.4和Java 6之间存在巨大的性能差异.

我的问题,当Java必须运行的字节码在1.4中编译时,Java 6运行时是否仍然有它的魔力?

一些背景为"为什么这个问题?" 就是在这里.

java bytecode jvm-hotspot

7
推荐指数
1
解决办法
193
查看次数

为什么HotSpots编译日志时间与ManagementFactory.getRuntimeMXBean().getUptime()不同?

当我用参数启动JVM时

-XX:+PrintCompilation
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

 60    1             java.lang.String::hashCode (55 bytes)
 74    2             sun.nio.cs.UTF_8$Encoder::encode (361 bytes)
Run Code Online (Sandbox Code Playgroud)

第一列是以毫秒为单位的时间戳,当打印日志时,我想将此时间戳与返回的值进行比较ManagementFactory.getRuntimeMXBean().getUptime():

long jvmUpTime = ManagementFactory.getRuntimeMXBean().getUptime();
Run Code Online (Sandbox Code Playgroud)

要么

long jvmStartTime = ManagementFactory.getRuntimeMXBean().getStartTime();
Run Code Online (Sandbox Code Playgroud)

但我的结果是这样的:

[62:log from Java code]
103    5             benchmark.AbstractBenchmarkST::benchmark (82 bytes)
[62:log from Java code]
Run Code Online (Sandbox Code Playgroud)

似乎它们之间有大约40毫秒的差异,这使得两个时间戳无法比拟.任何想法如何处理这个?

java benchmarking jvm jvm-hotspot

7
推荐指数
1
解决办法
360
查看次数

最大jvm堆的大小是否达到或接近机器上的最大物理内存的原因是什么?

我有一台64位机器,理论上地址空间是2 ^ 64字节,它有32 G的物理RAM.

这是一台具有16个内核的服务器级机器,是一个生产服务器.

由于没有其他进程正在运行消耗大量内存而且服务器jvm是唯一运行的应用程序,有没有理由不将jvm堆设置为非常大的数量?

我看到它被设置为不到10场演出,没有任何解释,我可以想到这可能是.

正如我之前在帖子中提到的:我理解内核,缓存和其他进程需要共享RAM.但除了任何其他进程和操作系统本机的东西,没有别的事情发生.这台机器是一台生产机器,仅适用于这种特定的jvm.

是否有任何理由不设置为20演出/ 32克(物理ram)?

从下面的评论看 - 它似乎不是......除了需要快速失败,感谢您的投入

java performance jvm-hotspot

7
推荐指数
1
解决办法
110
查看次数

Sun的HotSpot JIT编译器是否自动将"final"应用于Java局部变量?

我听说是这种情况,但我找不到确定的在线资源来确认.

背景:一位同事喜欢制作他的局部变量final.他这样做的原因之一是表现.我的论点是,Java的HotSpot Just In Time编译器会自动检测不变的局部变量并制作它们final,所以自己做这个没有性能上的好处.

请注意,我不是在问局部变量是否是一个好的编码实践final,因为已经有很多(非主题)SO问题.

编辑:mrhobo为优化整数文字的字节码提出了一个很好的观点.我应该给出一个我正在谈论的代码类型的例子,我的问题是:

Object doSomething(Foo foo) {
    if (foo == null) {
        return null;
    }

    final Bar bar = foo.getBar();
    final Baz baz = this.bazMap.get(bar);

    return new MyObject(bar, baz);
}
Run Code Online (Sandbox Code Playgroud)

您是否认为在这种情况下会发生相同类型的优化,因为bar并且baz都标记了final?或者,HotSpot会自动检测到它们是否在方法范围内没有变化,并将它们视为final无论如何?

类似的问题

java jit jvm-hotspot

7
推荐指数
1
解决办法
556
查看次数

从JVM的角度来看,是否继承了原始数组?

我的疑问是这个:

在Java中,不允许从数组继承,即,不能执行以下操作:

class FloatVec extends float[]
{
    // Vector methods.
}

FloatVec somevec = new FloatVec()[] { 1, 2, 3 }; // With array initializer.
Run Code Online (Sandbox Code Playgroud)

甚至更好:

class FloatVec3 extends float[3]
{
    // Regular accessor.
    public float getX() {
        return this[0];
    }
    // Or say, make it the 'this' implicit like with other fields:
    public void setVec(float x, float y, float z) {
        [0] = x;
        [1] = y;
        [2] = z;
    }
    // And specific vec3 methods like:
    public float …
Run Code Online (Sandbox Code Playgroud)

java arrays inheritance jvm jvm-hotspot

7
推荐指数
2
解决办法
211
查看次数

Java数组在HotSpot中使用内存的准确程度(即多少slop)?

C malloc实现通常不分配所请求的精确内存量,而是使用固定大小的内存运行,例如,使用两个幂的大小,因此1025字节的分配实际上需要一个2048字节的段,丢失1023个字节作为slop.

HotSpot是否对Java数组使用类似的分配机制?如果是这样,分配Java数组的正确方法是什么,这样就没有什么了不起?(例如,数组长度应该是2的幂,还是2的幂,减去一些固定的开销量?)

java arrays memory-management allocation jvm-hotspot

7
推荐指数
1
解决办法
94
查看次数

内存中的Java原始数组布局

以下是我想根据我的问题提出的两个样本(假设你在JOL这里):

Layouter layout32Bits =  new HotSpotLayouter(new X86_32_DataModel());
Layouter layout64BitsComp = new HotSpotLayouter(new X86_64_COOPS_DataModel());
Run Code Online (Sandbox Code Playgroud)

并使用此示例:

int [] ints = new int[10];  

System.out.println(ClassLayout.parseInstance(ints, layout32Bits).toPrintable());
System.out.println(ClassLayout.parseInstance(ints, layout64BitsComp).toPrintable());
Run Code Online (Sandbox Code Playgroud)

这是两个输出:

  [I object internals:
  OFFSET  SIZE   TYPE DESCRIPTION             VALUE
  0     4        (object header)     09 00 00 00 (00001001 00000000 00000000 00000000) (9)
  4     4        (object header)     00 00 00 00 (00000000 00000000 00000000 00000000) (0)
  8     4        (object header)     10 1b 0c 1a (00010000 00011011 00001100 00011010) (437000976)
 12    40    int [I.<elements>            N/A
 52 …
Run Code Online (Sandbox Code Playgroud)

java arrays jvm jvm-hotspot jol

7
推荐指数
1
解决办法
469
查看次数

什么是Java libjli库?

我正在使用JNI来允许C代码卸载一些最好用Java完成的工作.在这个问题中,我试图链接libjvmlibjli库以使我的代码工作,但现在我在质疑我是否需要JLI库.

我找不到任何明确说明JLI库目的的文档.

这个其他的SO问题暗示JLI是一些OSX passthrough库:

#elif defined(__APPLE__)
// jli needs to be loaded on OSX because otherwise the OS tries to run the system Java
Run Code Online (Sandbox Code Playgroud)

这个博客一样:

在OS X上进行编译时,在jvm库之前链接jli库非常重要

我的问题:

  1. 什么是JLI库?
  2. 我是否需要在RedHat/CentOS环境(无OSX)中进行C/Java JNI开发?

java java-native-interface jvm-hotspot

7
推荐指数
1
解决办法
599
查看次数

JIT 编译器可以内联 Java 8 默认接口方法吗?

我正在分析 HotSpot 日志以获得在 JITWatch 中为一段代码运行的基准测试,并注意到由于“没有静态绑定”而没有内联许多方法调用。这些似乎只发生在调用默认接口方法时。

我的问题是默认接口方法是否会阻止 JIT 编译器内联它们的调用?

interface A {
    default double a() {
        return Math.random();
    }
}

interface B extends A {
    default double b() {
        return a();
    }
}

class C implements B {
    public double c() {
        double c = 0;
        for (int i = 0; i < 1_000_000; ++i) {
            c += b();
        }
        return c;
    }

    public static void main(String[] args) {
        System.out.println(new C().c());
    }
}
Run Code Online (Sandbox Code Playgroud)

在 JITWatch 中进一步检查,似乎这个问题与调用其他默认接口方法的默认接口方法有关。考虑到“无静态绑定”消息,这会更有意义。

java optimization jit jvm jvm-hotspot

7
推荐指数
1
解决办法
170
查看次数