亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java的內存區(qū)域與內存溢出異常你了解嗎

 更新時間:2022年03月15日 14:44:20   作者:CodePanda@GPF  
這篇文章主要為大家詳細介紹了Java的內存區(qū)域與內存溢出異常,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

1. 運行時數據區(qū)域

在這里插入圖片描述

1. 程序計數器(線程私有)

當前線程所執(zhí)行的字節(jié)碼的行號指示器,分支、循環(huán)、跳轉、異常處理、線程恢復等基礎功能都要考程序計數器。(記住程序當前走到的位置,下次還回來)。線程私有。

2. Java虛擬機棧(線程私有)

和方法相關聯,每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀用于存儲局部變量表、操作數棧、動態(tài)鏈接、方法出口等信息。每一個方法從調用直至執(zhí)行完成的過程,就對應著一個棧幀在虛擬機棧中入棧到出棧的過程

線程請求的棧深度大于虛擬機所允許的深度,將拋出StackOverflowError異常(常見的遞歸層數過多導致”爆棧“)

3. 本地方法棧(線程私有)

類似于Java虛擬機棧。區(qū)別在于:

虛擬機棧為虛擬機執(zhí)行Java方法本地方法棧則為虛擬機使用到的Native方法服務

Java開頭通過Java Native Interface來調用本地方法(一般用C語言編寫)

4. Java堆(線程共享)

Java虛擬機所管理的內存中最大的一塊new出來的對象就存在于堆上垃圾收集器管理的主要區(qū)域

5. 方法區(qū)(線程共享)

存儲已被虛擬機加載的類信息、常量、靜態(tài)變量

6. 運行時常量池

方法區(qū)的一部分用于存放編譯期生成的各種字面量和符號引用

2. 對象是如何創(chuàng)建的?

Object obj=new Object(): 分析這行代碼的執(zhí)行過程

使用了new關鍵字,檢查這個指令的參數是否能在常量池中定位到一個類的符號引用,并且檢查這個符號引用代表的類是否已被加載、解析和初始化過。沒有的話先加載類類加載檢查通過后,虛擬機將為新生對象分配內存內存分配完成后,虛擬機需要將分配到的內存空間都初始化為零值虛擬機要對對象進行必要的設置,例如將對象的哈希碼、元數據、GC分代年齡、是否使用偏向鎖等數據存放在對象頭中執(zhí)行init方法,把對象按照程序員的意愿進行初始化(給成員變量賦的值)

3. 對象的內存布局

在這里插入圖片描述

在這里插入圖片描述

4. 對象的訪問定位

1. 句柄訪問

Java堆中將會劃分出一塊內存來作為句柄池,reference中存儲的就是對象的句柄地址,而句柄中包含了對象實例數據與類型數據各自的具體地址信息

在這里插入圖片描述

2. 直接指針訪問

Java堆對象的布局中就必須考慮如何放置訪問類型數據的相關信息,而reference中存儲的直接就是對象地址

在這里插入圖片描述

二者比較:

使用句柄來訪問的最大好處就是reference中存儲的是穩(wěn)定的句柄地址,即使對象被移動(GC過程),只需要改變句柄中的示例指針,無需變動refrence直接指針訪問方式的最大好處就是速度更快, refrence直接指向實例數據,減少了一次指針訪問

HotSpot虛擬機使用直接指針方式進行對象訪問的

5. OutOfMemoryError異常代碼演示

1. Java堆溢出

package jvm;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryErrorDemo {
	static class MyObject{
	}
	public static void main(String[] args) {
		List<MyObject> list=new ArrayList<>();
		int i=0;
		while(true)
		{
			System.out.println(i++);
			list.add(new MyObject());
		}
	}
}

在這里插入圖片描述

在這里插入圖片描述

限制Java堆的大小為20MB,不可擴展(將堆的最小值-Xms參數與最大值-Xmx參數設置為一樣即可避免堆自動擴展),通過參數-XX:+HeapDumpOnOutOfMemoryError可以讓虛擬機在出現內存溢出異常時Dump出當前的內存堆轉儲快照以便事后進行分析

2. 虛擬機棧溢出

如果線程請求的棧深度大于虛擬機所允許的最大深度,將拋出StackOverflowError異常

package jvm;
import java.util.ArrayList;
import java.util.List;
public class OutOfMemoryErrorDemo {
	static int i=0;
	public static void main(String[] args) {
		f();
	}
	public static void f() {
		System.out.println(i++);
		f();
	}
}

在這里插入圖片描述

在這里插入圖片描述

相同的Xss(線程的堆棧大?。┫拢绻麠V械谋镜財祿^多,那么相應的可以遞歸的次數就越少

還有1種棧溢出會報OutOfMemoryError異常,如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常,比如將上面的遞歸改成多線程版就會出現這種問題

總結

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注腳本之家的更多內容!  

相關文章

  • Java?Stream?流中?Collectors.toMap?的用法詳解

    Java?Stream?流中?Collectors.toMap?的用法詳解

    這篇文章主要介紹了Stream?流中?Collectors.toMap?的用法,Collectors.toMap()方法是把List轉Map的操作,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • Java防止短信盜刷和轟炸的解決方案

    Java防止短信盜刷和轟炸的解決方案

    短信盜刷和短信轟炸是項目開發(fā)中必須要解決的問題之一,它的優(yōu)先級不亞于 SQL 注入的問題,今天我們就來看下,如何防止這個問題,需要的朋友可以參考下
    2024-02-02
  • 在springboot項目中同時接收文件和多個參數的方法總結

    在springboot項目中同時接收文件和多個參數的方法總結

    在開發(fā)接口中,遇到了需要同時接收文件和多個參數的情況,可以有多種方式實現文件和參數的同時接收,文中給大家介紹了兩種實現方法,感興趣的同學跟著小編一起來看看吧
    2023-08-08
  • Java幾個實例帶你進階升華下篇

    Java幾個實例帶你進階升華下篇

    與其明天開始,不如現在行動,本文為你帶來幾個Java書寫的實際案例,對鞏固編程的基礎能力很有幫助,快來一起往下看看吧
    2022-03-03
  • MyBatis-Plus自定義SQL的詳細過程記錄

    MyBatis-Plus自定義SQL的詳細過程記錄

    Java開發(fā)使用mybatis-plus來執(zhí)行sql操作,往往比mybatis能夠省時省力,下面這篇文章主要給大家介紹了關于MyBatis-Plus自定義SQL的相關資料,需要的朋友可以參考下
    2022-02-02
  • Springboot中的自定義攔截器及原理詳解

    Springboot中的自定義攔截器及原理詳解

    這篇文章主要介紹了Springboot中的自定義攔截器及原理詳解,攔截器主要是用于在用戶請求控制中,對于請求識別,鑒權,以及區(qū)分資源是否可以被目標方法調用的安全機制,需要的朋友可以參考下
    2023-12-12
  • 深入淺析TomCat Session管理分析

    深入淺析TomCat Session管理分析

    這篇文章主要介紹了深入淺析TomCat Session管理分析,需要的朋友可以參考下
    2015-11-11
  • 新手初學Java集合框架

    新手初學Java集合框架

    這篇文章主要介紹了JAVA集合框架的相關知識,文中講解非常細致,幫助大家更好的理解學習JAVA框架,感興趣的朋友快來了解下,希望能給你帶來幫助
    2021-07-07
  • java如何用反射將一個對象復制給另一個對象

    java如何用反射將一個對象復制給另一個對象

    這篇文章主要介紹了java如何用反射將一個對象復制給另一個對象問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java容器類的深入理解

    Java容器類的深入理解

    本篇文章是對Java容器類進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06

最新評論