それで、JVMはバイトコードをそれが書かれたネイティブマシンコード(JVM)に変換しますか?
これまで見てきたすべての JVM 実装は、バイトコードを VM 用に作成されたネイティブ マシン コードに変換しています。方法と理由はわかりませんが、そうしないと便利です。
また、ジャストインタイムコンパイラとは正確には何ですか?
これは、実行時にバイト コードをネイティブ コードに変換する単純なプロセスです。ただし、パフォーマンスの向上のために、プログラムの実行と並行して VM によって実行されています。また、通常は、コンパイルされたネイティブ コードのキャッシュや、その他のパフォーマンス向上の手法も含まれます。
もしそうなら、それは安全性が低くありませんか?
まあ、ある程度はそうです。非常に小さな程度。JITコンパイルを排除するさまざまなOSへのセキュリティ関連の変更がいくつかあります。たとえば、grsecurity Linux カーネル パッチは、実際には JIT を不可能にしています (実際には、JIT コンパイルされたコードを実行することは不可能です)。もう 1 つの事実は、同様のメモリ保護メカニズム (書き込み可能なメモリ ページを実行できない) が iOS に実装されているため、ユーザー モードで JIT コンパイルを実行することが不可能になっていることです。