jvm內存模型_四種視角看JVM內存模型

1.JVM運行視角

  • 程序計數器

  • Java虛擬機棧

  • 本地方法棧

  • Java堆

  • 方法區

a80b231b31562f6ec580241dad4e4fe5.png?

? ? ? ? 1?.程序計數器

? ? ??? 程序計數器是一塊較小的內存空間,它可以看作是當前線程所執行的行號指示器。這個計數器記錄的是正在執行的虛擬機字節碼指令的地址。此內存區域是唯一一個在JAVA虛擬機規范中沒有規定任何OutOfMemoryError情況的區域。

? ? ? ? 2.Java虛擬機棧

? ? ? ??與程序計數器一樣,Java虛擬機棧也是線程私有的。Java虛擬機棧是描述Java方法運行過程的內存模型。Java虛擬機棧會為每個方法在執行的同時都會創建一個棧幀用于存儲局部變量(存放基本數據類型變量,引用類型的變量,返回類型的變量),操作數棧,動態鏈接,方法出口信息。

? ? ? ? 3.本地方法棧

? ? ? ??本地方法棧與虛擬機所發揮的作用是非常相似的(HotSpot虛擬機中,直接就把本地方法棧和虛擬機棧合二為一),它們的區別不過是虛擬機執行Java方法服務,而本地方法棧則為虛擬機使用到的Native方法服務。本地方法被執行的時候,在本地方法棧也會創建一個幀棧,用于存放該本地方法的局部變量表、操作數棧,動作鏈接,出口信息。方法執行完畢后相應的棧幀也會出棧并釋放內存空間。

? ? ? ?4.Java堆

? ? ???堆是用來存放內存對象的,是Java虛擬機所管理的內存中最大的一塊。所有的對象實例以及數組都要在堆上進行分配。

? ? ? 5.方法區

? ? ???方法區育Java堆一樣,是一個線程共享的內存區域。它用于存儲已被虛擬機加載的類信息,常量,靜態變量、即時編譯器后的代碼等數據。雖然Java虛擬機規范把方法區描述為難的一個邏輯部分,但是它卻有個別名叫做Non-Heap(非堆),目的是為了和Java堆區分開來。

? ? ? 6.直接內存

? ? ??直接內存并不是虛擬機運行時數據區的一部分,也不是Java虛擬機規范中定義的內存區域。但是這部分內存也被頻繁的使用。在JDK1.4中新加入了NIO(New Input/Output)類,引入了一種基于通道和緩沖的IO方式。它可以使用Native函數庫直接分配堆外內存,然后通過一個存儲在Java堆中的DirectByteBuffer對象作為這塊內存的引用進行操作。這樣能在一些場景中顯著提高性能,因為避免了在Java堆和Native堆中來回復復制數據。直接內存的大小不受Java虛擬機控制,但是當本機物理內存不足時就會拋出OutOfMemoryErrot錯誤。

860f20c69255d4caabefd1d2c0d850d9.png

圖二 線程共享與獨有的數據區

思考問題:為什么局部變量是線程安全的?答案見文末最后

2.JVM內存功能視角

從JVM內存可以分為三部分

  • Heap區(堆內存)

  • 非Heap(非堆內存)

  • 其他區

2ce0a532fb7e2fe23a80b40e2f9f7d2a.png

圖三JVM內存功能分區

Heap區:Eden Space(伊甸園),Survivor Space(幸存者區),Tenured Gen(老年代-養老區)

非Heap區:Code Cache(代碼緩沖區),Perm Gen(永久代),Java虛擬機棧,本地方法棧。

其他區:直接內存

3.線程運行視角

0c4b5a016ae0af3d3f7b75b15c1ca204.png

圖片四線程,工作內存和主內存之間的關系

Java內存模型規定了所有的變量都要存儲在主內存中,但是每個線程都有自己的工作內存,線程的工作內存保存了該線程使用的變量。這些變量實際上是主內存的副本拷貝,線程對變量的所有操作都必須在工作內存中進行,而不是直接讀取主內存的變量。】

思考問題:volatile變量?答案見最后

4.垃圾回收視角

JVM的垃圾回收主要針對的是堆內存。在垃圾回收過程,堆內存有以下特點:

  • 堆內存劃分為新生代和老年代兩部分,新生代主要用于存放新創建的對象與存活時長小的對象,老年代則用來存放存活時間長的對象

  • 新生代又進一步劃分為E,S1,S2三個區,其中,E代表Eden區;S1,S2則代表兩個類似的Survior。minorGC時候,Eden區不能被會回收的對象被放入到空的survior,Eden則肯定會被清空。另一個surivor里不能被GC回收的對象也會被放入這個surivor,始終保證一個surivor是空的

  • 一個對象被minorGC回收了N次沒有被回收掉,則會被移除到老年區里(該次數通過設置-XX:InitialTenuringThresHold)

  • 當老年代的空間被耗盡了,則觸發FullGC

?問題解答:

1.為什么局部變量是線程安全的?

JVM在執行Java程序時,會根據其數據用途把內存劃分為若干數據區域,包括方法區,堆,棧(JVM,本地方法棧),程序計數器,其中前兩者是所有線程共有的,后兩者是每個線程獨有的,因此,棧是線程私有的,一個線程一個棧,并且棧由棧幀組成,棧幀保存一個方法的局部變量表(包括參數和局部變量),操作數棧,常量池指針等,每一次方法的調用實際上是創建一個幀棧,并且壓棧。

所以方法調用實際是幀棧在入棧和出棧的操作,因為棧是線程私有的,所以每個棧之間是獨立的,所以幀棧對于多個線程棧來說不存在共享問題,也就不會存在線程安全的問題了

2.Volatile變量

根據JVM規范的規定,volatile變量依然有工作內存的拷貝,但是由于它特殊的操作順序規定,所有看起來如同直接在主內存中讀寫。

如果對申明了volatile的變量進行寫操作,JVM就會向處理器發送一條Lock前綴的指令,將這個變量所在工作所在內存的數據寫回到主內存,但是,就算寫回到主內存,如果其他線程工作內存的值還是舊的,再執行計算操作就會有問題,所以,在多處理器下為了保證各個處理器的緩存是一致的,就會實現緩存一致性協議,,每個處理器通過嗅探在總棧上傳播的數據來檢查自己緩存的值是不是過期了。當處理器發現自己緩存行對應的內存地址被修改,就會將當前處理器的緩存行設置成無效狀態,當處理器對這個數據進行修改操作的時候,會重新從主內存中把數據讀到處理器緩存中。

4d80fffbf43f2f6337df0f948e44ddc7.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/538520.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/538520.shtml
英文地址,請注明出處:http://en.pswp.cn/news/538520.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux mysql失敗_linux下登陸mysql失敗

標簽:一.提示由于沒有密碼,拒絕登陸ERROR 1045 (28000): Access denied for user ‘root‘‘localhost‘ (using password: NO)1.關閉mysql# service mysqld stop2.屏蔽權限# mysqld_safe --skip-grant-table屏幕出現: Starting demo from ..…

Tomcat服務腳本

為什么80%的碼農都做不了架構師?>>> #!/bin/bash ### BEGIN INIT INFO # Provides: tomcat # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # S…

Angular開發準備

cmd,進入項目文件下1、安裝jquerynpm install jquery --save。--save 安裝的同時,將信息寫入package.json中2、安裝bootstrapnpm installbootstrap--save。3、在.angular-cli.json中添加 jquery和bootstrap的引用在styles節點和scripts節點下加入。&quo…

python桌面開發吐血_想用java寫個桌面小demo,就布局都差點寫吐血了,學藝不精...

demo簡略需求項目背景很多文件重復存放,除了管理混亂,還會對患有強迫癥用戶的身心造成10000點的傷害...其實就是360云盤當時上傳了有上傳,造成很多重復的圖片視頻,前陣子360個人云盤“倒閉”,電腦日夜兼程,…

oracle 取當前日期時間的前一天前一小時前一分鐘前一秒

原文鏈接:http://wentao365.iteye.com/blog/779492 點擊閱讀原文 --------------------------------------------------------------------------- SELECT 當前時間 TITLE, TO_CHAR(SYSDATE, yyyy-mm-dd hh24:mi:ss) TIME FROM DUAL --當前時間 UNION ALL S…

mysql8事務級別_Mysql幾種事務隔離級別

前言:之前對mysql的基礎知識通過了幾篇博客進行了一個詳解,包括從數據庫系統的原理以及最基本的操作使用,此篇博客將主要對mysql的事務級別進行實戰分析1.什么是事務?事務是應用程序中一系列嚴密的操作,所有操作必須成…

控制臺應用和空項目有什么區別_互聯網小程序的應用以及APP的應用有什么區別及發展...

隨時移動互聯網進入的千家萬戶,互聯網的手機應用程序也漸漸的在市場上流行起來了。今天主要跟大家談一下互聯網小程序的應用以及APP的應用有什么區別以及未來的發展趨。未來會流行什么手機應用或者APP應用,我帶大家都為了解一下。下邊先來了解一下小程序…

day19_java基礎加強_動態代理+注解+類加載器

一、動態代理 1.1、代理模式 什么是代理模式及其作用? Proxy Pattern(即:代理模式),23種常用的面向對象軟件的設計模式之一。? ? ? ? 代理模式的定義:為其他對象提供一種代理以控制對這個對象的訪問。?…

mysql壓力寫入測試_mysql壓力測試工具

相關推薦:測試工具測試工具 測試管理工具 Quality Center 基于WEB的測試管理工具 Test Director 功能測試工具 QuickTest Professional 性能測試工具 LoadRunner 哪位仁兄有相關…

python中隊列的應用用場景_消息隊列應用場景

原文http://blog.csdn.net/konglongaa/article/details/52208273一、消息隊列概述消息隊列中間件是分布式系統中重要的組件,主要解決應用解耦,異步消息,流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致…

oracle獲取一段時間內所有的小時、天、月

原文鏈接:http://blog.csdn.net/ld422586546/article/details/9626921/ 點擊閱讀原文 ---------------------------------------------------------------------- 獲取一段時間內所有的小時 SELECT to_date(2013-07-01 12, yyyy-mm-dd hh24) (ROWNUM - 1) / 24 s…

eclipse快捷鍵、智能提示

1、Alt / 調出智能提示功能,即使在XML文件中; 2、 轉載于:https://www.cnblogs.com/JAVA-STUDYER/p/9143862.html

python下載網頁歌詞_python3個人學習筆記-批量下載分析歌詞2

我發現之前自己真是太愚蠢了沒有搞清楚正則表達的各種用法。不同詞語的篩選根本不用像re.sub(另一個想替換的內容,另一個替換后的內容,re.sub(想要替換的內容,替換后的內容,x))這樣傻了吧唧地篩一層又一層……(受linux的pipe荼毒太深)正則表達中不同字符的or其實大家都知道是[a…

使用循環鏈表實現一個通訊錄的管理程序_【LeetCode鏈表題型總結】

點擊上方藍字,關注公眾號鏈表概念的講解鏈表是什么鏈表是一種線性數據結構,每個節點都存有數據,通過指針將各個節點鏈接在一起。鏈表的性質一致性: 每個節點有相同的數據結構,相同的數據大小,內存中占據相同的大小&…

win10 C盤超過50G?教你如何對C盤瘦身!

原文鏈接:http://blog.csdn.net/u012762305/article/details/53469446 點擊閱讀原文 ------------------------------------------- 本人C盤是128G SSD硬盤,Win10系統盤和一些常用的程序都裝在這個盤(特大程序除外),…

python的kite下載安裝及使用_Kite下載|Kite Python編程工具 V1.2020.1203.0 最新版下載 - 下載銀行...

Kite是一款專為Python打造的一款代碼補全軟件,如果你正在學習Python或是從事與Python相關的編程工作,那么這款軟件絕對是你的好幫手!其會智能判斷用戶想要輸入的每個代碼字段,并在所有庫中進行匹配相應的內容,如果看到…

layui前端時間戳轉化

https://blog.csdn.net/rightbeforethesix/article/details/80358890轉載于:https://www.cnblogs.com/newlangwen/p/9144204.html

單頁web應用是什么?它又會給傳統網站帶來哪些好處?

原文鏈接:http://blog.csdn.net/zuoninger/article/details/38842823 點擊閱讀原文 ---------------------------------------------------- 什么是單頁應用? 單頁應用是指在瀏覽器中運行的應用,它們在使用期間不會重新加載頁面。像所有的…

python圖像等比例壓縮_python使用pil進行圖像處理(等比例壓縮、裁剪)實例代碼

PIL中設計的幾個基本概念1.通道(bands):即使圖像的波段數,RGB圖像,灰度圖像以RGB圖像為例:>>>from PIL import Image>>>im Image.open(*.jpg) # 打開一張RGB圖像>>>im_bands im.getbands() # 獲取RG…

python的urllib四大模塊_Python常用的內建模塊4:urllib

urllib提供了一系列用于操作URL的功能Geturllib的request模塊可以非常方便的抓取URL的內容, 也就是發送一個GET請求到制定的頁面, 然后返回HTTP的響應:例如, 對豆瓣的一個URLhttps://api.douban.com/v2/book/2129650進行抓取, 并返回響應:from urllib import requestwith reque…