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

您的位置:首頁技術(shù)文章
文章詳情頁

Java 內(nèi)存安全問題的注意事項

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

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

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

下面先看看JVM如何管理內(nèi)存的

內(nèi)存管理

根據(jù)Java虛擬機規(guī)范(第3版) 的規(guī)定,Java虛擬機所管理的內(nèi)存將會包括以下幾個運行內(nèi)存數(shù)據(jù)區(qū)域:

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

Java 內(nèi)存安全問題的注意事項

Java各版本內(nèi)存管理改進

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

Java 內(nèi)存安全問題的注意事項

內(nèi)存溢出 內(nèi)存泄露Memory Leak: 申請的內(nèi)存空間沒有及時釋放,導(dǎo)致后續(xù)程序里這塊內(nèi)容永遠被占用。 內(nèi)存溢出Out Of Memory: 要求的內(nèi)存超過了系統(tǒng)所能提供的

運行時數(shù)據(jù)區(qū)域的常見異常

在JVM中,除了程序計數(shù)器外,虛擬機內(nèi)存的其他幾個運行時數(shù)據(jù)區(qū)域都有發(fā)生OOM異常的可能。

堆內(nèi)存溢出

不斷的創(chuàng)建對象,并且保證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;} }}

循環(huán)的創(chuàng)建線程,達到最大棧容量。

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());} }}方法區(qū)溢出

借助CGLib直接操作字節(jié)碼運行時產(chǎn)生大量的動態(tài)類,最終撐爆內(nèi)存導(dǎo)致方法區(qū)溢出。

public class MethodAreaOOM { static class ObjectInMethod { } public static void main(final String[] args) {// 借助CGLib實現(xiàn)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運行時產(chǎn)生大量動態(tài)類,唯一的區(qū)別在于運行環(huán)境修改為Java 1.8,設(shè)置-XX:MaxMetaspaceSize參數(shù),便可以收獲java.lang.OutOfMemoryError: Metaspace這一報錯

本機直接內(nèi)存溢出

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

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);} }}常見案例

在工作中一般會遇到有以下幾種情況導(dǎo)致內(nèi)存問題

傳輸數(shù)據(jù)量過大

因為傳輸數(shù)量過大、或一些極端情況導(dǎo)致代碼中間結(jié)果對象數(shù)據(jù)量過大,過大的數(shù)據(jù)量撐爆內(nèi)存

查詢出大量對象

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

接口性能問題導(dǎo)致

這類為外部接口性能較慢,占用內(nèi)存較大,并且短時間內(nèi)高QPS導(dǎo)致的,導(dǎo)致服務(wù)內(nèi)存不足,線程堆積或掛起進而出現(xiàn)FullGC

元空間問題

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

問題排查

使用jmap分析內(nèi)存泄漏

1.生成dump文件

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

2.dump文件下載到本地

3.dump文件分析

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

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

Java 內(nèi)存安全問題的注意事項

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

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

以運行時常量池溢出為例

打開Histogram類實例表

Objects是類的對象的數(shù)量;Shallow是對象本身占用內(nèi)存大小、不包含其他引用;

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

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

Java 內(nèi)存安全問題的注意事項

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

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

Java 內(nèi)存安全問題的注意事項

關(guān)于MAT的詳細使用可以從MAT官方教程學(xué)習(xí)更多

以上就是Java 內(nèi)存安全問題的注意事項的詳細內(nèi)容,更多關(guān)于Java 內(nèi)存安全問題的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲一区亚洲| 日本国产精品| 亚洲va久久久噜噜噜久久| 久久国产精品毛片| 西西人体一区二区| 99久久精品网站| 成人羞羞视频在线看网址| 香蕉成人av| 欧美 日韩 国产精品免费观看| 91精品国产91久久久久久黑人| 欧美1区免费| 蜜臀av性久久久久蜜臀aⅴ四虎 | 最新国产精品| 91精品日本| 国产精品99久久久久久董美香| 久久99免费视频| 国产精品蜜月aⅴ在线| 国产精品一区二区美女视频免费看| 国产精品xxxav免费视频| 国语精品一区| 黄色欧美日韩| 日韩va亚洲va欧美va久久| 国产探花在线精品| 激情黄产视频在线免费观看| 免费av一区二区三区四区| 国产美女精品| 国产伦精品一区二区三区视频| 国产一区二区三区久久久久久久久| 久久久久国产精品一区三寸 | 一区二区电影| 国产乱人伦精品一区| 嫩草伊人久久精品少妇av杨幂| 成人亚洲欧美| 99亚洲视频| 国产伦理一区| 久久精品国产大片免费观看| 蜜臀va亚洲va欧美va天堂| 国产精品九九| 91精品国产91久久久久久黑人| 在线日韩成人| 国产成人精品一区二区三区在线| 亚洲精品一二三区区别| 91九色综合| 久久久男人天堂| 亚洲一级影院| 日韩精品五月天| а√天堂中文在线资源8| 国产精品普通话对白| 国产亚洲字幕| 激情久久五月| 日韩高清一区二区| 麻豆视频在线看| 蜜桃传媒麻豆第一区在线观看| 精品视频一区二区三区在线观看| 婷婷亚洲综合| 麻豆高清免费国产一区| 日韩午夜一区| 国产一区二区三区网| 石原莉奈在线亚洲三区| 麻豆精品在线观看| 免费中文字幕日韩欧美| 成人一区而且| 日本精品久久| 美女网站一区| 久久精品亚洲一区二区| 日本大胆欧美人术艺术动态| 91日韩欧美| 亚洲精品韩国| 久久国产小视频| 久久爱www成人| 亚洲色图国产| 久久国产精品成人免费观看的软件| 久久精品xxxxx| 99国产一区| 国模精品一区| 欧美日一区二区在线观看| 亚洲成人日韩| 国产一区二区三区不卡av| 日韩中文字幕视频网| 欧美日韩第一| 国产91在线精品| 亚洲乱码一区| 亚洲网站视频| 樱桃视频成人在线观看| 国产美女久久| 日韩二区在线观看| 中文国产一区| 在线一区视频观看| 韩国女主播一区二区三区| 日本在线成人| 国产手机视频一区二区| 久久天堂av| 高清一区二区| 你懂的亚洲视频| 国产亚洲高清在线观看| 亚洲乱码视频| 日韩在线卡一卡二| 99国产精品| 婷婷综合网站| 久久久久久美女精品| 国产自产自拍视频在线观看| 老司机精品视频在线播放| 欧美日韩亚洲一区三区| 午夜久久av| 久久福利精品| 欧美日韩三区| 精品1区2区3区4区| 久久婷婷av| 婷婷国产精品| 久久高清免费| 婷婷综合五月| 欧美日韩国产高清| 亚洲激情二区| 亚洲欧美日韩一区在线观看| 午夜久久久久| 亚洲在线成人| 亚洲一区av| 亚洲欧美网站在线观看| 日韩美女精品| 日韩一区二区三区精品 | 日韩一区二区三区在线免费观看| 久久免费视频66| 国产欧美三级| 欧美日韩伊人| 国产精品日韩精品在线播放| 国产欧美大片| 老司机免费视频一区二区| 欧美激情福利| 国产精选在线| 日韩精品欧美| 欧美日韩四区| 国产偷自视频区视频一区二区| 午夜日韩在线| 免费欧美在线视频| 婷婷亚洲成人| 国产精品久久久久久久久久齐齐 | 国产亚洲观看| 精品视频免费| 婷婷综合六月| 亚洲欧美日韩视频二区| 蜜桃久久久久久久| 欧美啪啪一区| 98精品久久久久久久| 久久久777| 亚洲综合不卡| 97se亚洲| 国产精品www.| 欧美天堂视频| 亚洲免费观看| 日韩精品一区二区三区中文字幕| 国产精品一区三区在线观看| 成人在线免费观看网站| 久久一区二区三区喷水| 免费日韩av片| 青青青国产精品| 久久国产精品美女| 日本精品不卡| 亚洲欧美日韩国产| 国产一级成人av| 天堂√中文最新版在线| aⅴ色国产欧美| 国产精品久久久久9999高清| 成人日韩在线| 日韩在线网址| 在线手机中文字幕| 久久高清国产| 欧美激情精品| 亚洲精品a级片| 国产精品主播| 婷婷激情综合| 国产探花在线精品| 国产精品视频3p| 亚洲女同av| 国产一区导航| 国产精品大片| 久久人人99| 欧美日韩一区二区三区不卡视频 | 国产精品久久久久av电视剧| 国产精品美女久久久| 国产欧美另类| 欧美日韩激情| 国产欧美日韩精品一区二区三区| 亚洲精品一区三区三区在线观看| 亚洲精品亚洲人成在线观看| 精品久久网站| 免费美女久久99| 精品久久中文| 中文字幕日韩高清在线| 伊人久久av| 日韩二区三区四区| 99久久99久久精品国产片果冰| 亚洲精品自拍| 久久一区二区三区喷水| 国产精品观看| 蜜臀久久99精品久久久画质超高清| 国产在线观看www| 91精品国产自产观看在线| 欧美成人基地 | 国产精品99久久精品| 在线精品国产亚洲|