成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java內存泄漏的檢測和處理

開發 后端
Java內存泄漏是每個Java程序員都會遇到的問題,程序在本地運行一切正常,可是布署到遠端就會出現內存無限制的增長,最后系統癱瘓,那么如何最快最好的檢測程序的穩定性,防止系統崩盤,作者用自已的親身經歷與各位網友分享解決這些問題的辦法。

如何查找引起內存泄漏的原因一般有兩個步驟:第一是安排有經驗的編程人員對代碼進行走查和分析,找出內存泄漏發生的位置;第二是使用專門的內存泄漏測試工具進行測試。

第一個步驟在代碼走查的工作中,可以安排對系統業務和開發語言工具比較熟悉的開發人員對應用的代碼進行了交叉走查,盡量找出代碼中存在的數據庫連接聲明和結果集未關閉、代碼冗余等故障代碼。

第二個步驟就是檢測Java的內存泄漏。在這里我們通常使用一些工具來檢查Java程序的內存泄漏問題。市場上已有幾種專業檢查Java內存泄漏的工具,它們的基本工作原理大同小異,都是通過監測Java程序運行時,所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發人員將根據這些信息判斷程序是否有內存泄漏問題。這些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等。

檢測內存泄漏的存在

這里我們將簡單介紹我們在使用Optimizeit檢查的過程。通常在知道發生內存泄漏之后,第一步是要弄清楚泄漏了什么數據和哪個類的對象引起了泄漏。

一般說來,一個正常的系統在其運行穩定后其內存的占用量是基本穩定的,不應該是無限制的增長的。同樣,對任何一個類的對象的使用個數也有一個相對穩定的上限,不應該是持續增長的。根據這樣的基本假設,我們持續地觀察系統運行時使用的內存的大小和各實例的個數,如果內存的大小持續地增長,則說明系統存在內存泄漏,如果特定類的實例對象個數隨時間而增長(就是所謂的“增長率”),則說明這個類的實例可能存在泄漏情況。

另一方面通常發生內存泄漏的第一個跡象是:在應用程序中出現了OutOfMemoryError。在這種情況下,需要使用一些開銷較低的工具來監控和查找內存泄漏。雖然OutOfMemoryError也有可能應用程序確實正在使用這么多的內存;對于這種情況則可以增加JVM可用的堆的數量,或者對應用程序進行某種更改,使它使用較少的內存。

但是,在許多情況下,OutOfMemoryError都是內存泄漏的信號。一種查明方法是不間斷地監控GC的活動,確定內存使用量是否隨著時間增加。如果確實如此,就可能發生了內存泄漏。

處理內存泄漏的方法

一旦知道確實發生了內存泄漏,就需要更專業的工具來查明為什么會發生泄漏。JVM自己是不會告訴您的。這些專業工具從JVM獲得內存系統信息的方法基本上有兩種:JVMTI和字節碼技術(byte code instrumentation)。Java虛擬機工具接口(Java Virtual Machine Tools Interface,JVMTI)及其前身Java虛擬機監視程序接口(Java Virtual Machine Profiling Interface,JVMPI)是外部工具與JVM通信并從JVM收集信息的標準化接口。字節碼技術是指使用探測器處理字節碼以獲得工具所需的信息的技術。

Optimizeit是Borland公司的產品,主要用于協助對軟件系統進行代碼優化和故障診斷,其中的Optimizeit Profiler主要用于內存泄漏的分析。Profiler的堆視圖就是用來觀察系統運行使用的內存大小和各個類的實例分配的個數的。

首先,Profiler會進行趨勢分析,找出是哪個類的對象在泄漏。系統運行長時間后可以得到四個內存快照。對這四個內存快照進行綜合分析,如果每一次快照的內存使用都比上一次有增長,可以認定系統存在內存泄漏,找出在四個快照中實例個數都保持增長的類,這些類可以初步被認定為存在泄漏。通過數據收集和初步分析,可以得出初步結論:系統是否存在內存泄漏和哪些對象存在泄漏(被泄漏)。

接下來,看看有哪些其他的類與泄漏的類的對象相關聯。前面已經談到Java中的內存泄漏就是無用的對象保持,簡單地說就是因為編碼的錯誤導致了一條本來不應該存在的引用鏈的存在(從而導致了被引用的對象無法釋放),因此內存泄漏分析的任務就是找出這條多余的引用鏈,并找到其形成的原因。查看對象分配到哪里是很有用的。同時只知道它們如何與其他對象相關聯(即哪些對象引用了它們)是不夠的,關于它們在何處創建的信息也很有用。

最后,進一步研究單個對象,看看它們是如何互相關聯的。借助于Profiler工具,應用程序中的代碼可以在分配時進行動態添加,以創建堆棧跟蹤。也有可以對系統中所有對象分配進行動態的堆棧跟蹤。這些堆棧跟蹤可以在工具中進行累積和分析。對每個被泄漏的實例對象,必然存在一條從某個牽引對象出發到達該對象的引用鏈。處于堆??臻g的牽引對象在被從棧中彈出后就失去其牽引的能力,變為非牽引對象。因此,在長時間的運行后,被泄露的對象基本上都是被作為類的靜態變量的牽引對象牽引。

總而言之, Java雖然有自動回收管理內存的功能,但內存泄漏也是不容忽視,它往往是破壞系統穩定性的重要因素。

【編輯推薦】

  1. 幾種典型的Java內存泄漏
  2. 詳細介紹Java的內存管理與內存泄露
  3. Java程序性能優化之找出內存溢出元兇
  4. 20個開發人員非常有用的Java功能代碼
  5. 走進Java 7中的模塊系統
責任編輯:yangsai 來源: CSDN博客
相關推薦

2010-09-25 11:07:45

Java內存泄漏

2011-06-16 09:28:02

C++內存泄漏

2018-12-07 10:52:08

內存泄漏方法

2023-10-31 16:40:38

LeakCanary內存泄漏

2015-07-10 09:15:47

LeakCanary內存泄漏

2024-12-05 08:58:47

2019-01-30 18:24:14

Java內存泄漏編程語言

2010-09-26 15:38:33

JVM內存泄漏

2024-07-03 11:28:15

2022-09-28 10:35:31

JavaScript代碼內存泄漏

2009-06-16 11:17:49

內存泄漏

2024-03-11 08:22:40

Java內存泄漏

2012-06-19 15:12:20

Java內存泄露

2013-02-20 16:02:02

Android開發內存泄露

2023-11-21 15:46:13

Go內存泄漏

2024-01-30 10:12:00

Java內存泄漏

2015-03-30 11:18:50

內存管理Android

2015-04-17 10:35:51

c++c++程序內存泄漏檢測代碼

2021-03-04 17:21:49

內存檢測泄漏

2023-12-18 10:45:23

內存泄漏計算機服務器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费一级片 | 欧美视频偷拍 | 久久久久国产视频 | 国产精品欧美一区喷水 | 久久亚洲国产 | 国产麻豆乱码精品一区二区三区 | 欧美一级三级在线观看 | 国产精品一区二区久久久久 | 久久婷婷国产麻豆91 | 日一区二区 | 在线一区二区三区 | 亚洲精彩免费视频 | 日韩精品一二三区 | 亚洲狠狠爱 | 欧美精品一区在线 | 精品1区2区3区4区 | 中文字幕一区在线观看视频 | 成人免费视频网站在线观看 | 欧美极品一区二区 | 九七午夜剧场福利写真 | 国产毛片久久久久久久久春天 | 国产成在线观看免费视频 | 欧美在线一区二区三区 | av天天干 | 黄视频免费观看 | 久久草在线视频 | 日韩一区二区久久 | 玖玖在线免费视频 | 国产精品一区二区免费看 | www精品美女久久久tv | 国产精品自拍一区 | 免费一区二区 | av一级| 真人女人一级毛片免费播放 | 91精品国产91久久久久久吃药 | 亚洲一区二区精品视频在线观看 | 日日碰狠狠躁久久躁婷婷 | 欧美久久免费观看 | 久久久久久国产精品免费免费狐狸 | 少妇特黄a一区二区三区88av | 国产午夜精品一区二区三区嫩草 |