免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
、Javaヒープメモリモデル
1、ヒープの特性
オブジェクトを格納するためのヒープメモリ領域。したがって、ガベージコレクタ(GC)管理の主な目標です。
- 「新世代」と「旧時代」に分類ヒープは、論理的に、より慎重にスペースがサバイバーに、サバイバースペースから、エデンに分けることができます。オブジェクトのほとんどがオフJAVA Chaoshengの夜なので、これら二つのオブジェクトの最も効果的な回復を可能にするために、メモリ内の長期居住者の小さな部分がある、ヒープは古いものと新しい世代のに分割し、異なる実行されます回復戦略。別のガベージコレクタこれらの回復メカニズム2異なるロジック領域。これは、後に詳細になります。
- ビューメモリ割り当ての角度、スレッドがJavaヒーププライベートバッファを割り当てられた複数のスレッドに分割することができる共有します。
- ヒープは、一般に「-Xms」および「-Xmx」を使用最小および最大ヒープメモリ、仮想マシンと呼ばれる拡張作用を制御する、拡張可能なメモリサイズとして実装します。しかし、性能のより消費の挙動に起因し、それは一般的に最小と最大ヒープメモリが等しくなるように設定されています。
- スタックができる唯一の論理的に連続し、継続的に占有物理メモリを必要としません。
- 仮想マシンの起動とヒープのライフサイクルは、作成されます。
- ヒープメモリは、エリア内のすべてのスレッドで共有されるため、各スレッドは、ヒープ上の同じオブジェクトを取得することができます。
図2に示すように、異常なヒープ
ヒープがオブジェクトを割り当てることができないと、もはや延長できない場合は、OutOfMemoryErrorがスローされます。
package com.sl.common;
import java.util.ArrayList;
import java.util.List;
/**
* @author shuliangzhao
* @Title: Test
* @ProjectName spring-boot-learn
* @Description: TODO
* @date 2019/9/24 19:41
*/
public class Test {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
while (true) {
list.add(new Test());
}
}
}
常にGCヒープメモリで、その結果、解放を参照せずに作成されているオブジェクト上のコードは、最終的にOutOfMemoryErrorが、リサイクルすることができません。
3、ヒープのパフォーマンスチューニングパラメータ
- -Xmsと-Xmx(または-XX:InitialHeapSizeと-XX:MaxHeapSize):JVMを指定された初期および最大ヒープ・サイズ二同じ値は、各ガベージコレクションが完了した後、メモリ再割当てJVMを回避するために、設定することができます。
- XMN:若い世代のサイズを設定します。ヒープサイズ=サイズ+永続的な世代のサイズの大きさ+旧世代を通じて若い世代。だから、若い世代の増加は、旧世代のサイズを小さくします。この値は、システムのパフォーマンスに大きな影響は、Sunの関係者は3/8のヒープ全体の構成をお勧めします。
- -Xss:各スレッドのスタックサイズを設定します。各スレッドのスタックサイズ後JDK5.0は1Mです。同じ物理メモリでは、この値を小さくするとより多くのスレッドを生成することができます。しかし、プロセス内のオペレーティング・システムのスレッドの数はまだ3000と5000にはない無限の世代、経験、制限されています。
- -XX:+ HeapDumpOnOutOfMemoryErrorと-XX:HeapDumpPath:JVMのヒープメモリは、メモリのオーバーフローが発生した場合に自動的に命をスナップショットしましょう、それがヒープメモリのスナップショットの作成に推奨される(ヒープメモリのスナップショットファイルは非常に大きくなる可能性が、十分なディスク容量のある場所へのパスを指定します。)
- -XX:PermSizeをと-XX:MaxPermSizeを永久ヒープメモリの世代の物理メモリの1/64最小、物理メモリの1/16の最大値、永久世代(デフォルトの初期値と最大サイズを設定します別個の領域は、この組の永久世代のサイズとパラメータ-XXに含まれない:MaxHeapSizeヒープサイズは、で設定)
- -XX:PretenureSizeThreshold:それは古い時代に直接割り当てられた設定値よりもオブジェクトが大きくなります。目的は、メモリ複製の多くは、エデンと2つのサバイバー領域の間の領域に発生しないようにすることです
第二に、地元の方法
仮想マシンのスタックと同様の機能および特徴のネイティブメソッドスタックは、スレッドのアイソレーション特性を有しにStackOverflowErrorとのOutOfMemoryErrorをスローすることができます。違いは、仮想マシンが実行のサービスJVMのJavaメソッドを積み重ねている間に、オブジェクトがネイティブメソッドは、サービスJVMのネイティブメソッドの実行をスタックであるということです。ネイティブメソッドを提供するには?ネイティブメソッドは、どのような言語を使用していますか?そのようなデータサービスメソッドのスタックフレーム構造としてどのような組織?仮想マシンの仕様は必須要件を与えるものではありませんので、別の仮想マシンが本当の達成が自由にすることができ、私たちはしばしばのHotSpot VMの仮想マシン・スタックとネイティブメソッドスタックをマージすることを選択しました。