この記事はWeChatの公開アカウント「bugstack」から転載したもので、著者はXiao Fu Geです。この記事を転載する場合は、bugstack の公開アカウントにご連絡ください。 目次
1. はじめに 30 歳になるのがどれだけ大変かについての記事を読みました。 各記事の冒頭では、私はいつも世界に対する私の個人的な見解について書きたいと思っています。 最近、30歳になるのがいかに大変かについての記事を見ました。この記事の主人公の中には、勉強、仕事、生活、恋愛などで不幸になっている人もいるようです。これを見逃すか、間違った方向に進んでしまうかのどちらかです。要するに、不運な人たちが人生と戦っているようなものです! しかし、実際には、遅かれ早かれ、誰もが人生で最も困難な時期に遭遇するかもしれません。私が卒業して間もなく起こった一連の出来事のように;冬に初めて携帯電話を紛失し、水に浸かったパソコンを修理しなければならなくなり、賃貸住宅で初めて騙されました。一連の出来事の中で初めて、給料が支払われる前に朝食や昼食を少なくして、その食事を乗り切れるかどうか試さなければなりませんでした。 ハハハハ、今考えるとなかなか面白いですが、こうしたひどい出来事の多くは、私の認識と能力が不十分だったときに間違った選択をしたために起こったことなのです。 車を運転したいなら、運転免許証を取得する必要があります。遠くまで行きたいなら、能力が必要です。認知力を高め、視野を広げましょう!人生の意味は常に自分自身をアップデートすることです! 2. 面接の質問 飛行機をありがとう、シャオジ!冬の風が吹き、戦いの太鼓が鳴り響く。ベッドの中で、誰が誰を恐れているのでしょうか? 「謝非機」:ねえ?お兄ちゃん、そこにいますか? インタビュアー:どうしたんですか?週末です。どうしてこんなに早く電話するんですか? 「謝飛機」:私は Google に行って、御社が使うための JVM を書く夢を見て、飛び上がってバグを修正しました。 インタビュアー:えっ!?さて、お聞きしたいのですが、JDK 1.8 と JDK 1.7 の間でランタイム データ領域の設計をどのように最適化しましたか? 「フライトありがとう」: これは私が書いたものではないので、わかりません! インタビュアー:くそ。 。 。 3. JDK1.6、JDK1.7、JDK1.8 におけるメモリ モデルの進化 図 25-1 JDK1.6、JDK1.7、JDK1.8 のメモリ モデルの進化 図 25-1 は、JDK 1.6、1.7、および 1.8 のメモリ モデルの進化を示しています。実際、このメモリ モデルは、JVM 仮想マシン仕様に準拠した JVM ランタイム データ領域の特定の実装プロセスです。 図 25-1 の各バージョンの反復はすべて、CPU パフォーマンスの向上に適応し、JVM の動作効率を最大化するように設計されています。 JVM メモリ モデルのこれらのバージョン間の主な違いは次のとおりです。
4. メモリモデルの各領域の紹介 1. プログラムカウンタ より小さなメモリ空間 (スレッド専用) には、現在のスレッドによって実行されたバイトコードの行番号が記録されます。 Java メソッドが実行されると、カウンターは仮想マシン バイトコードの現在の命令のアドレスを記録し、ネイティブ メソッドの場合は空になります。 この領域には OutOfMemoryError が定義されていません。 上記はプログラムカウンタの定義です。これが意味不明な場合は、例を挙げてみましょう。 円の円周を計算する Java メソッド コードを定義します。
次に、図 25-2 は、仮想マシンでのこのコードの実行プロセスを示しており、左側の行番号はプログラム カウンタに対応しています。 図25-2 プログラムカウンタ これらの各行番号は、スタックのプッシュやポップ、あるいは計算の実行など、実行する必要があるバイトコード命令に対応しています。 スレッドプライベートである理由は、プライベートでない場合、計算プロセス全体の最終結果が間違ってしまうためです。 2. Java仮想マシンスタック
この定義だけではまだあまり意味が分からないかもしれませんので、別の例を見てみましょう。 これはフィボナッチ数列を評価する例です。仮想マシン内でのフィボナッチ数列の実行プロセスを通じて、Java 仮想マシン スタックの目的を理解することができます。 フィボナッチ数列は黄金比数列としても知られ、数学者レオナルド・ダ・フィボナッチがウサギの繁殖の例を用いて導入したことから「ウサギ数列」とも呼ばれています。これは、1、1、2、3、5、8、13、21、34、... という数字の列を指します。数学では、フィボナッチ数列は次のように再帰的に定義されます。F(1)=1、F(2)=1、F(n)=F(n-1)+F(n-2)(n>=3、n∈N*) フィボナッチ数列は、現代物理学、準結晶構造、化学などの分野に直接応用されています。このため、アメリカ数学会は1963年から「フィボナッチ・クォータリー」という数学雑誌を発行しており、この分野の研究成果を発表しています。 図25-3 仮想マシンスタックにおけるフィボナッチ数列の実行プロセス 全体のプロセスはメソッドの呼び出しと戻りです。オペランド スタックの深さとローカル変数のサイズは、呼び出しプロセス中に要求されます。 そして、それぞれの領域から対応する情報を取得して操作するのですが、これが実は積み重ねとポップのプロセスなのです。 3. ネイティブメソッドスタック ローカル メソッド スタックは、Java 仮想マシン スタックと同様の機能を持ちます。唯一の違いは、ローカル メソッド スタックはネイティブ メソッドを実行するのに対し、仮想マシン スタックは JVM に Java メソッドの実行を提供するという点です。 さらに、Java 仮想マシン スタックと同様に、ネイティブ メソッド スタックでも StackOverflowError および OutOfMemoryError 例外がスローされる可能性があります。 JDK1.8 HotSpot 仮想マシンは、ローカル メソッド スタックと仮想マシン スタックを 1 つに直接結合します。 ローカル メソッド スタックについては上記の例ですでに説明されているため、ここでは詳細には説明しません。 4. ヒープとメタスペース 図25-4 Javaヒープ領域の分割
コマンドでメタスペースを表示する jinfo でデフォルトの MetaspaceSize サイズ (約 20M) を確認すると、MaxMetaspaceSize が比較的大きいことがわかります。 「その他:JDK1.8 メタスペースの紹介:」 Hotspot の永続世代の内容の一部を Java ヒープに移動し、残りをネイティブ メモリに移動します。 http://openjdk.java.net/jeps/122 5. コンスタントプール JDK 1.7 以降、定数プールは永続世代から分離され、JDK 1.8 では永続世代が削除されました。文字列定数プールは、文字列オブジェクトまたは文字列オブジェクトへの参照を格納するために常にヒープ領域に配置されます。 5. 手動仮想マシン(メモリモデル) 実際、上記の内容では、JVM 仮想マシンのメモリ モデル、つまりランタイム データ領域の構造が十分に紹介されました。しかし、自分で操作できるコードがないので、読んだ後にこのことを忘れてしまうかもしれません。 「それで」、ここでは、Java コードを使用して、データ スロット、スタック フレーム、ローカル変数、仮想マシン スタック、ヒープに関するコード構造のセクションを記述し、仮想マシン メモリ モデルについての印象をより深めたいと思います。 1. プロジェクト構造 ランタイムデータ領域
上記の部分は、Java を使用して実装された JVM 仮想マシン機能の一部であり、主に次の内容が含まれます。
2. キーコード オペランドスタック
「仮想マシンスタック オペランドスタック」
「スタックフレーム」
6. jconsole によるメタスペースオーバーフローの監視 JDK 1.8 のメモリ モデルでは、永続世代が削除され、メタスペースに置き換えられたのではないですか?しかし、テストしなければ、感じることができず、証拠もありません! コード ロジックに関するすべての学習には、深い印象を残すためのデータ基盤と証明プロセスが必要です。さあ、メタスペースを埋め尽くして OOM にしましょう! 1. 大きなオブジェクトを継続的に作成するコードを見つける
インターネット上で CGLIB に基づいたセクションを見つけました。他にも書いてみてください。 Thread.sleep(5000); しばらくスリープして確認できるようにします。そうしないと、プログラムの実行速度が速すぎると異常になります。 2. メタスペースのサイズを調整する デフォルトでは、メタスペースは結果をテストするには大きすぎるため、小さいサイズに調整します。
3. 監視パラメータを設定する jconsole 監視に基づいて、次のパラメータを設定する必要があります。
4. テスト実行 4.1 構成パラメータ 上記のテスト パラメータは、次のように IDEA で設定してプログラムを実行できます。 図25-5 プログラム実行パラメータの設定とOOMの監視 また、jconsole は IDEA が提供するターミナルから起動することもできます。 jconsole と入力して Enter キーを押すだけです。 4.2 テスト結果
これが私たちが求めている文、「java.lang.OutOfMemoryError: Metaspace, metaspace OOM」です。これは、JDK1.8 で permanent 世代が削除され、metaspace に置き換えられたことを証明しています。 4.3 スクリーンショットの監視 図25-6 jconsoleによるメタスペースオーバーフローの監視 図25-6は、監視プログラムのOOMが発生した場合のメタスペース表現を示しています。これで、このメタスペースの雰囲気がつかめました。 七。結論 この記事では、プログラム カウンター、Java 仮想マシン スタック、ネイティブ メソッド スタック、ヒープ、メタスペースなど、さまざまな領域を理解するために、さまざまなバージョンの JDK におけるメモリ モデル構造の進化について説明します。また、JDK 1.8 以降でメソッド領域を削除し、メタスペースを導入する主な目的と機能を理解します。 JVM コードを手動で読み取ることで、誰もがランタイム データ領域を包括的に理解できるようになり、この方法により、誰もがこの部分の知識を習得できるようになります。 最後に、jconsole を使用して Metaspace オーバーフローのプロセス全体を検出し、学習した内容を実践して、Metaspace が解決する問題とそれをテストする方法を確認します。 |
<<: 企業に利益をもたらすクラウドコンピューティングの利点とは
>>: DevOps と DataOps のために Kubernetes に移行するメリットは何ですか?
Appleは6月からさらに脱Google化を進め、Siri音声アシスタントが提供する検索エンジンサー...
[[385509]]詳細については、以下をご覧ください。 51CTOとHuaweiが共同で構築したH...
本日、Sina が Lakala と O2O 分野およびモバイル決済で提携した場合、両社が提携する可...
文/ 辛海光当初私は、ドラゴンを倒すことができるスキルであるスピーチは、中国のような国では将来がない...
ロシアの業者であるtimewebは13年以上運営されており、今でも非常に有名で、ロシアのVPS業界で...
justg は以前、100M 帯域幅の VPS を宣伝していました。そのときの特別価格は年間 19....
見出しの頭痛、いつまでたってもうまくいかない話題、次から次へと流れていくホットな話題、人気記事の閲覧...
序文一般的な作業でよく使用される分散ロックは、Redis と ZooKeeper に基づいています。...
[[396459]]この記事はWeChatの公開アカウント「New Titanium Cloud S...
最近、地元の自動車情報サイトが開設されてから6ヶ月以上経ち、百度、捜狗、360などのサイトに掲載され...
A5フォーラムは、ウェブマスターネットワークのウェブマスター交流フォーラムです。A5フォーラムは20...
長い間記事を書いていませんでした。最近とても忙しかったです。百度の頻繁な更新は、主要な草の根ウェブマ...
モバイルアプリケーション業界のデータ調査機関であるTalkingDateの5月の統計報告によると、国...
Sharktech は、オランダのアムステルダム データ センターに設置され、デフォルトで 40Gb...
17歳のシャオ・リンは小学校しか卒業していないが、興味があったため独学でコンピューターのウェブサイト...