2022.1.4Javaの基礎 - 構築方法、メモリ管理

コンストラクターのオーバーロード

高麗人参あり、高麗人参なし

public class Point {
    double x,y;

    Point(double _x,double _y){
        x=_x;
        y=_y;
    }

    Point(){

    }
}

Java仮想マシンのメモリモデル

仮想マシンのメモリは、スタック スタック、ヒープ ヒープ、メソッド領域、メソッド領域の 3 つの領域に分割できます。

スタック:

実行されるメソッド、または実行中のメソッドがスタックに置かれます。

  1.  仮想マシンは、スタックに入るメソッドごとにスタック フレームを割り当てます。
  2. 仮想マシンはスレッドごとにスタックを作成し、メソッドの情報 (ローカル変数、実際のパラメータ) を保存します。
  3. スタックはスレッドに対してプライベートであり、スレッド間で共有することはできません
  4. スタックのストレージ特性: 「先入れ先出し、後入れ先出し」
  5. スタックはシステムによって自動的に割り当てられ、高速です スタックは連続したメモリ空間です

ヒープ:

作成されたオブジェクトと配列はヒープに配置されます (配列もオブジェクトです)

  1. 仮想マシンにはヒープが 1 つだけあり、すべてのスレッドで共有されます。
  2. メモリ内のヒープの格納方法が不連続であるため、割り当てが柔軟で速度が遅い
  3. ヒープはすべてのスレッドで共有され、多くのオブジェクトが作成されますが、ガベージ コレクターは、長期間使用されていないオブジェクトを再利用することをさらに計画し、若い世代と古い世代に分割します。

メソッド領域:

唯一のエンティティ コードはメソッド領域、つまりさまざまなブループリント (クラス)、定数プール、静的クラス、メソッドに配置されます。

  1. メソッド領域は javaJVM の仕様であり、さまざまな実装が可能です。
    1. JDK7 は以前は「永続世代」でした
    2. JDK7 は「永続世代」を部分的に削除し、静的変数と文字列定数プールをヒープ メモリに移動します
    3. JDK8は「メタデータ空間」とヒープを組み合わせたものですが、まだ存在しています
  2. JVM にはメソッド領域が 1 つだけあり、すべてのスタックで共有されます。
  3. メソッド領域は実際にはヒープであり、クラスと定数に関連する情報のみを格納します。
  4. クラス情報、静的変数、文字列、定数など、決して変更されないコンテンツを保存します。
  5. 定数プールには主に次のものが保存されます: 文字列、最終的な定数値

ガベージコレクションメカニズム

Java では開発効率を向上させるためにガベージ コレクション メカニズムが導入されており、プログラマはメモリ管理メカニズムにあまり注意を払う必要がありません。

メモリ管理

メモリ管理の大部分は次のとおりです。オブジェクト領域の割り当てと解放を含む、ヒープ内のオブジェクトの管理です。

オブジェクトスペースの割り当て: new キーワードを使用してオブジェクトを作成します

リリース: オブジェクトを null に割り当てるだけです

ガベージコレクションプロセス

ガベージ コレクション アルゴリズムは通常、次の 2 つのことを行います。

  1. 役に立たないオブジェクトを見つけました
  2. 未使用のオブジェクトによって占められていたスペースを再利用する

その発見は、Java のガベージ コレクターが関連するアルゴリズムを通じて不要なオブジェクトを発見し、それらをクリーンアップするというものです。

ガベージ コレクション関連のアルゴリズム

  1. 参照カウントアルゴリズム
  2. 参照到達可能メソッド (ルート検索アルゴリズム): つまり、ノード GC ROOT (現時点で生きているオブジェクト) から開始して、対応する参照ノードを見つけ、すべてのノードが到達するまで、見つかったノード上の参照ノードを見つけます。参照されない場合、他のノードは無駄なノードとみなされます。

参照カウントアルゴリズムについて簡単に説明します

つまり、作成された各オブジェクトには参照カウントがあり、変数がそのオブジェクトを参照するたびに参照カウントが 1 ずつ増加し、逆参照 (null) された場合、参照カウントは -1 になります。

特殊なケース: この種のゴミは認識できません

ObjA と B が外部での参照を停止しても、オブジェクト AB は相互参照しますが、代わりに相互参照しているため、認識できません。

 一般的なバンドのガベージ メカニズム

 これはヒープ内にあるものです。Edem 領域はオブジェクトを保存し、マイナー GC を実行して若い世代をクリーンアップします。その後、Edem 領域内の役に立たないオブジェクトはクリーンアップされ、有用なオブジェクトは次の Survivor 領域に移動します。 、最初のエリア GC でマイナーを実行し、不要なオブジェクトを削除してディストリクト 2 に転送し、その後再びディストリクト 1 に転送します。連続 15 回を超えると、古い世代に転送され、メジャー GC によってクリーンアップされます

フル GC は、若い世代、古い世代、および永続世代 (クラス情報、静的領域などを格納する) をクリーンアップします。

メモリーリーク

これは、ヒープ メモリ内のプログラムが何らかの理由で解放されず、メモリが無駄に消費され、実行速度が低下したり、システム クラッシュが発生したりすることを意味します。

理由

1. 無駄なオブジェクトを大量に作成する

 2. 静的コレクション クラスの使用

多数の静的タグであり、これらのオブジェクトまたはメソッドのプロパティは長期間解放されません

3. さまざまな接続オブジェクト (IO ストリーム オブジェクト、データベース接続オブジェクト、ネットワーク接続オブジェクト) が閉じられていない

4. リスナーの不適切な使用

その他の点

  1. プログラマーにはガベージ コレクターを呼び出す権限がありません
  2. プログラマは System.gc() を呼び出すことができます。これは JVM に通知するだけであり、ガベージ コレクション期間 (フル GC) は実行されません。使用量をできるだけ少なくし、フル GC を適用します。フル GC はコストがかかり、システムのパフォーマンスに影響します。
  3. Object オブジェクトの Finalize メソッドは、プログラマがオブジェクトやリソースを解放するために Java によって提供されるメソッドですが、できるだけ使用しないようにしてください。

これ

各オブジェクトには this があり、独自のオブジェクトのアドレスが保存されます。this.property を呼び出すと、それ自体が呼び出され、メソッドで使用され、受信パラメータが this.property にコピーされます。

静的

 

静的タグが付いた属性やメソッドはクラスに属しますが、属性はオブジェクトの作成と同時に作成されるのではなく、プログラムの開始時に自動的に作成されます。静的な属性やメソッドはクラス情報に含まれます。

静的な初期ブロック

public class TestStatic {
    int id;
    String name;

    static String company = "北京尚学堂";
    static {      
                                          
    //通过static{}来对静态属性初始化赋值

        System.out.println("执行类的初始化工作");
        company="腾讯山西太原分部";
        printCompany();
    }
    public TestStatic(int id,String name){
        this.id=id;
        this.name=name;
    }

    public void login(){
        System.out.println(name);
    }

    public static void  printCompany(){
        //login();
        System.out.println(company);
    }

    public static void main(String[] args) {
        TestStatic u = new TestStatic(101,"张小八");
        TestStatic.printCompany();
        TestStatic.company="北京腾讯分部";
        TestStatic.printCompany();
    }
}

変数の分類と範囲設定

 

ローカル変数、メンバー変数、静的変数の主な違い
タイプ 宣言位置 に従属する ライフサイクル(範囲)
ローカル変数 メソッドまたはステートメント ブロック内 メソッド/ブロック メソッド呼び出しが終了する

メンバー変数

(インスタンス変数)

クラス内、メソッド外 物体

オブジェクトが作成され、それに応じてメンバー変数が作成されます

オブジェクトが消え、メンバー変数も一緒に消えます

静的変数  

(クラス変数)

クラス内での静的変更 親切 クラスがロードされ、静的変数が有効です

パケットの仕組み

クラスを管理し、名前の重複の問題を解決するために使用されるフォルダーです。

package point;

 最後のキーワード

 Object.toString() を理解して書き直す

public class TestObject extends Object{
    String name;
    String pwd;

    @Override
    public String toString() {
        return  "name='" + name +", pwd='" + pwd ;
    }

    public static void main(String[] args) {
        TestObject a = new TestObject();
        System.out.println(a);
    }
}

==和Object.equals()

「==」は両者が同じかどうかを表し、基本型であれば値が等しく、参照型であればアドレスが等しく、同じオブジェクトであることを意味します。

デフォルトでは、equals() は == と同じですが、2 つのオブジェクトのすべての属性が同じかどうかを比較するなど、このメソッドを書き直すと、2 つのオブジェクトが等しいことを意味します。

キーワードスーパー

 

まず、親クラスのサブクラスの static() を呼び出します。

 アクセス修飾子

 

 

 

インターフェース

jdk8 以降、インターフェイスではデフォルトのメソッドと静的メソッドが許可されます

デフォルトのメソッド

public interface TestDefault {
    void printInfo();

    default void more(){
        System.out.println("more,测试默认方法");
    }
}


class TestDefault1 implements TestDefault{


    @Override
    public void printInfo() {
        System.out.println("通过接口实现的方法");
    }

    @Override
    public void more() {
        System.out.println("我重写了more默认方法");
    }
}

おすすめ

転載: blog.csdn.net/qq_41302243/article/details/122298894