1
Joyent SmartOS 인스턴스에서 dtrace로 Java 스택을 가져올 수 없습니다. 고양이 Loop.javaDTrace에 ustack()이있는 Java 프레임이 누락되었습니다. Joyent SmartOS 인프라 컨테이너에서 실행
[[email protected] /demo]# cat Loop.java
class Loop {
public static void main(String[] args) throws InterruptedException {
while (true) {
System.out.println("Sleepy");
Thread.sleep(2000);
}
}
}
[[email protected] /demo]# javac Loop.java
[[email protected] /demo]# java Loop
나는 libdtrace_forceload.so
등을 추가 :
java:15.1.1
이미지와 내가 오픈 JDK 8
내가 가장 기본적인 예를 설치 일반 SmartOS 'base64로'이미지를, 시도 recommended.
[[email protected] /demo]# java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.7.0-internal-pkgsrc_2015_05_29_19_05-b00)
OpenJDK 64-Bit Server VM (build 24.76-b04, mixed mode)
내가 DTrace를 실행하고, jstack을 사용
, 내가 C-스택을 얻을 :export LD_AUDIT_64=/usr/lib/dtrace/64/libdtrace_forceload.so
그것은 64 비트 JVM입니다. ustack 도우미를 나열 할 수있는 방법이 있나요 그리고 그들은로드 된 경우 :
[[email protected] ~]# dtrace -l | grep hotspot | more
6103 hotspot32597 libjvm.so _ZN17VM_GenCollectFull4doitEv gc-begin
6104 hotspot32597 libjvm.so _ZN15VM_GC_Operation13notify_gc_endEv gc-end
6105 hotspot32597 libjvm.so _ZN26VM_GenCollectForAllocation4doitEv gc-end
6106 hotspot32597 libjvm.so _ZN35VM_GenCollectForPermanentAllocation4doitEv gc-end
6107 hotspot32597 libjvm.so _ZN17VM_GenCollectFull4doitEv gc-end
6132 hotspot32597 libjvm.so _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread class-initialization-end
6133 hotspot32597 libjvm.so _ZN13instanceKlass15initialize_implE19instanceKlassHandleP6Thread class-initialization-erroneous
6441 hotspot_jni32597 libjvm.so jni_DeleteLocalRef DeleteLocalRef-entry
6442 hotspot_jni32597 libjvm.so jni_DeleteLocalRef DeleteLocalRef-return
6443 hotspot_jni32597 libjvm.so jni_DeleteWeakGlobalRef DeleteWeakGlobalRef-entry
6444 hotspot_jni32597 libjvm.so jni_DeleteWeakGlobalRef DeleteWeakGlobalRef-return
6445 hotspot_jni32597 libjvm.so jni_DestroyJavaVM DestroyJavaVM-entry
6446 hotspot_jni32597 libjvm.so jni_DestroyJavaVM DestroyJavaVM-return
질문 : 핫스팟 프로브를 사용할 수 있습니다 참조 할
[[email protected] ~]# pgrep -fn "java Loop"
32597
[[email protected] ~]# dtrace -n 'syscall:::entry/pid == 32597/ { @num[ustack(20)] = count(); }'
dtrace: description 'syscall:::entry' matched 237 probes
^C
libc.so.1`__write+0xa
libjvm.so`_ZN2os5writeEiPKvj+0x128
libjvm.so`JVM_Write+0x34
libjava.so`writeBytes+0x1b5
libjava.so`Java_java_io_FileOutputStream_writeBytes+0x1f
0xffffbf7ffa612d98
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa606058
0xffffbf7ffa6004e7
libjvm.so`_ZN9JavaCalls11call_helperEP9JavaValueP12methodHandleP17JavaCallArgumentsP6Thread+0x31d
*snip*
: 그러나, JAVA 프레임은 원시 주소는 꽤 쓸모가 ? Java 스택을 얻는 방법은 무엇입니까?
예, jstack()이어야합니다. 나를 한 걸음 더 가까이 가져와. Oracle JDK에서는 작동하지만 java의 openjdk에서는 작동하지 않습니다. 15.1.1 – Gamlor