标签: jvm-hotspot

JVM Hotspot 上的 PrintAssembly 选项已启用,但未显示任何程序集跟踪

我正在使用 intel i386、Ubuntu 14。显示的 OpenJDK 版本信息$java -version

java version "1.7.0_65"
OpenJDK Runtime Environment (IcedTea 2.5.2) (7u65-2.5.2-3~14.04)
OpenJDK Server VM (build 24.65-b04, mixed mode)
Run Code Online (Sandbox Code Playgroud)

正如此处提到的,我已将所需的二进制文件复制hsdis-i386.so到以下位置

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/server
Run Code Online (Sandbox Code Playgroud)

/usr/lib/jvm/java-7-openjdk-i386/jre/lib/i386/client
Run Code Online (Sandbox Code Playgroud)

然后我按照这个博客解决方法并尝试获取java程序的汇编代码。我使用下面的命令来测试示例 java 程序MyClass.java

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:PrintAssemblyOptions=hsdis-print-bytes -XX:CompileCommand=print,MyClass MyClass
Run Code Online (Sandbox Code Playgroud)

我在控制台上收到的消息是

OpenJDK Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output
CompilerOracle: unrecognized line "print Test"
c = 50
Run Code Online (Sandbox Code Playgroud)

哪里MyClass.java

public class MyClass{
  public static void main(String [] args){ …
Run Code Online (Sandbox Code Playgroud)

java jvm jvm-hotspot

3
推荐指数
1
解决办法
3480
查看次数

如何让 JVM 在给定的时间内挂起?

我正在尝试在本地环境中模拟 GC。有什么办法可以让 JVM 挂起 5 分钟吗?

java garbage-collection jvm jvm-hotspot

3
推荐指数
1
解决办法
2527
查看次数

使用 jmap 命令时获取 VMVersionMismatchException

我的 jdk 版本是 1.8.0_111,我正在阅读一本关于 JVM 的书。当我尝试命令时jmap -F 6469,抛出异常如下:

Attaching to process ID 6469, please wait...
Error attaching to process: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.111-b14. Target VM is 25.152-b11
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.111-b14. Target VM is 25.152-b11
    at sun.jvm.hotspot.HotSpotAgent.setupVM(HotSpotAgent.java:435)
    at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:305)
    at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:140)
    at sun.jvm.hotspot.tools.Tool.start(Tool.java:185)
    at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
    at sun.jvm.hotspot.tools.PMap.main(PMap.java:72)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.tools.jmap.JMap.runTool(JMap.java:201)
    at sun.tools.jmap.JMap.main(JMap.java:130)
Caused by: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 25.111-b14. Target VM is 25.152-b11
    at sun.jvm.hotspot.runtime.VM.checkVMVersion(VM.java:227)
    at sun.jvm.hotspot.runtime.VM.<init>(VM.java:294) …
Run Code Online (Sandbox Code Playgroud)

java jvm jvm-hotspot

3
推荐指数
1
解决办法
7984
查看次数

在 java 8 上运行 JStack 会停止所有线程吗?

我正在执行 JStack 命令以在特定时间间隔进行线程转储。

我观察到每当 JStack 执行时,目标进程上的所有线程都会停止。在查看我的 log4j 2 日志后,我得出了这个结论,我发现在 JStack 运行期间没有日志记录。

有人能告诉我 JSTack 会挂起/停止目标进程中的所有线程吗?

java jvm jvm-hotspot jstack java-8

3
推荐指数
1
解决办法
1592
查看次数

HotSpot 使用的 Mark-Compact 算法是什么?

在阅读The Garbage Collection Handbook上的 Mark-Compact 章节时,提供了一系列替代方案,但其中大多数看起来很旧/理论化(例如,2-finger compaction 和 Lisp2 3-pass 方法需要每个额外的标题词)目的)。

有没有人知道 HotSpot 在运行 Mark-Compact 时使用什么算法(我假设是老一代)?

谢谢

garbage-collection jvm jvm-hotspot

3
推荐指数
1
解决办法
264
查看次数

JVM 的时间是否与操作系统同步?

我正在开发一个以时间为中心的应用程序。我的代码经常调用System.currentTimeMillis()System.nanoTime().

所以我想确保这些时间戳调用与操作系统完美同步。JVM 何时以及如何同步其时​​钟?在启动时还是每次调用这两种方法时?

我的操作系统时间与 NTP 服务器完美同步。

java jvm jvm-hotspot ntp

3
推荐指数
2
解决办法
152
查看次数

为什么 HotSpot ExecutionSample 事件总是返回 STATE_RUNNABLE?

我在 OpenJDK11 中使用HotSpot的ExecutionSample 事件

它有一个线程状态字段,但我只看到该字段的一个值: STATE_RUNNABLE

HotSpot 如何选择要采样的线程?为什么它们总是可运行的?

Kotlin 中的简单复现代码:

import jdk.jfr.Recording
import jdk.jfr.consumer.RecordingFile
import java.nio.file.Path

object ExecutionSampleTest {

    private const val EXECUTION_SAMPLE = "jdk.ExecutionSample"
    private val RECORDING_PATH = Path.of("/tmp/recording.jfr")

    @JvmStatic
    fun main(args: Array<String>) {
        Recording().use { recording ->
            recording.enable(EXECUTION_SAMPLE)
            recording.settings = recording.settings.plus("$EXECUTION_SAMPLE#period" to "1 ms")

            recording.start()
            repeat(100) {
                // start some sleeping threads, just so we've got something to sample
                Thread { Thread.sleep(20_000) }.start()
            }
            Thread.sleep(20_000)
            recording.stop()
            recording.dump(RECORDING_PATH)

            RecordingFile.readAllEvents(RECORDING_PATH).forEach {
                println("Thread state: ${it.getString("state")}")
            }
        }
    }
} …
Run Code Online (Sandbox Code Playgroud)

java jvm-hotspot jfr

3
推荐指数
1
解决办法
208
查看次数

Hotspot JVM 如何处理 x86 上的整数除法溢出?

intJava中将两个s相除并没有什么特别之处。除非处理两种特殊情况之一:

  1. 被零除。(JVMS 需要虚拟机抛出ArithmeticException
  2. 除法溢出(Integer.MIN_VALUE / -1,JVMS 要求结果等于Integer.MIN_VALUE)(这个问题只针对这种情况)

来自第 6 章 Java 虚拟机指令集。idiv

有一种特殊情况不满足此规则:如果被除数是该int类型的最大可能数量级的负整数,并且除数为-1,则发生溢出,结果等于被除数。尽管溢出,但在这种情况下不会引发异常。

在我的计算机上 ( x86_64) 本机分区产生SIGFPE错误。

当我编译以下 C 代码时:

#include <limits.h>
#include <stdio.h>

int divide(int a, int b) {
  int r = a / b;
  printf("%d / %d = %d\n", a, b, a / b);
  return r;
}

int main() {
  divide(INT_MIN, -1);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到结果(在 x86 上):

tmp …
Run Code Online (Sandbox Code Playgroud)

java jvm jvm-hotspot

3
推荐指数
1
解决办法
147
查看次数

如何使用 HotSpot JVM @DontInline 注解?

我目前正在优化一个特定的方法,不幸的是它被 JVM 内联,这会阻止它被正确地向量化。我注意到有一个禁止内联的注释,即jdk.internal.vm.annotation.DontInline. 但是,无法从默认模块访问它。

是否有一种干净的方法可以访问此注释或以其他方式防止内联有问题的方法?

java inline jvm-hotspot compiler-optimization

3
推荐指数
1
解决办法
143
查看次数

JVM 如何在底层收集 ThreadDump

请解释 JVM 如何在底层收集 ThreadDump。
我不明白它如何收集脱离 CPU 的线程的堆栈跟踪(等待磁盘 IO、网络、非自愿上下文切换)。
例如,linux perf 仅收集有关 CPU 线程(使用 CPU 周期)的信息

java jvm jvm-hotspot jvmti perf

3
推荐指数
1
解决办法
354
查看次数