1

jvm内のUnsafeクラスを使用することで、メモリへの直接の書き込みと読み取りが可能であることを私は知っています。

これが本当に危険で、どういうわけか逆効果であることは別として、私は代わりに、許可されたメモリ位置の境界をチェックするのは誰/何が担当しているのか疑問に思いました。また、すでに割り当てられているメモリが上書きされるのを防ぐメカニズムがある場合も同様です。この最新の質問に関連して、彼がすべきでないことを上書きすることによって、どのような損害を与えることができますか?さて、これは次のように最もよく改革することができます:どのタイプのメモリが書き込むことができるか、またはどのような種類の情報がすでにそこに保存されていますか?

ありがとう

4

2 に答える 2

2

基盤となるオペレーティングシステムは、アプリケーションに割り当てられたメモリの外部に書き込みを行わないようにします(仮想メモリにより、簡単に書き込むことができます)。これを行うと、セグメンテーション違反または同様のエラーが発生します。それに加えて、JVMは独自の境界チェックを実行する場合があります。賢明な(つまり他のアプリケーションの)メモリへの書き込みは絶対に許可されません。JVMで内部構造を上書きできるとは思えませんが、間違っている可能性があります。したがって、あなたの質問に対する答えを要約すると、すべきでない場所での上書きによる損傷の可能性は、最良の場合はアプリケーションが誤動作し、最悪の場合はJVMがクラッシュすることです。

セーフガードに関しては、Unsafeを使用しないのが良いでしょう...それ以外は、もちろん、Unsafeによって割り当てられたメモリ内に独自のメモリアロケータを書き込み、一部の領域にフラグを立てて、アプリケーションコードがその領域に書き込まないようにすることができます。すべきではありません。

したがって、最後の質問に対する答えは、JVMで割り当てられた安全でない領域の外部のメモリにアクセスできる場合、アクセスできるメモリの情報とタイプは、オブジェクトと内部JVM構造のいずれかであるということです。明らかにそれらを変更すると大混乱が発生するため、変更しようとするとクラッシュする可能性があります。

于 2011-10-06T17:01:13.697 に答える
2

Unsafeクラスを使用することにより、許可されたメモリ位置の境界をチェックする責任があります

プロセスのメモリの、触れるべきではない部分を破壊することを防ぐメカニズムがあると思い込まないでください。

付随するコメントUnsafe.getUnsafe()かなり明確です:

[Unsafeインスタンス]は、任意のメモリアドレスでデータの読み取りと書き込みを行うために使用できます。

于 2011-10-06T17:04:49.543 に答える