我想在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.
有人有想法吗?
谢谢.
阿尔诺
当我用参数启动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毫秒的差异,这使得两个时间戳无法比拟.任何想法如何处理这个?
我有一台64位机器,理论上地址空间是2 ^ 64字节,它有32 G的物理RAM.
这是一台具有16个内核的服务器级机器,是一个生产服务器.
由于没有其他进程正在运行消耗大量内存而且服务器jvm是唯一运行的应用程序,有没有理由不将jvm堆设置为非常大的数量?
我看到它被设置为不到10场演出,没有任何解释,我可以想到这可能是.
正如我之前在帖子中提到的:我理解内核,缓存和其他进程需要共享RAM.但除了任何其他进程和操作系统本机的东西,没有别的事情发生.这台机器是一台生产机器,仅适用于这种特定的jvm.
是否有任何理由不设置为20演出/ 32克(物理ram)?
从下面的评论看 - 它似乎不是......除了需要快速失败,感谢您的投入
我听说是这种情况,但我找不到确定的在线资源来确认.
背景:一位同事喜欢制作他的局部变量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中,不允许从数组继承,即,不能执行以下操作:
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) C malloc实现通常不分配所请求的精确内存量,而是使用固定大小的内存运行,例如,使用两个幂的大小,因此1025字节的分配实际上需要一个2048字节的段,丢失1023个字节作为slop.
HotSpot是否对Java数组使用类似的分配机制?如果是这样,分配Java数组的正确方法是什么,这样就没有什么了不起?(例如,数组长度应该是2的幂,还是2的幂,减去一些固定的开销量?)
以下是我想根据我的问题提出的两个样本(假设你在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) 我正在使用JNI来允许C代码卸载一些最好用Java完成的工作.在这个问题中,我试图链接libjvm和libjli库以使我的代码工作,但现在我在质疑我是否需要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库非常重要
我的问题:
我正在分析 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 中进一步检查,似乎这个问题与调用其他默认接口方法的默认接口方法有关。考虑到“无静态绑定”消息,这会更有意义。
jvm-hotspot ×10
java ×9
jvm ×5
arrays ×3
jit ×2
allocation ×1
benchmarking ×1
bytecode ×1
inheritance ×1
jmx ×1
jol ×1
monitoring ×1
optimization ×1
performance ×1