日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结...

發布時間:2025/3/20 java 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

掃碼關注公眾號:Java 技術驛站

發送:vip

將鏈接復制到本瀏覽器,永久解鎖本站全部文章

【公眾號:Java 技術驛站】

【加作者微信交流技術,拉技術群】

# JVM內存劃分與內存溢出小結 #

1.將堆的最小值(初始值)-Xms參數與最大值-Xmx參數設置為一樣即可避免堆自動擴展,-Xmn參數設置堆中新生代容量大小,對應地,如果堆不可自動擴展情況下,老年代容量=(-Xms/-Xmx)-(-Xmn)

2.通過參數-XX:+HeapDumpOnOutOfMemoryError可以讓虛擬機在出現內存溢出異常時Dump出當前的內存堆轉儲快照以便事后分析,-XX:HeapDumpPath=d:/a.dump配置Dump出位置

3.對于HotSpot虛擬機來說,-Xoss參數(設置本地方法棧大小)雖然存在,但是實際無效,棧容量只由-Xss參數設定

> **而關于此,Java虛擬機規范描述了兩個異常:**

>

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

>

> b,如果虛擬機在擴展棧時無法申請到足夠的內存空間,則拋出OutOfMemoryError異常(堆溢出:堆溢出-OutOfMemoryError:java heap space,方法區溢出- OutOfMemoryError: PermGen space)。

>

> **測試:**

>

> a,定義大量的本地變量,增加此方法幀中本地變量表的長度(符合上面情況a),結果拋出StackOverflowError異常。

>

> b,使用-Xss參數減少棧內存容量(符合上面情況a),結果拋出StackOverflowError異常。

>

> **實驗表明:**

>

> 在單個線程下,無論是由于棧幀太大,還是虛擬機棧容量太小,當內存無法分配時,虛擬機都將拋出StackOverflowError異常(都一個原因:棧幀所需>虛擬機容量)。

>

> 多線程下,才會進行擴展棧操作,才可能產生內存溢出異常。

>

> **原因:**

>

> 操作系統給每個進程分配的內存有限制,如32位是2GB,那么虛擬機進程本身消耗內存不計算在內的情況下,虛擬機棧和本地方法棧得到的內存=2GB-Xmx(最大堆容量)-MaxPermSize(最大方法區容量) ,程序計數器消耗內存小,忽略不計。這是一個定值,那么如果每個線程分配到的棧容量越大,還可建立的線程就越少,線程越多擴展棧時就越容易產生內存溢出異常,而單線程不存在擴展棧操作,只會比較該線程請求的棧深度與虛擬機最大深度而是否拋出StackOverflowError異常。

>

> **總結:**

>

> 對于開發時,出現StackOverflowError異常時,有錯誤堆棧可以閱讀,比較容易找到問題所在,而且在虛擬機默認參數下,棧深度在大多情況下達到1000-2000沒問題,對于正常方法調用(包括遞歸),這個深度已經完全夠用了。

>

> 但是,如果是建立多線程導致內存溢出,要么減少線程數、要么更換64位虛擬機,否則,只能通過減少最大堆容量(為了加大棧空間)和減少棧容量(為了減少棧深度)來換取更多的線程。

>

> **備注:**

>

> A.棧幀:每個方法被執行時都會創建一個棧幀,用于存儲局部變量表(方法內變量)、操作棧、動態鏈接、方法出口等信息。每個方法被掉調用到完成就對于一個棧幀在虛擬機棧中從入棧到出棧的過程。

>

> B.運行時數據區包括:

>

> > 1.虛擬機棧,本地方法棧:虛擬機棧和本地方法棧類似,一個執行Java方法(字節碼),一個執行虛擬機的Native方法,也叫作本地方法(Java中聲明的可調用的,使用C/C++實現的方法-JNI,HotSpot虛擬機直接將兩者合并)。

>

> > 2.堆:堆存放對象(包含新生代和老年代,設置新生代大小-XX:NewSize=n)。

>

> > 3.程序計數器:記錄執行代碼行號。

>

> > 4.方法區:存放被虛擬機加載的類信息、常量、靜態變量等,包含運行時常量池。類信息除了版本、字段、方法、接口、常量池(存放字面量和符合引用),常量池在類加載時會放入運行時常量池。

4.通過-XX:PermSize和-XX:MaxPermSize限制方法區的大小

> **測試:**

>

> 通過上面jvm參數設置較小方法區大小(如10M),調用String.intern方法添加一個字符串到運行時常量池中,出現OutOfMemoryError: PermGen space異常。

>

> **實驗表明:**

>

> 運行時常量池屬于方法區。因為上面異常是方法區溢出。

>

> **備注:**

>

> String.intern(str)方法是一個native方法,作用是如果運行時常量池中包含一個等于str的字符串,就返回池中這個字符串的String對象,否則將str添加到池中并返回其引用。

5.類被GC回收的判定條件非常苛刻,所以,在經常動態產生大量class的應用中,應主要類的回收狀態,如使用了GClib字節碼增強的應用、大量jsp或動態產生jsp文件的應用、基于OSGi的應用

源自:《深入理解Java虛擬機:JVM高級特性與最佳實踐》

【公告】版權聲明

評論 搶沙發

有人回復時郵件通知我

提交評論

昵稱昵稱 (必填)

郵箱郵箱 (必填)

網址網址

總結

以上是生活随笔為你收集整理的java 内存溢出的分类_【深入理解Java虚拟机】读后感:JVM内存划分与内存溢出小结...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。