java虛擬機器記憶體管理

來源:互聯網
上載者:User

標籤:決定   情境   常量   記憶體管理   技術   內容   fine   字串   垃圾收集器   

  • 虛擬機器運行時資料區
    • 線程共用
      • java Heap
        •  java heamp是java虛擬機器可組態管理的最大記憶體區;唯一的目的用於儲存執行個體對象,所有線程共用;
        • GC堆,回收技術主要採用分代收集演算法;java Heap細分為:新生代、老生代;劃分本身與存放內容無關;無論怎麼劃分,都是為了更好的分配和回收記憶體;
        • 邏輯上連續,物理上未必連續;
        • 利用-Xms、-Xmx進行配置,無法分配及擴充時,將會拋出OutOfMerroyError錯誤;
      • method area
        • 儲存物件:虛擬機器載入的類資訊、常量、靜態變數、JIT編譯器編譯後的代碼
        • alias name: Non-Heap
        • HotSpot虛擬機器,Permanent Generation(永久代),實際上兩者並不等價,將GC擴充到方法區;
    • 線程隔離
      • native method stack
      • program counter register
        • 線程私人;
        • java虛擬機器多線程通過線程輪流切換並分配處理器執行時間;
        • 多線程輪流切換,必然需要在某刻恢複線程在上次執行的執行地址;例如一個線程在執行一個方法,計數器記錄就是線程執行的虛擬機器位元組碼指令的地址;如果是Native方法,那麼計數器的值為空白(undefined)
        • 唯一一個無OutOfMemoryError的記憶體
      • vms stack
    • 直接記憶體
      • direct memory, 並非是虛擬機器運行時資料區的一部分;
      • NIO(new input/output), channel+buffer新型IO,利用Native函數庫直接分配堆外記憶體;利用儲存在java-heap中的DirectByteBuffer對象對該塊記憶體進行直接引用操作;優點是避免在java-heap和native-heap之間進行來回複製資料
      • OutOfMerroyError錯誤;
  •  對象
    • 記憶體配置方式
      • 指標碰撞(bump the pointer)---ParNew、Serial
      • 空閑列表(Free List)  --- CMS(Mark-Sweep)
    • 決定條件
      • 垃圾收集器是否帶有壓縮整理==>java-heap是否規整
    • 記憶體配置策略
      • 目的:解決衝突問題
      • 方法一:CAS + 錯誤重試===>保證更新操作的原子性
      • 方法二:線程在不同的空間預分配記憶體(java-heap),預分配記憶體稱之為TLAB(Thread Local Allocation Buffer),那個線程需要分配記憶體,就在那個線程的TLAB上分配,只有TLAB用光後分配新的TLAB時,才需要同步鎖定;虛擬機器是否使用TLAB,通過-XX:+/-UseTLAB參數配置;
    • 記憶體布局
      • header、Instance Data、Padding(對齊填充)
      • header: 對象的HashCode\偏向線程ID\GC分代年齡\鎖狀態標誌\類型指標(對象指向它的類別中繼資料的指標)
      • Padding無真實意義;保證資料長度是8位元組的整數倍
      • Instance Data: 父類和子類可能會交叉儲存,較小的子類變數可能會插入到父類變數的空隙之中;相同長度的欄位總被分配到一起,如:shorts/chars、longs/doubles
    • 對象訪問
      • 控制代碼、直接指標
      • 區別
        • 控制代碼方式訪問資料 --- reference(控制代碼地址)-->控制代碼池(存放資料指標)--->對象指標-->資料
          • 優勢:資料移動,reference不用動
        • 直接指標 ----reference(對象指標地址)-->對象指標-->資料
          • 優勢:訪問資料區塊
  •  JVM Error
    • java-heap配置
      • -Xms(堆最小), -Xmx(堆最大)
        • 不可擴充:設定相同
        • -XX:+HeapDumpOnOutOfMemoryError: 當出現記憶體溢出異常時,Dump出當前的記憶體堆的儲存快照
    • 分類
      • 堆溢出
        • memory leak(記憶體泄露)
        • memory overflow(記憶體溢出)
      • 棧溢出(虛擬機器、本地方法)
        • -Xss決定
        • 出現情境
          • 線程請求棧深度>虛擬機器允許深度  -->StackOverfolwError
          • 虛擬機器在擴充棧時未申請到足夠記憶體 -->OutOfMemoryError
      • 方法區、運行時常量池
        • -XX:PermSize -XX:MaxPermSize
        • String.intern(),Native方法,作用:如果常量池中有對應String對象,那麼返回;如果沒有,將對應的字串放入常量池;具體用法:String.ValueOf(i++).intern()
      • 直接記憶體
        • -XX:MaxDirectMemorySize,如果不指定,預設等於-Xmx取值相同

java虛擬機器記憶體管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.