<em id="3iliw"></em>
  • <progress id="3iliw"></progress>
  • <tbody id="3iliw"><pre id="3iliw"></pre></tbody><dd id="3iliw"><noscript id="3iliw"></noscript></dd>

    <progress id="3iliw"></progress>

    杭州.net培訓
    達內杭州.net培訓中心

    13175137725

    關于JVM的那些事兒

    • 時間:2018-12-24 13:42
    • 發布:轉載
    • 來源:網絡

    以前從不感覺jvm內部的這一塊領域是必須掌握的知識點,大概了解一下就行,甚至可以說是只是知道一些概念化的東西,似乎跟我沒有多大關系,但是隨著工作年限的不斷增加,發現在這件事情真是錯了,特別是在當在乞丐環境下跑項目的時候,從代碼優化到莫名其妙的錯誤排查,總歸能找到這樣那樣的原因,回過頭來想想,才發現,jvm這塊真的很重要,很重要,很重要,重要的事情說三遍,但是依然哪天想起來總是沒有好好的深入的去學習,好了傷疤忘了疼。。。。 如今跨入大數據開發領域,卻發現調優這塊工作無處不在,計算、分析、算法、模式等等似乎總是欠缺點什么東西,得,長痛不如短痛,下功夫深入的了解了一段時間,收貨不少,很多東西也就想開了,記錄一些核心的部分。

    初識

    不想上來就講解jvm構成以及組成部分,百度一搜一大堆,沒什么心意,先從實際的干飯說起,我們從第一天搞Java開發,從來沒有想過new了一個對象或者其他的東西后,需要我們手動去管理過他的內存空間釋放,因為我們知道java有GC垃圾回收器這哥們的存在,他會幫我們處理好一切,這就好比我是皇帝,我想在哪建個行宮就在哪建,至于打掃戰場的事兒,跟我沒有關系,有總管專門去處理這件事情,似乎我們也極少碰見過內存溢出或者內存泄露這種事,看上去似乎是那么的灑脫,可問題就出在這里,因為這就相當于我們放了內存管理的權限下放了,下放給了jvm虛擬機,極少不代表不出現,而一旦出現內存泄露或者內存溢出時,如果你不對你這個總管的工作原理以及內部運作機制有個了解,很有效率的去解決這個問題將會比較困難。

    程序是跑在內存里的,而內存呢又比較寶貴,我們寫的Java程序跑在jvm里,而jvm虛擬機會根據不同的需要,把它自己管理的內存去劃分成幾個重要的區,每個區分工不同,作用不同,下面著重寫一下內存區域。

    一起了解JVM的那些事兒一起了解JVM的那些事兒

    一、JVM運行時內存

    1.方法區:

    程序里面寫的常量、靜態變量、已被jvm加載的類信息等都會存放在這個片區,該區被所有線程共享。

    2.本地方法棧:

    該區為本地方法提供相關的一系列服務,需要注意的是該區域也會拋內存溢出和內存泄露的異常。

    (什么是本地方法??有時java應用需要與java外面的環境交互,比如用java寫的程序需要與一些底層系統或某些硬件時,本地方法正是這樣的一種交流機制,它為我們提供了一個非常簡潔的接口封裝,直接調用即可,不需要去關注底層的實現細節。)

    3.程序計數器

    該區占用內存空間較小,用途跟字面意思是等價的,就是用來計數的,可以看成是線程執行的字節碼的行號指示器,字節碼解釋器工作時是通過改變該計數器的值來選取下一條要執行的字節碼指令,如分支、循環、跳轉、線程恢復等功能,依賴于該計數器。

    在這里多說一點,一個cpu同一時間片段,只能執行一條線程中的指令,當線程切換恢復至自身執行時,也是由該計數器來拿正確的執行位置的,為了達到這個目的,所以,每一個線程都會有自己獨立的程序計數器,線程之間互不影響,獨立存儲,這就是“私有內存”。

    4.堆(該區細節必須熟知和掌握,重中之重)

    該區是jvm管理的內存中分配最大的一塊空間,原因是這里面將會存放所有你通過new出來的對象實例分配,可以這么理解(未來技術的發展,可能會有棧上分配等優化技術的進一步提升),并且該區域是被所有線程共享的一塊內存區域、該區域是GC垃圾收集器管理收集的主要區域(可能會劃分出多個線程私有的分配緩沖區TLAB,進一步劃分只有一個目的,便于垃圾回收)。

    從內存回收的角度來說,(前一段時間,自己寫了一個內存緩存框架,是基于“老年代"實現的,書到用時方恨少)GC是采用分代收集算法的,因此堆依據分代收集劃分為了:新生代、老年代、永久代。后面會單獨開一章節寫寫GC。

    5.棧

    該區為線程私有,聲明周期與線程保持一致,描述的是java方法執行的內存模型,每個方法執行時會創建一個棧幀,用于存儲局部變量、操作數棧、方法出口等,可以這么理解:當你調用一個方法時,調用開始理解為入棧、內部執行完畢結束為出棧。

    二、直接內存

    該區域不屬于jvm運行時管理數據去的一部分,也并非jvm定義的內存區域,那這塊區域是啥呢? 是分配給jvm內存之外的你剩余的直接內存區域部分,這里得提到一個類,NIO,它可以通過調用本地方法函數庫直接分配jvm堆外的內存,并通過java對重的對象作為這塊內存的引用進行操作,很顯然,這塊內存的分配不會受制于jvm堆大小的限制,但是受制于本機總的物理內存的限制。當做虛擬機調優時,不能忽略這塊內存的參數設置,一旦設定的內存區域綜合大于物理內存時,一樣會出現內存溢出等錯誤。

    預約申請免費試聽課

    怕錢不夠?就業掙錢后再付學費!    怕學不會?從入學起,達內定制課程!     擔心就業?達內多家實踐企業供你挑選!

    上一篇:邊緣計算市場能夠取代云計算嗎?
    下一篇:老程序員個人談:C語言時代行將落幕

    大數據時代,絕對不要在社交圈發布這些信息

    一名優秀程序員的需要具備哪些潛質?

    世界的窗口——Web服務器

    老程序員個人談:C語言時代行將落幕

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2018 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    江西省

    貴州省

    廣西省

    海南省

    国拍自产亚洲 2019国拍自产在线,国拍自产亚洲,国产a在线不卡 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>