17

Webサイトから次のことに気づきました。JVMHotSpotメモリは3つのメモリスペースに分割されています。

  • Javaヒープ
  • PermGen(永久世代)スペース
  • ネイティブヒープ(Cヒープ)

hotSpot JVMのどこにスタックが割り当てられていますか?ネイティブヒープでは?

更新:別の参照情報:64ビットVMの場合、Cヒープ容量=物理サーバーの合計RAMと仮想メモリ–Javaヒープ– PermGen

4

2 に答える 2

24

答えは次のとおりです。

  1. 実装に依存します。

  2. 私が見た実装では、スレッドスタックの割り当ては標準のCネイティブスレッドライブラリによって処理され、ライブラリがOSにスタックのメモリセグメントを割り当てるように見えました。したがって、「上記のどれでもない」。

  3. これは、プラットフォームに関連するOpenJDKソースコードを調べることで確認できます。

アップデート

古い質問からpthread_create、スレッドスタックの割り当てを要求するコードのスニペットを次に示します。このメソッド、JVMスレッドの実装がネイティブスレッドを作成するために使用します。

 mmap(0, attr.__stacksize, 
     PROT_READ|PROT_WRITE|PROT_EXEC, 
     MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)

ご覧のとおり、mmapシステムコールを使用して、オペレーティングシステムにメモリセグメントを要求します。コメントで述べたように、これは通常のJavaヒープでも、Permgenヒープでも、Cネイティブヒープでもありません。これは、オペレーティングシステムから特に要求されたメモリのセグメントです。

参考までに、mmapsyscallの手動エントリへのリンクを次に示します。


更新:別の参照情報:64ビットVMの場合、Cヒープ容量=物理サーバーの合計RAMと仮想メモリ–Javaヒープ– PermGen

IMO、それは過度に単純化されています。(そして、この情報を見つけた場所へのリンクを提供してください...元の形式で読むことができます。)

于 2012-06-14T01:22:37.850 に答える
1

いずれかの方法でそれらへのアクセスを見つけることができれば、2番目のSun(または現在のOracle?)はすぐにパッチを出します。

これらの種類のものにアクセスできることは、大きなセキュリティリスクです。大企業向けの多くのシステムはJavaを使用していました。割り当てスペースを追跡できる場所に穴を残すことはできません。

上記のように、MMAPはスペースを割り当て、必要なプログラムとスペースの要件に合わせてスペースを返します。私はほぼ毎日MMAPでたくさんのことをしています。

おそらく、(システムをより適切に保護するために)物事の使用方法が少し暗いと思うので、作業をキャンセルするためのホットフィックスがあるか、チームアメリカ世界警察があなたを疑ってドアをノックしていることを確認してください不正行為の、そしてその過程であなたのすべての機器を押収します。

于 2012-06-22T18:53:03.677 に答える