jcmd PID GC.class_histogram`会在收集数据之前调用完整的GC吗? - java

当我运行jcmd PID help GC.heap_dump时,帮助会明确说明将调用完整的GC,除非指定了-all标志:

GC.heap_dump
...
影响:高:取决于Java堆的大小和内容。除非指定'-all'选项,否则请求完整的GC。

-all:[可选]检查所有对象,包括不可达的对象(BOOLEAN,false)

如果我运行jcmd PID help GC.class_histogram,则帮助不会说明强制使用完整的GC,但是“ Impact”仍然被称为“高”,并且该选项仍具有-all标志,其行为与:

GC.class_histogram
...
影响:高:取决于Java堆的大小和内容。

-all:[可选]检查所有对象,包括不可达的对象(BOOLEAN,false)

我尝试在几个环境中运行此命令,但未调用完整GC。但是,由于它“取决于Java堆的大小和内容”,因此我不确定。

那么在某些情况下GC.heap_dump是否可以调用完整的GC?如果是,那是什么?

参考方案

jcmd PID GC.class_histogram默认情况下将导致Full GC。

如果目标JVM是使用-XX:+PrintGC启动的,您将看到一条日志消息,例如

// JDK 8:
[Full GC (Heap Inspection Initiated GC)  1397K->331K(126720K), 0.0023298 secs]

// JDK 9:
[15.503s][info   ][gc] GC(0) Pause Full (Heap Inspection Initiated GC) 2M->0M(8M) 8.107ms

但是,使用-all选项时,与GC.class_histogram完全一样,对于GC.heap_dump,将没有Full GC。在HotSpot sources中找到证明:

void ClassHistogramDCmd::execute(DCmdSource source, TRAPS) {
  VM_GC_HeapInspection heapop(output(),
                              !_all.value() /* request full gc if false */);
  VMThread::execute(&heapop);
}

子类可以创建抽象的超类类型的对象吗? - java

我不确定我是否正确问了这个问题,但我是在作业中给我的ClassA是抽象的B类扩展了A类那么在ClassB的主要方法中,我们有:ClassA obj =新的ClassB();这里发生了什么,这样做的目的是什么? 参考方案 您永远无法创建来自抽象类的对象。曾经期。在这里,被分配了对象的变量是抽象类型,但是变量所指的对象本身不是,也永远不可能是。引用和引用变量之间…

使用JIT进行的优化是否只发生一次,并且可以永久保留,或者仅在运行的生命周期中保留? - java

我在Just-in-time compilers上阅读过不同的文章,并且提到JIT将代码片段(热点)优化为直接的本机代码(机器代码)。我的问题是每当我运行.class file时,都会发生这种优化吗?另一方面,传统的compiled代码会一劳永逸地进行优化,而不仅仅是在一个execution中进行优化。在hot-spot optimization中如何“记住…

反转GregorianCalendar对象添加分钟方法 - java

当向GregorianCalender对象添加一分钟时,我们像下面这样进行操作,这将使时间增加一分钟:GregorianCalendar gc = new GregorianCalendar(TimeZone.getTimeZone("UTC")); gc.add(Calendar.MINUTE,1); 但是由于错误,我将其反转为:Gre…

从对象转换为原始类 - java

我将Entry类的实例存储在Object中。Entry newentry = new Entry(j, 0.0); Object test = newentry; 如何将test对象转换回Entry类以访问Entry类方法getValue()? 参考方案 输入它:Entry newentry = new Entry(j, 0.0); Entry test =…

在类中创建类的实例 - java

考虑一下我有以下两个嵌套类:public class Foo { public class Bar { } } 我的目标是创建类Bar的实例。我尝试通过以下方式进行操作:// Method one Foo fooInstance = new Foo(); Foo.Bar barInstance = new fooInstance.Bar // fooInst…