JAVA8 JVMメモリ構造は、永久的なメタスペースの生成を変更しました

記事では、「構造のメモリは、JVMを説明し、我々はJava7前のJVMのメモリ構造を説明したが、Java8でJVM以降メモリ構造では、ゆっくりと変更します」。インタビュアーとして、あなたがわからない場合は、面接のプロセスは再びいくつかの無知ではないでしょうか?インタビュアーとして、これらの変更を認識した場合、今度はインタビューのハイライトになります。

ネットワーク上の検索JVMのメモリ構成は、90%がJava7、前のメモリ・マップに見つけることができれば、この記事では、再度、JVMメモリ構造精密化にJava8後の内部変化の深い理解になります。今見て「新しい地平線番組、」小節の公開数の利点を実現。ここでは、常にあなたの知識や意識をリフレッシュすることができます。

[転送] https://www.choupangxia.com/2019/10/22/interview-jvm-gc-02/

JVMメモリ構造精密化

そして、「見てJVMのメモリ構造の詳細な」メモリ構造図。

JVMのメモリ構造

より詳細な説明については、我々はさらに調整を最適化するために、このチャートを参照してください。java7と洗練の以前のバージョンのために。

JVMのメモリ構造

いくつかの変更を参照してください?ヒープおよびメソッド領域は、一緒にリンクされているが、それは、ヒープおよびメソッド領域が一緒にいる、彼らはまだ論理的に分離されていると言うことはありません。しかし、物理的に言えば、彼らはまた、メモリの連続ブロックです。言い換えれば、法とエデンの前の面積と、私たちは古いの連続について話しました。

JVMのメモリ構造

仕様と実装:続行を続行する前に、我々は、最初の2つの概念を理解します。

仕様と実装

特別な「Java仮想マシン仕様」は、異なるベンダーが異なる仮想マシンの実装を持って、規範に従うことをJava仮想マシンの実装のためにあります。開発プロセスよりもインターフェイスの定義のように、特定のインターフェイスは、それがさまざまなビジネスニーズに応じて実装することができます。

PS:私は、「Java仮想マシン仕様、」いいえ公共の懸念「プログラムの新しい地平」を見てする必要があり、Java SEの仮想マシン仕様のPDFバージョン7のために「002」を返信します。

我们通常使用的Java SE都是由Sun JDK和OpenJDK所提供,这也是应用最广泛的版本。而该版本使用的VM就是HotSpot VM。通常情况下,我们所讲的java虚拟机指的就是HotSpot的版本。

永久代(PermGen)

上面理解了规范和实现之后,来看认识一个概念“永久代(Permanet Generation,也称PermGen)”。对于习惯了在HotSpot虚拟机上开发、部署的程序员来说,很多都愿意将方法区称作永久代。

本质上来讲两者并不等价,仅因为Hotspot将GC分代扩展至方法区,或者说使用永久代来实现方法区。在其他虚拟机上是没有永久代的概念的。也就是说方法区是规范,永久代是Hotspot针对该规范进行的实现。

理解上面的概念之后,我们对Java7及以前版本的堆和方法区的构造再进行一下变动。

JVMのメモリ構造

再重复一遍就是对Java7及以前版本的Hotspot中方法区位于永久代中。同时,永久代和堆是相互隔离的,但它们使用的物理内存是连续的。

永久代的垃圾收集是和老年代捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。

但在Java7中永久代中存储的部分数据已经开始转移到Java Heap或Native Memory中了。比如,符号引用(Symbols)转移到了Native Memory;字符串常量池(interned strings)转移到了Java Heap;类的静态变量(class statics)转移到了Java Heap。

然后,在Java8中,时代变了,Hotspot取消了永久代。永久代真的成了永久的记忆。永久代的参数-XX:PermSize和-XX:MaxPermSize也随之失效。

元空间(Metaspace)

对于Java8,HotSpots取消了永久代,那么是不是就没有方法区了呢?当然不是,方法区只是一个规范,只不过它的实现变了。

在Java8中,元空间(Metaspace)登上舞台,方法区存在于元空间(Metaspace)。同时,元空间不再与堆连续,而且是存在于本地内存(Native memory)。

JVMのメモリ構造

本地内存(Native memory),也称为C-Heap,是供JVM自身进程使用的。当Java Heap空间不足时会触发GC,但Native memory空间不够却不会触发GC。

JVMのメモリ構造

针对Java8的调整,我们再次对内存结构图进行调整。

元空间存在于本地内存,意味着只要本地内存足够,它不会出现像永久代中“java.lang.OutOfMemoryError: PermGen space”这种错误。看上图中的方法区,是不是“膨胀”了。

默认情况下元空间是可以无限使用本地内存的,但为了不让它如此膨胀,JVM同样提供了参数来限制它使用的使用。

  • -XX:MetaspaceSize,class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当的降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize(如果设置了的话),适当的提高该值。
  • -XX:MaxMetaspaceSize,可以为class metadata分配的最大空间。默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空间容量的百分比,减少为class metadata分配空间导致的垃圾收集。
  • -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空间容量的百分比,减少为class metadata释放空间导致的垃圾收集。

永久代为什么被替换了

思考一下,为什么使用元空间替换永久代?

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

要素のスペースを使用する場合は、メタデータはずっとMaxPermSizeをもはやによって制御されるようにロードされ、実際に使用可能なスペースのシステムによって制御することができます。

深い理由かのJRockitとHotSpotのコードをマージする、JRockitの呼び出されることはありません恒久的な世代、運用・保守要員は、永久的な世代のサイズのセットを開発する必要がありますが、うまく動作しますしません。同時に、運用パフォーマンスの問題を心配し、テストのカバーで、プログラムアップと1%未満でスピードを実行しているが、より高いセキュリティと引き換えに、この性能の低下はありません。

おすすめ

転載: www.cnblogs.com/hanhaotian/p/11724172.html