我正在使用 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) 我正在尝试在本地环境中模拟 GC。有什么办法可以让 JVM 挂起 5 分钟吗?
我的 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) 我正在执行 JStack 命令以在特定时间间隔进行线程转储。
我观察到每当 JStack 执行时,目标进程上的所有线程都会停止。在查看我的 log4j 2 日志后,我得出了这个结论,我发现在 JStack 运行期间没有日志记录。
有人能告诉我 JSTack 会挂起/停止目标进程中的所有线程吗?
在阅读The Garbage Collection Handbook上的 Mark-Compact 章节时,提供了一系列替代方案,但其中大多数看起来很旧/理论化(例如,2-finger compaction 和 Lisp2 3-pass 方法需要每个额外的标题词)目的)。
有没有人知道 HotSpot 在运行 Mark-Compact 时使用什么算法(我假设是老一代)?
谢谢
我正在开发一个以时间为中心的应用程序。我的代码经常调用System.currentTimeMillis()和System.nanoTime().
所以我想确保这些时间戳调用与操作系统完美同步。JVM 何时以及如何同步其时钟?在启动时还是每次调用这两种方法时?
我的操作系统时间与 NTP 服务器完美同步。
我在 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) intJava中将两个s相除并没有什么特别之处。除非处理两种特殊情况之一:
ArithmeticException)Integer.MIN_VALUE / -1,JVMS 要求结果等于Integer.MIN_VALUE)(这个问题只针对这种情况)。有一种特殊情况不满足此规则:如果被除数是该
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) 我目前正在优化一个特定的方法,不幸的是它被 JVM 内联,这会阻止它被正确地向量化。我注意到有一个禁止内联的注释,即jdk.internal.vm.annotation.DontInline. 但是,无法从默认模块访问它。
是否有一种干净的方法可以访问此注释或以其他方式防止内联有问题的方法?
请解释 JVM 如何在底层收集 ThreadDump。
我不明白它如何收集脱离 CPU 的线程的堆栈跟踪(等待磁盘 IO、网络、非自愿上下文切换)。
例如,linux perf 仅收集有关 CPU 线程(使用 CPU 周期)的信息