Faargm:
私のような質問を見てきましたか-DO-あなたクラッシュ-JVMと最短コード-その-昇給-SIGSEGV
いくつかのJavaコードは次のように農産物SIGSEGVにあります。
final Constructor<Unsafe> unsafeConstructor = Unsafe.class.getDeclaredConstructor();
unsafeConstructor.setAccessible(true);
final Unsafe unsafe = unsafeConstructor.newInstance();
System.out.println(unsafe.getAddress(0));
それがタイプされたSIGSEGV生産V
(VMフレーム)。
# JRE version: Java(TM) SE Runtime Environment (8.0_101-b13) (build 1.8.0_101-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.101-b13 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x1e2440]
そして、そこにあるCrash in Compiled Code
に応じhttps://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/crashes001.html。
とにかく型付きが生成するのだろうかJ
セグメンテーションフォールトを。
そして、私のようないくつかのLIBの問題を見てきましたJVMがクラッシュ。(それはそれを手動で作成することができますを示しているので?)
apangin:
ここでコンパイルされたコードでクラッシュを再現するプログラムです。
import sun.misc.Unsafe;
import java.lang.reflect.Field;
public class Crash extends Thread {
static volatile Object obj = 0;
public static void main(String[] args) throws Exception {
new Crash().start();
// Give some time to compile run() method
Thread.sleep(2000);
Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
// Overwrite Object's class field, so that 'instanceof' cannot work
unsafe.putInt(obj, 8L, -1);
}
public void run() {
while (!(obj instanceof Runnable)) {
// Loop until crash
}
}
}
だから、それがどのように動作しますか。(それとも「それはどのように言って右になりません作品」:)
- 無限ループでスレッドを実行します。このループは、明らかに「ホット」であるので、この方法は、JITコンパイルを取得します。
instanceof
以降のチェックは、離れて最適化することができないobj
揮発性です。- いくつかの時間の後、私たちを台無し
obj
オフセット#8で、そのクラスのフィールドにゴミを書き込むことによって、ヘッダー。 - これは、コンパイルされたコードを壊し
instanceof
チェックがオブジェクトクラスに依存しています。
そして、私たちが買ってあげるものをここに。
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000368b6ad, pid=9660, tid=0x00000000000032f0
#
# JRE version: Java(TM) SE Runtime Environment (8.0_192-b12) (build 1.8.0_192-b12)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.192-b12 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# J 38% C2 Crash.run()V (13 bytes) @ 0x000000000368b6ad [0x000000000368b640+0x6d]
#