delphi 算術溢出解決方法_性能優化系列:JVM 內存劃分總結與內存溢出異常詳解分析...

前言

那些使用過 C 或者 C++ 的讀者一定會發現這兩門語言的內存管理機制與 Java 的不同。在使用 C 或者 C++ 編程時,程序員需要手動的去管理和維護內存,就是說需要手動的清除那些不需要的對象,否則就會出現內存泄漏與內存溢出的問題。

如果你使用 Java 語言去開發,你就會發現大多數情況下你不用去關心無用對象的回收與內存的管理,因為這一切 JVM 虛擬機已經幫我們做好了。了解 JVM 內存的各個區域將有助于我們深入了解它的管理機制,避免出現內存相關的問題和高效的解決問題。下面來講講面試中也是Java學習進階中必備的JVM知識,后續還會更新完JVM系列,觀看的朋友可以轉發關注下!

引出問題

在 Java 編程時我們會用到許多不同類型的數據,比如臨時變量、靜態變量、對象、方法、類等等。 那么他們的存儲方式有什么不同嗎?或者說他們存在哪?

211113e4120257295e585b2a250d2ee7.png

運行時數據區域

Java 虛擬機在執行 Java 程序過程中會把它所管理的內存分為若干個不同的數據區域,各自有各自的用途。

97c2ee7ffdd0a88b6341f5a7a69b1e75.png

1.程序計數器

線程私有的,可以看作是當前線程所執行字節碼的行號指示器。字節碼解釋器工作時就是通過改變這個計數器的值來選取下一條需要執行的字節碼指令。分支、循環、異常處理、線程恢復等基礎功能都需要依賴這個計數器來完成。

這時唯一一個沒有規定任何 OOM 異常的區域。

2.虛擬機棧

虛擬機棧也是線程私有的,生命周期與線程相同。棧里面存儲的是方法的局部變量、對象的引用等等。

在這片區域中,規定了兩種異常情況,當線程請求的棧深度大于虛擬機所允許的深度,將拋出 StackOverflowError 異常。當虛擬機棧動態擴展無法申請到足夠的內存時會拋出 OOM 異常。

3.本地方法棧

和虛擬機棧的作用相同,只不過它是為 Native 方法服務。HotSpot 虛擬機直接將虛擬機棧和本地方法棧合二為一了。

4.堆

堆是 Java 虛擬機所管理內存中最大的一塊。是所有線程共享的一塊內存區域,在虛擬機啟動時創建。這個區域唯一的作用就是存放對象實例,也就是 NEW 出來的對象。這個區域也是 Java 垃圾收集器的主要作用區域。

當堆的大小再也無法擴展時,將會拋出 OOM 異常。

5.方法區

方法區也是線程共享的內存區域,用于存儲已經被虛擬機加載的類信息、常量、靜態變量等等。當方法區無法滿足內存分配需求時,會拋出 OOM 異常。這個區域也被稱為永久代。

補充

雖然上面的圖里沒有運行時常量池和直接內存,但是這兩部分也是我們開發時經常接觸的。所以給大家補充出來。

運行時常量池

運行時常量池是方法區的一部分,Class 文件中除了有類的版本、字段、方法、接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后存放到方法區的運行時常量池中。也會拋出 OOM 異常。

直接內存

直接內存并不是虛擬機運行時數據區的一部分,也不是 Java 虛擬機規范中定義的內存區域,但是卻是NIO 操作時會直接使用的一塊內存,雖然不受虛擬機參數限制,但是還是會受到本機總內存的限制,會拋出 OOM 異常。

JAVA8 的改變

對于方法區,它是線程共享的,主要用于存儲類的信息,常量池,方法數據,方法代碼等。我們稱這個區域為永久代。

大部分程序員應該都見過 java.lang.OutOfMemoryError:PermGen space 異常,這里的 PermGen space 其實指的就是方法區。由于方法區主要存儲類的相關信息,所以對于動態生成類的情況比較容易出現永久代的內存溢出,典型的場景是在 JSP 頁面比較多的情況,容易出現永久代內存溢出。

在JDK 1.8中,HotSpot 虛擬機已經沒有 PermGen space 這個區域了,取而代之的是一個叫做Metaspace (元空間)的東西。

5cc19115e1560ff3dd904ce245696a04.png

變化就是移除了方法區,增加了元空間,與方法區最大的區別是:元空間不再虛擬機中,而是使用本地內存。默認情況下,元空間的大小僅受本地內存限制。

這樣更改的好處:

  • 字符串常量存在方法區中,容易出現性能問題和內存溢出。
  • 類和方法的信息等比較難確定大小,因此對于方法區大小的指定比較困難,太小容易出現方法區溢出,太大容易導致堆的空間不足。
  • 方法區的垃圾回收會帶來不必要的復雜度,并且回收效率偏低(垃圾回收會在下一章給大家介紹)。

內存溢出

雖然有 JVM 幫我們管理內存,但是在實際開發過程中一定還會遇到內存溢出的問題。堆,棧,方法區都有可能出現內存溢出問題。下面我們就結合幾個實際的小例子來給大家展示一下,方便大家以后根據不同的情況對內存溢出問題進行快速準確的定位。

java.lang.OutOfMemoryError: Java heap space ———>java 堆內存溢出,此種情況最常見,一般由于內存泄露或者堆的大小設置不當引起。對于內存泄露,需要通過內存監控軟件查找程序中的泄露代碼,而堆大小可以通過虛擬機參數 -Xms、 -Xmx 等修改。

例子:在集合中無限加入對象,效果受到機器配置影響,可以主動更改堆大小方便演示。

e4b582ffe441e0f706ddb30fdf05541e.png

java.lang.OutOfMemoryError: PermGen space ------>java永久代溢出,即方法區溢出了,一般出現于大量Class 或者 JSP 頁面,或者采用 CGLIB 等反射機制的情況,因為上述情況會產生大量的 Class 信息存儲于方法區。此種情況可以通過更改方法區的大小來解決,使用類似 -XX:PermSize=64m -XX:MaxPermSize=256m 的形式修改。另外,過多的常量尤其是字符串也會導致方法區溢出,因為常量池也是方法區的一部分。

例子:無限加載 Class,需要在 JDK 1.8 之前的版本運行,因為1.8將方法區改成了元空間,利用了機器的內存,最好手動設置 -XX:MaxPermSize,將值調小一點。

77a6bd7430cd4722051e82033b1d281f.png

java.lang.StackOverflowError ------> 不會拋 OOM error,但也是比較常見的 Java 內存溢出。Java 虛擬機棧溢出,一般是由于程序中存在死循環或者深度遞歸調用造成的,棧大小設置太小就會出現此種溢出。可以通過虛擬機參數 -Xss 來設置棧的大小。

例子:無法快速收斂的遞歸。

4ed359179972888b47e52082949d4adc.png

總結

JVM內存區域劃分,便于它能夠更加高效的管理自身的內存。當程序中出現這種由于JVM造成的內存溢出的情況的時候,需要根據不同的情況做不同的分析與處理。

最后

讀到這的朋友可以轉發關注下,后續還會更新JVM及性能調優系列的精選文章,謝謝您的支持!

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

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

相關文章

微信小程序如何發送 http 請求

2019獨角獸企業重金招聘Python工程師標準>>> 為什么要使用云函數發送 http 請求小程序云函數5 個可信域名不受限制需要備案無需備案在一些特殊情境, 比如域名沒有備案或域名 5 個以上就需要使用云函數發送 HTTP 請求了. 如何使用云函數發送 HTTP 請求? 在云函數中能…

H5 頁面列表緩存方案

大家好,我是若川(點這里加我微信 ruochuan12,長期交流學習)。今天給大家介紹一下關于h5頁面的列表緩存方案。感謝屏幕前的你一直關注著我。點擊下方卡片關注我、加個星標,或者查看源碼等系列文章。學習源碼整體架構系列…

SQL未能排它地鎖定數據庫以執行該操作解決

SQL未能排它地鎖定數據庫以執行該操作解決: --原因其他用戶或進程在用著數據庫 /* 關閉用戶打開的進程處理 */ use master if exists (select * from dbo.sysobjects where id object_id(N[dbo].[p_killspid]) and OBJECTPROPERTY…

不只是coding_不只是外表

不只是coding“We just need it to look more professional…”“我們只需要看起來更專業...” “We don’t have the graphic expertise you do…”“我們沒有您所需要的圖形專業知識……” “I just don’t know how to make it look good…”“我只是不知道如何使它看起來…

讀取 wps_軟件前世今生篇之WPS(求伯君1988年先于OFFICE研發出WPS)

軟件前世今生篇之WPS今天給大家普及一下WPS這款辦公軟件,相信你會問wps有什么可普及的?我們都知道啊,不就是一款辦公軟件,而且還是抄襲office的,安裝還挺簡單的,而且還有一大堆廣告,不過使用免費…

吳恩達機器學習筆記11-梯度下降法實踐2-學習率

梯度下降算法收斂所需要的迭代次數根據模型的不同而不同,我們不能提前預知,我們可以繪制迭代次數和代價函數的圖表來觀測算法在何時趨于收斂。 也有一些自動測試是否收斂的方法,例如將代價函數的變化值與某個閥值(例如0.001&#…

制作五彩紙屑轉場動效_何時以及如何將五彩紙屑添加到產品UI

制作五彩紙屑轉場動效As I am sure all designers have picked up on, confetti has become a popular method of (positive) feedback inside mobile and desktop apps. I will discuss the viable scenarios where you can implement confetti and will even provide some co…

【無套路送書】架構師是怎樣煉成的?

大家好,我是若川。不知道這是今年第幾次送書了,前三次分別是:第一次,第二次,第三次。本次《架構師的自我修煉》,非常珍貴,我爭取到了2本送給大家,送書規則見文末。可以參與下&#x…

WinForm中使用Excel控件

最近項目中要在WinForm中使用Excel控件,經過幾天的研究,現在總結一下成果。 在WinForm中使用Excel控件主要有三種方法:WebBrowser、DSOFramer、OWC。下面分別描述一下如何使用。 一、WebBrowser /// -1、如何使用 WebBrowser 控件…

python腳本自動化盲注_三、基于報錯型注入和sql盲注的自動化實現

通過前面payload的構造,不難發現,對于報錯型注入和布爾注入(sql盲注)純手工注入的效率是非常慢的。這些payload語句雖然復雜,但大部分內容都是相同的,因此,一言不合就寫了個腳本自動化注入,坐等信息爆出的感…

NASA公布“門戶計劃”,在月球軌道建立空間站進一步探索月球

門戶是NASA研發一種小型的宇宙飛船的名字,該宇宙飛船將圍繞月球軌道運行 成為宇航員臨時住所和辦公室。 日前,美國宇航局(以下簡稱“NASA”)公布了“門戶計劃”,該計劃具體是指在月球軌道上建立空間站,以幫…

淺析Page.LoadTemplate(模板)方法動態獲取綁定模板后,通過FindControl獲取服務端控件的方法。...

平常使用DataList數據控件綁定數據時&#xff0c;都是在ItemTemplate項里面放入 <asp:DataList ID"list2"runat"server"><ItemTemplate><asp:HyperLink ID"hl"runat"server"></asp:HyperLink></ItemTempl…

蘋果5s變磚_蘋果磚的故事以及可以改進的地方

蘋果5s變磚Even since I can remember I’ve always been curious about trying out all kinds of software, checking out different operating systems, and improving my own user experience through customizing them. Over the years I’ve had the opportunity to test …

學習 launch-editor 源碼整體架構,探究 vue-devtools「在編輯器中打開組件」功能實現原理...

1. 前言你好&#xff0c;我是若川[1]&#xff0c;微信搜索「若川視野」關注我&#xff0c;專注前端技術分享&#xff0c;一個愿景是幫助5年內前端開闊視野走向前列的公眾號。歡迎加我微信ruochuan12&#xff0c;長期交流學習。這是學習源碼整體架構系列 之 launch-editor 源碼&…

:傳遞給 left 或 substring 函數的長度參數無效。_Java函數式編碼結構-好程序員

好程序員Java培訓分享Java函數式編碼結構&#xff0c;本文將探討三種下一代JVM語言&#xff1a;Groovy、Scala和Clojure&#xff0c;比較并對比新的功能和范例&#xff0c;讓Java開發人員對自己近期的未來發展有大體的認識&#xff0c;下面我們一起來看一下吧。當垃圾回收成為主…

系統架構師學習筆記_第十一章(上)_連載

第十一章 信息安全技術 11.1 信息安全關鍵技術 11.1.1 加密和解密 有意的計算機犯罪 和 無意的數據破壞 被動攻擊&#xff1a;非法地從傳輸信道上截取信息&#xff0c;或從存儲載體上 偷竊、復制 信息。 主動攻擊&#xff1a;對傳輸或存儲的數據進行 惡意的刪除、篡改 等。 …

跨庫一致性_設計跨平臺的一致性

跨庫一致性I offended an Apple employee the other day when I was checking out the new iPad Pro and I told him that I was an Android phone user. Eyes rolled, jokes were made, and we agreed to disagree.前幾天&#xff0c;我在檢閱新iPad Pro時冒犯了一名蘋果員工&…

React-生命周期雜記

前言 自從React發布Fiber之后&#xff0c;更新速度日新月異&#xff0c;而生命周期也隨之改變&#xff0c;雖然原有的一些生命周期函數面臨廢棄&#xff0c;但理解其背后更新的機制也是一種學習 在這里根據官方文檔以及社區上其他優秀的文章進行一個對于生命周期的總結&#xf…

漫畫 | 一個NB互聯網項目的上線過程…

大家好&#xff0c;我是若川&#xff08;點這里加我微信 ruochuan12&#xff0c;長期交流學習&#xff09;。今天雖然是周六&#xff0c;但還是要上班&#xff0c;所以就推薦一篇比較輕松的漫畫。點擊下方卡片關注我、加個星標&#xff0c;或者查看源碼等系列文章。學習源碼整體…

stm32 中斷處理級別_STM32中斷優先級徹底講解

文章來源&#xff1a;http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html一&#xff1a;綜述STM32 目前支持的中斷共為 84 個(16 個內核68 個外部)&#xff0c; 16 級可編程中斷優先級的設置(僅使用中斷優先級設置 8bit 中的高 4 位)和16個搶占優先級(因為搶占優先級最多可…