[Java]java內存及數據區

Java運行時的數據區包括:(其中前兩個是線程共享的)

  • 1.方法區(Method Area) 存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯後的代碼等數據java

  • 2.堆(Heap) 存放對象實例,幾乎全部對象實例都在這裏分配內存數組

  • 3.虛擬機棧(VM Stack) 描述的是Java方法執行的內存模型:每一個方法在執行的同時會建立一個Stack Frame(方法運行時的基礎數據結構)用於存儲局部變量表、操做數棧、動態鏈接、方法出口等信息緩存

  • 4.本地方法棧(Native Method Stack) 與虛擬機棧了相似,不過則爲虛擬機使用的到的Native方法服務。(有的虛擬機譬如Sun HotSpot虛擬機直接把本地方法棧和虛擬機棧合二爲一)數據結構

  • 5.程序計數器(Program Counter Register) 可看做當前線程所執行的字節碼的行號的標識器jvm


JVM內存整體一共分爲了4個部分:

一、stack segment
二、heap segment
三、code segment
四、data segment)
  • 當咱們在程序中聲明一個局部變量的時候,此變量就存放在了 stack segment(棧)當中;優化

  • 當new 一個對象的時候,此對象放在了heap segment(堆)當中;線程

  • static 的變量或者字符串常量 則存在在 data segment(數據區)中;code

  • 類中方法是存在在 code segment(代碼區)中。對象


java虛擬機的內存能夠分爲三個區域:

  • 棧stack內存

    • 特色:
      • (1)、棧描述的是方法執行的內存模型,每一個方法被調用都會建立一個棧幀(存儲局部變量、操做數、方法入口等);
      • (2)、JVM爲每一個線程建立一個棧,用於存放該線程執行方法的信息(實際參數、局部變量等);
      • (3)、棧屬於線程私有,不能實現線程間的共享;
      • (4)、棧的存儲特性是 先進後出,後進先出
      • (5)、棧是由系統自動分配,速度快,棧是一個連續的內存空間。
  • 堆heap

    • 特色:
      • (1)、堆用於存儲建立好的對象和數組(數組也是對象);
      • (2)、JVM只有一個堆,被全部線程共享;
      • (3)、堆是一個不連續的內存空間,分配靈活,速度慢。
  • 方法區method area( 位於堆中)

    • 特色:
      • (1)、JVM只有一個方法區,被全部線程共享;
      • (2)、方法區實際也是堆,只是用於存儲類、常量相關的信息;
      • (3)、用了存放程序中永遠是不變或惟一的內容。(類信息【Class對象】、靜態變量、字符串常量等)

java運行時數據區

  • 運行時數據區包括:虛擬機棧區,堆區,方法區,本地方法棧,程序計數器

    • 虛擬機棧區 :也就是咱們常說的棧區,線程私有,存放基本類型,對象的引用和 returnAddress ,在編譯期間完成分配。

    • 堆區 , JAVA 堆,也稱 GC 堆,全部線程共享,存放對象的實例和數組, JAVA 堆是垃圾收集器管理的主要區域。

    • 方法區 :全部線程共享,存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯後的代碼等數據。這個區域的內存回收目標主要是針對常量池的對象的回收和對類型的卸載。

    • 程序計數器 :線程私有,每一個線程都有本身獨立的程序計數器,用來指示下一條指令的地址。

java內存模型

  • Java線程之間的通訊由Java內存模型(簡稱爲JMM)控制,JMM決定一個線程對共享變量的寫入什麼時候對另外一個線程可見。

    • 從抽象的角度來看,JMM定義了線程和主內存之間的抽象關係:線程之間的共享變量存儲在主內存(main memory)中,每一個線程都有一個私有的本地內存(local memory),本地內存中存儲了該線程以讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,並不真實存在。它涵蓋了緩存,寫緩衝區,寄存器以及其餘的硬件和編譯器優化
    • volatile變量的寫-讀能夠實現線程之間的通訊。
    • 從內存語義的角度來講,volatile與監視器鎖有相同的效果:volatile寫和監視器的釋放有相同的內存語義;volatile讀與監視器的獲取有相同的內存語義。

知識點積累

  • 一、String str1 = 「abc」,「abc」分配在內存字符常量區;

  • 二、程序計數器是一個比較小的內存區域,用於指示當前線程所執行的字節碼執行到了第幾行,是線程隔離的;

  • 三、虛擬機棧描述的是Java方法執行的內存模型,用於存儲局部變量,操做數棧,動態連接,方法出口等信息,是線程隔離的;

  • 四、原則上講,全部的對象都在堆區上分配內存,是線程之間共享的

相關文章
相關標籤/搜索