Java性能優化之JVM內存模型

[TOC]java


JVM內存模型

首先介紹下Java程序具體執行的過程:數組

  • Java源代碼文件(.java後綴)會被Java編譯器編譯爲字節碼文件(.class後綴);
  • 由JVM中的類加載器加載各個類的字節碼文件,加載完畢以後,交由JVM執行引擎執行
  • 在整個程序執行過程當中,JVM會用==一段空間==來存儲程序執行期間須要用到的數據和相關信息,這段空間通常被稱做爲==Runtime Data Area(運行時數據區)==,也就是咱們常說的JVM內存;
  • 所以,在Java中咱們經常說到的內存管理就是針對這段空間進行管理(如何分配和回收內存空間)

JVM的內存劃分和各區域職責

image

  • 程序計數器:程序計數器是指CPU中的寄存器,它保存的是==程序當前執行的指令的地址==(也能夠說保存下一條指令的所在存儲單元的地址),當CPU須要執行指令時,須要從程序計數器中獲得當前須要執行的指令所在存儲單元的地址,而後根據獲得的地址獲取到指令,在獲得指令以後,程序計數器便自動加1或者根據轉移指針獲得下一條指令的地址,如此循環,直至執行完全部的指令;多線程

    注:JVM中的程序計數器並不像彙編語言中的程序計數器同樣是物理概念上的CPU寄存器,可是邏輯做用上是等同的,在JVM中多線程是經過線程輪流切換來得到CPU執行時間的,在任一具體時刻,一個CPU的內核只會執行一條線程中的指令,爲了可以使得每一個線程都在線程切換後可以恢復在切換以前的程序執行位置,每一個線程都須要有本身獨立的程序計數器,而且不能互相被幹擾,不然就會影響到程序的正常執行次序。==所以,能夠這麼說,程序計數器是每一個線程所私有的==
  • Java棧:Java棧是Java方法執行的內存模型,Java棧中存放的是一個個的棧幀,每一個棧幀(包括:局部變量表、操做數棧、運行時常量池(在下文中提到的方法區內)的引用、方法返回地址和一些額外的附加信息)對應一個被調用的方法,當線程執行一個方法時,就會隨之建立一個對應的棧幀,並將創建的棧幀壓棧。當方法執行完畢以後,便會將棧幀出棧;spa

    注:因爲每一個線程正在執行的方法可能不一樣,所以每一個線程都會有一個本身的Java棧,互不干擾
  • 本地方法棧:Java棧是爲執行Java方法服務的,而本地方法棧則是爲執行本地方法(Native Method)服務的;
  • :Java中的堆是用來存儲對象自己的以及數組;
  • 方法區:它與堆同樣,是被線程共享的區域,存儲了每一個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。線程

    注:在方法區中有一個很是重要的部分就是運行時常量池,它是每個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池就被建立出來。固然並不是Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,好比String的intern方法。
相關文章
相關標籤/搜索