jvm02

java虛擬機內存管理

每個線程就是一個順序的執行單元,線程共享區即多個線程共享同一塊區域,線程獨占區即每個線程都有自己的虛擬機棧,本地方法棧,程序計數器。

程序計數器是一個比較小的內存空間,可以看作是當前線程所執行的字節碼的行號指示器,位于線程獨占區,如果線程執行的是java方法,這個計數器記錄的是正在執行的虛擬機字節碼指令的地址,如果執行的是native方法,計數器的值為underfined

Java虛擬機棧

虛擬機描述的是java方法執行的動態內存模型

棧幀

每個方法執行,都會創建一個棧幀,伴隨著方法從創建到執行完成,用于存儲變量表,操作數棧,動態鏈接,方法出口等。

局部變量表

存儲編譯期可知的各種基本數據類型,引用類型,returnAddress類型,

局部變量表的內存空間在編譯期完成分配,當進入一個方法,這方法需要在幀分配多少內存是固定的,在方法運行期是不會改變局部變量表的大小(存儲的只是對象的引用)

 1 public class Demo {
 2     
 3     public void tes() {
 4         System.out.println("方法執行....");
 5         tes();
 6     }
 7     
 8     public static void main(String[] args) {
 9         new Demo().tes();
10         
11     }
12 
13 }

方法執行....
方法執行....

........

Exception in thread "main" java.lang.StackOverflowError

若不限定棧的內存,將超過虛擬機的內存,或物理內存,將拋出 OutofMemory

本地方法棧

虛擬機棧為虛擬機執行java方法服務,本地方法棧為虛擬機執行native方法服務

?

java堆

存儲對象實例

垃圾收集器管理的主要區域

新生代,老年代

?

方法區

存儲虛擬機加載的類信息(類的版本,字段,方法,接口),常量,靜態變量,即使編譯器編譯后的代碼等數據。

方法區和永久代

垃圾回收在方法區的行為(針對常量池的回收以及對象類型的卸載等)

異常的定義

OurOfMemoryError

?

運行時常量池,屬于方法區的

 1 public class Test {
 2     
 3     public static void main(String[] args) {
 4         String s1 = "abc";//字節碼常量
 5         String s2 = "abc";//字節碼常量  
 6         System.out.println(s1 == s2);
 7         
 8         String s3 = new String("abc");
 9         
10         System.out.println(s1 == s3);
11         
12         System.out.println(s1 == s3.intern());//運行時常量  
13         
14     }
15     
16     /**
17      *  true
18         false
19         true
20      */
21 }

?

任何字符串的創建都會放在常量池中,常量池在方法區中,運行時常量池維護了StringTable字符串表,數據類型可以是HashSet ,存放所實例的字符串對象,由于hashSet的無序和不可重復, abc 只創建了一個實例,即 s1 == s2

如果用new 創建一個對象一定是在堆內存開辟空間,不再考慮常量池的問題

intern()作用在jdk1.7之后是查看常量池中是否存在和調用方法的字符串內容一樣的字符串,如果有的話,就返回該常量池中的字符串,若沒有的話,就在常量池中寫入一個堆中該字符串對象的一個引用,指向堆中的該對象,并返回該引用。即是調用這個方法之后把字符串對象加入常量池中。

直接內存

能夠分配堆外內存,不受到java虛擬機內存的制約,會受到當前操作系統物理內存的制約

?

對象的結構:

Header 對象頭

  自身運行時數據(Mark Word)

    哈希值 GC分代年齡 鎖狀態標志 線程持有的索 偏向線程ID 偏向時間戳?

  類型指針

    對象指向它類的元數據的指針

InstanceData(相同的字段分配在一起)

  Long dobles? ? shorts/chars??

Padding,對齊填充不是必須的,占位符,對象的大小必須是8個字節的整數倍。

?

?

對象的訪問定位

  使用句柄:指向堆中的句柄池,保存了實例對象的地址,引用地址不需要修改。

  直接指針,從引用類型直接指向真正的內存區域,速度快,性能高

兩者都要保存? 到對象實例數據的指針和到對象類型數據的指針

?

?

?

  

?

轉載于:https://www.cnblogs.com/quyangyang/p/10997167.html

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

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

相關文章

搭建svn管理平臺

安裝svn服務器:yum -y install subversion創建svn的目錄:mkdir -p /data/svn初始化svn目錄:svnadmin create /data/svnconf下的三個目錄介紹:authz:控制權限,創建用戶。密碼在passwd創建 passwd:密碼文件&…

Oracle dataguard 正常切換和應急切換

Oracle dataguard 正常切換和應急切換oracle dataguard提供異地容災方案,能有效的防止單點故障和提供高可用技術,這里介紹dataguard正常主備切換和應急切換(應急切換模擬主庫出現問題無法還原,備庫脫離dataguard接管主庫對外提供服務)1)Oracl…

好程序員web前端分享JS引擎的執行機制

好程序員web前端分享JS引擎的執行機制,請先著重牢記兩點!JS是單線程語言。JS的EventLoop是JS的執行機制。深入了解JS的執行,就等于深入了解JS里的eventloop。1、靈魂三問:JS為什么是單線程的?為什么需要異步?單線程又是如何實現…

shutil模塊、json和pickle模塊

shutil模塊: 高級的文件、文件夾、壓縮包處理模塊 json和pickle模塊 之前學過eval內置方法可以將一個字符串轉化成Python對象,但eval方法是有局限性的,對于普通的數據類型,json.loads、eval都可以使用,但遇到特殊類型的…

每日一問:LayoutParams 你知道多少?

前面的文章中著重講解了 View 的測量流程。其中我提到了一句非常重要的話:**View 的測量匡高是由父控件的 MeasureSpec 和 View 自身的 LayoutParams 共同決定的。**我們在前面的 每日一問:談談對 MeasureSpec 的理解 把 MeasureSpec 的重點進行了講解&a…

kuangbin專題十六 KMP擴展KMP HDU2594 Simpsons’ Hidden Talents

Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marge: Yeah, what is it? Homer: Take me for example. I want to find out if I have a talent in politics, OK? Marge: OK. Homer: So I take some politician’s na…

SNI: 實現多域名虛擬主機的SSL/TLS認證

為什么80%的碼農都做不了架構師?>>> 一. 介紹 早期的SSLv2根據經典的公鑰基礎設施PKI(Public Key Infrastructure)設計,它默認認為:一臺服務器(或者說一個IP)只會提供一個服務,所以在SSL握手時…

echo(),print(),print_r(),var_dump()的區別

echo可以一次輸出多個值,多個值之間用逗號分隔。echo是語言結構(language construct),而并不是真正的函數,因此不能作為表達式的一部分使用。echo是php的內部指令,不是函數,無返回值。 print():函數print()…

我心目中的牛程序員、我們可以對比看看(人家還是看多年朋友面子上才肯幫忙1周,至少需支付1萬元辛苦費)...

為什么80%的碼農都做不了架構師?>>> 最近碰到客戶整個網站改版的需要,非常短的時間里只有1周時間里,需要把整個B2C網站徹底的進行版面,我自己估算了一下,就是往死里干一天工作48個小時,1周也干…

c#做端口轉發程序支持正向連接和反向鏈接

3389的時候 例子1:連接a機器的3389端口連不上,因為對方防火墻或者網關做了限制,只能訪問a機器的個別端口比如80。 例子2:連接a機器的幾乎所有端口都連不上(對方乃內網或者防火墻網關做了限制)&#xff0c…

Spring Boot(十四):spring boot整合shiro-登錄認證和權限管理

Spring Boot(十四):spring boot整合shiro-登錄認證和權限管理 使用Spring Boot集成Apache Shiro。安全應該是互聯網公司的一道生命線,幾乎任何的公司都會涉及到這方面的需求。在Java領域一般有Spring Security、Apache Shiro等安全框架,但是由…

通用權限管理系統組件 (GPM - General Permissions Manager) 不改數據庫、甚至不寫代碼就集成銅墻鐵壁權限管理組件...

為什么80%的碼農都做不了架構師?>>> 越成熟的東西,越牛X的東西,越簡單才對,簡單才是硬道理,蘋果的手機只有少數幾個按鍵,蘋果Ipad也很少的按鈕,甚至連蘋果的筆記本鍵盤都少一排&…

數學符號及讀法大全

數學符號及讀法大全 常用數學輸入符號: ≈ ≡ ≠ = ≤≥ < > ≮ ≯ ∷ + - / ∫ ∮ ∝ ∞ ∧ ∨ ∑ ∏ ∪ ∩ ∈ ∵ ∴ ⊥ ‖ ∠ ⌒ ≌ ∽ √ () 【】&#xff5b…

在使用win 7 無線承載網絡時,啟動該服務時,有時會提示:組或資源的狀態不是執行請求操作的正確狀態。 網上有文章指出,解決這個問題的方法是在設備管理器中啟動“Microsoft托管網絡虛擬適配

在使用win 7 無線承載網絡時,啟動該服務時,有時會提示:組或資源的狀態不是執行請求操作的正確狀態。 網上有文章指出,解決這個問題的方法是在設備管理器中啟動“Microsoft托管網絡虛擬適配器”,見 http://jingyan.baid…

阿里一年,聊聊我成長了什么,入職阿里的職業生涯感悟

2018.5.31~2019.5.31,一段精彩的旅程,渡過了在阿里一年的時光,這段時光有快樂、有焦慮、有迷茫、更有思考,思考的是自己過去的種種不足、思考的是一些現在看來之前錯誤的想法、思考的是如何成為一個更好的技術人,將這一…

偏差-方差分解(轉)

1、定義 這里所說的偏差-方差分解就是一種解釋模型泛化性能的一種工具。它是對模型的期望泛化錯誤率進行拆解。 樣本可能出現噪聲,使得收集到的數據樣本中的有的類別與實際真實類別不相符。對測試樣本 x,另 yd 為 x 在數據集中的標記,y 為真實…

用過C#的朋友可能認為它是一種十分安全的語言,其實C#也可以做到經典的緩沖區溢出。 本文章將用一個實例來描述C#究竟是如何發生緩沖區溢出的! 首先建立一個C# Console工程,并開啟工程的“允許

用過C#的朋友可能認為它是一種十分安全的語言,其實C#也可以做到經典的緩沖區溢出。 本文章將用一個實例來描述C#究竟是如何發生緩沖區溢出的! 首先建立一個C# Console工程,并開啟工程的“允許不安全代碼”選項 鍵入代碼: [csharp]…

COOKIE偽造登錄網站后臺

1.關于XSS(跨站腳本攻擊)和CSRF(跨站請求偽造)的知識,xss表示Cross Site Scripting(跨站腳本攻擊),它與SQL注入攻擊類似,SQL注入攻擊中以SQL語句作為用戶輸入,從而達到查詢/修改/刪除…

Spring Cloud 學習 (五) Zuul

Zuul 作為路由網關組件,在微服務架構中有著非常重要的作用,主要體現在以下 6 個方面: Zuul, Ribbon 以及 Eureka 相結合,可以實現智能路由和負載均衡的功能,Zuul 能夠將請求流量按某種策略分發到集群狀態的多個服務實例…

如何利用445端口進行入侵滲透 445端口入侵原因詳細解析。大家在進行入侵滲透個人電腦的時候,經常會碰到各種各樣的端口,比如135,1433,445,3306等端口,現在小編就給大家講解下445端口如

如何利用445端口進行入侵滲透 445端口入侵原因詳細解析。大家在進行入侵滲透個人電腦的時候,經常會碰到各種各樣的端口,比如135,1433,445,3306等端口,現在小編就給大家講解下445端口如何入侵。 445端口入侵…