日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java 內存安全問題的注意事項

瀏覽:173日期:2022-08-11 09:45:54
目錄前言內存管理Java各版本內存管理改進內存溢出堆內存溢出棧溢出運行時常量池溢出方法區溢出元空間溢出本機直接內存溢出常見案例問題排查前言

Java在內存管理方面是要比C/C++更方便的,不需要為每一個對象編寫釋放內存的代碼,JVM虛擬機將為我們選擇合適的時間釋放內存空間,使得程序不容易出現內存泄漏和溢出的問題

不過,也正是因為Java把內存控制的權利交給了Java虛擬機,一旦出現內存泄漏和溢出方面的問題,如果不了解虛擬機是怎么使用內存的,那排查錯誤將會成為一項異常艱難的工作

下面先看看JVM如何管理內存的

內存管理

根據Java虛擬機規范(第3版) 的規定,Java虛擬機所管理的內存將會包括以下幾個運行內存數據區域:

線程隔離數據區: 程序計數器: 當前線程所執行字節碼的行號指示器虛擬機棧: 里面的元素叫棧幀,存儲局部變量表、操作棧、動態鏈接、方法出口等,方法被調用到執行完成的過程對應一個棧幀在虛擬機棧中入棧到出棧的過程。本地方法棧: 和虛擬機棧的區別在于虛擬機棧為虛擬機執行Java方法,本地方法棧為虛擬機使用到的本地Native方法服務。 線程共享數據區: 方法區: 可以描述為堆的一個邏輯部分,或者說使用永久代來實現方法區。存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。堆: 唯一目的就是存放對象的實例,是垃圾回收管理器的主要區域,分為Eden、From/To Survivor空間。

Java 內存安全問題的注意事項

Java各版本內存管理改進

下圖中永久代理解為堆的邏輯區域,移除永久代的工作從JDK7就已經開始了,部分永久代中的數據(常量池)在JDK7中就已經轉移到了堆中,JDK8中直接去除了永久代,方法區中的數據大部分被移到堆里面,還剩下一些元數據被保存在元空間里

Java 內存安全問題的注意事項

內存溢出 內存泄露Memory Leak: 申請的內存空間沒有及時釋放,導致后續程序里這塊內容永遠被占用。 內存溢出Out Of Memory: 要求的內存超過了系統所能提供的

運行時數據區域的常見異常

在JVM中,除了程序計數器外,虛擬機內存的其他幾個運行時數據區域都有發生OOM異常的可能。

堆內存溢出

不斷的創建對象,并且保證GC Roots到對象之間有可達路徑來避免垃圾回收機制清除這些對象。

public class HeapOOM { static class ObjectInHeap{ } public static void main(String[] args) {List<ObjectInHeap> list = new ArrayList();while (true) { list.add(new ObjectInHeap());} }}棧溢出

單個線程下不斷擴大棧的深度引起棧溢出。

public class StackSOF { private int stackLength = 1; public void stackLeak() {stackLength++;stackLeak(); } public static void main(String[] args) {StackSOF sof = new StackSOF();try { sof.stackLeak();} catch (Throwable e) { System.out.println('Stack Length: ' + sof.stackLength); throw e;} }}

循環的創建線程,達到最大棧容量。

public class StackOOM { private void dontStop() {while (true) {} } public void stackLeadByThread() {while (true) { Thread thread = new Thread(new Runnable() {@Overridepublic void run() { dontStop();} }); thread.start();} } public static void main(String[] args) {StackOOM stackOOM = new StackOOM();stackOOM.stackLeadByThread(); }}運行時常量池溢出

不斷的在常量池中新建String,并且保持引用不釋放。

public class RuntimeConstantPoolOOM { public static void main(String[] args) {// 使用List保持著常量池的引用,避免Full GC回收常量池List<String> list = new ArrayList<String>();int i = 0;while (true) { // intern()方法使String放入常量池 list.add(String.valueOf(i++).intern());} }}方法區溢出

借助CGLib直接操作字節碼運行時產生大量的動態類,最終撐爆內存導致方法區溢出。

public class MethodAreaOOM { static class ObjectInMethod { } public static void main(final String[] args) {// 借助CGLib實現while (true) { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(ObjectInMethod.class); enhancer.setUseCache(false); enhancer.setCallback(new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { return methodProxy.invokeSuper(o, objects);} }); enhancer.create();} }}元空間溢出

助CG Lib運行時產生大量動態類,唯一的區別在于運行環境修改為Java 1.8,設置-XX:MaxMetaspaceSize參數,便可以收獲java.lang.OutOfMemoryError: Metaspace這一報錯

本機直接內存溢出

直接申請分配內存(實際上并沒有真正向操作系統申請分配內存,而是通過計算得知內存無法分配,于是拋出異常)

public class DirectMemoryOOM { private static final int _1MB = 1024 * 1024; public static void main(String[] args) throws IllegalAccessException {Field unsafeField = Unsafe.class.getDeclaredFields()[0];unsafeField.setAccessible(true);Unsafe unsafe = (Unsafe) unsafeField.get(null);while (true) { unsafe.allocateMemory(_1MB);} }}常見案例

在工作中一般會遇到有以下幾種情況導致內存問題

傳輸數據量過大

因為傳輸數量過大、或一些極端情況導致代碼中間結果對象數據量過大,過大的數據量撐爆內存

查詢出大量對象

這個多為SQL語句設置問題,SQL未設置分頁,用戶一次查詢數據量過大、頻繁查詢SQL導致內存堆積、或是未作判空處理導致WHERE條件為空查詢出超大數據量等

接口性能問題導致

這類為外部接口性能較慢,占用內存較大,并且短時間內高QPS導致的,導致服務內存不足,線程堆積或掛起進而出現FullGC

元空間問題

使用了大量的反射代碼,Java字節碼存取器生成的類不斷生成

問題排查

使用jmap分析內存泄漏

1.生成dump文件

jmap -dump:format=b,file=/xx/xx/xx.hprof pid

2.dump文件下載到本地

3.dump文件分析

可以使用MAT,MAT可作為Eclipse插件或一個獨立軟件使用,MAT是一個高性能、具備豐富功能的Java堆內存分析工具,主要用來排查內存泄漏和內存浪費的問題。

使用MAT打開上一部后綴名.hprof的dump文件

Java 內存安全問題的注意事項

Histogram:直方圖,各個類的實例,包括個數和大小,可以查看類引用和被引用的路徑。 Dominator Tree:支配圖,列出所有線程和線程下面的那些對象占用的空間。 Top Consumers:通過圖形列出消耗內存多的實例。 Leak Suspects:MAT自動分析的內存泄漏報表

可以用這個工具分析出什么對象什么線程占用內存空間較大,對象是被什么引用的,線程內有哪些資源占用很高

以運行時常量池溢出為例

打開Histogram類實例表

Objects是類的對象的數量;Shallow是對象本身占用內存大小、不包含其他引用;

Retained是對象自己的Shallow加上直接或間接訪問到對象的Shallow之和,也可以說是GC之后可以回收的內存總和

從圖中可以看出運行時常量池溢出的情況,產生了大量的String和char[]實例

Java 內存安全問題的注意事項

在char[]上右鍵可以得到上圖所有char[]對象的被引用路徑,可以看出這些char數組都是以String的形式存在ArrayList中,并且是由main這個線程運行的

可以看出是main線程中新建了一個數組,其中存了32w+個長度為6的char數組組成的String造成的內存溢出

Java 內存安全問題的注意事項

關于MAT的詳細使用可以從MAT官方教程學習更多

以上就是Java 內存安全問題的注意事項的詳細內容,更多關于Java 內存安全問題的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
奇米亚洲欧美| 午夜电影亚洲| 麻豆精品网站| 国产成人精品亚洲线观看| 欧美精品国产| 国产精品主播| 国产欧美自拍一区| 久久国产亚洲| 亚洲免费精品| 欧美日韩亚洲一区在线观看| 久久av免费看| 日韩另类视频| 香蕉久久久久久| 国产精品网在线观看| 久久中文字幕一区二区三区| 天堂资源在线亚洲| 成人免费一区| 日本不卡视频在线| 亚洲国产成人精品女人| 日韩精品永久网址| 97久久亚洲| 欧美精品不卡| 99国产精品免费视频观看| 日韩不卡一区二区三区| 99亚洲视频| 国内亚洲精品| 午夜久久99| 日韩欧美四区| 久久不见久久见中文字幕免费 | 日本不卡免费高清视频在线| 精品一区欧美| 日韩精品专区| 欧美一区精品| 日韩专区欧美专区| 久久激情av| 日韩久久电影| 国产三级精品三级在线观看国产| 亚洲一级特黄| 婷婷综合成人| 免费成人av在线播放| 久久激情综合网| 欧美精品资源| 欧美久久亚洲| 久久国产中文字幕| 欧美一级网站| 136国产福利精品导航网址| 亚洲欧美在线专区| 中文字幕色婷婷在线视频| 日韩制服丝袜先锋影音| 国产精品国产三级在线观看| 成人亚洲一区| 水野朝阳av一区二区三区| 久久精品国产福利| 国产亚洲午夜| 成人亚洲精品| 日产欧产美韩系列久久99| 性感美女一区二区在线观看| 亚洲我射av| 精品久久亚洲| 一区二区亚洲视频| 亚洲欧美专区| 亚洲精品大片| 精品一区欧美| 日韩国产欧美一区二区三区| 亚洲高清激情| 日本不卡高清| 亚洲国产专区校园欧美| 国产精品成人一区二区网站软件| 久久精品免费一区二区三区| 97久久精品| 婷婷亚洲五月| 精品视频高潮| 香蕉久久一区| 亚洲麻豆一区| av亚洲一区二区三区| 亚洲欧美日韩在线观看a三区| 午夜欧美精品| 日本强好片久久久久久aaa| 麻豆精品国产91久久久久久| 香蕉人人精品| 亚洲一区av| 91av亚洲| 亚洲精品影院在线观看| 日韩成人午夜精品| 久久婷婷av| 国产精品www994| 天海翼亚洲一区二区三区| 一区在线免费观看| 中文一区在线| 免费视频一区二区三区在线观看| 国产黄大片在线观看| 国产欧美69| 中文一区一区三区免费在线观 | 久久99高清| 日韩综合在线| 日韩精品欧美| 日本成人手机在线| 国产综合精品| 日本在线一区二区三区| 99视频精品全部免费在线视频| 国产亚洲欧美日韩在线观看一区二区| 视频国产精品| 黄色亚洲精品| 91精品国产调教在线观看 | 精品1区2区3区4区| 久久精品国产亚洲夜色av网站| 成人日韩av| 久久精品国产网站| 欧美视频二区| 91成人在线网站| 日韩一区二区三区在线看| 国产综合精品| 天堂资源在线亚洲| 亚洲a一区二区三区| 天堂√中文最新版在线| 国产精品99一区二区三| 成人午夜亚洲| 国产成人精品一区二区三区免费| 久久成人av| 免费看一区二区三区| 国产伦精品一区二区三区千人斩 | 丁香婷婷久久| 嫩呦国产一区二区三区av| 国产免费av国片精品草莓男男| 日韩国产在线一| 日韩欧美中文字幕在线视频| 亚洲区第一页| 97久久超碰| 国产精品久久久亚洲一区| 国产精品黄网站| 麻豆91精品视频| 久久麻豆视频| 精品在线网站观看| 精品国产18久久久久久二百| 丰满少妇一区| 欧美国产美女| 黄色亚洲精品| 日韩天堂av| 日韩精品社区| 日本天堂一区| 久久青草久久| 免费国产亚洲视频| 91一区二区三区四区| 91成人精品| 国产日韩欧美高清免费| 日韩在线看片| 国产精品视频一区二区三区 | 欧美久久香蕉| 久久久9色精品国产一区二区三区| 国产精品丝袜在线播放| 乱人伦精品视频在线观看| 国产欧美久久一区二区三区| 麻豆视频在线看| 日韩欧美中文在线观看| 国产精品亲子伦av一区二区三区| 日韩制服丝袜先锋影音| 婷婷成人综合| 日本精品国产| 久久国产视频网| 久久精品一区| 国产在线|日韩| 国产精品毛片在线看| 日韩一二三区在线观看| 久久免费精品| 粉嫩av一区二区三区四区五区| 成人免费电影网址| 日韩视频二区| 99久精品视频在线观看视频| 亚洲一区二区三区高清不卡| 国产免费av一区二区三区| 亚洲三级国产| 91亚洲自偷观看高清| 久久免费精品| 欧美网站在线| 午夜久久免费观看| 视频一区视频二区中文| 91精品二区| 久久国产精品毛片| 国产精品22p| 不卡专区在线| 国产精品外国| 你懂的国产精品永久在线| 精品一区免费| 麻豆国产一区| 999在线观看精品免费不卡网站| 日本亚州欧洲精品不卡| 国内揄拍国内精品久久| 国产亚洲综合精品| 美女久久久精品| 香蕉久久久久久久av网站| 免费精品一区| 日韩制服丝袜av| 日韩黄色大片| 国产欧美午夜| 亚洲免费精品| 高清一区二区| 日韩精品三区四区| 极品日韩av| 精品不卡一区| 日本成人中文字幕|