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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏

發(fā)布時間:2023/12/3 java 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

js內(nèi)存泄露 垃圾回收

Java內(nèi)存架構(gòu)(Java內(nèi)存模型)

上面是堆的Java內(nèi)存模型以及Java虛擬機(jī)(JVM)中運(yùn)行的任何Java應(yīng)用程序的PermGen。 還提供了比率,以使您更好地了解如何在每種生成類型之間分配允許的內(nèi)存。 以上所有內(nèi)容完全適用于Java 1.7版(含)。 上面也稱為內(nèi)存模型的“管理區(qū)域”。

除上述內(nèi)容外,還有一個堆棧區(qū)域,可以使用-Xss選項(xiàng)進(jìn)行配置。 該區(qū)域保存堆上的引用,本機(jī)引用,pc寄存器,代碼緩存和所有線程的局部變量。 這也稱為內(nèi)存模型的“本地區(qū)域”。

Java內(nèi)存模型的受管區(qū)域(Java內(nèi)存體系結(jié)構(gòu))

[年輕一代/苗圃]伊甸園空間

首先在伊甸園空間中創(chuàng)建所有新對象。 一旦達(dá)到由JVM確定的任意閾值,就會啟動次要垃圾回收(Minor GC)。它首先刪除所有非引用對象,并將引用對象從“ eden”和“ from”移到“ to”幸存者空間。 GC結(jié)束后,將交換“從”和“到”角色(名稱)。

[年輕一代/苗圃]幸存者1(來自)

這是幸存者空間的一部分(您可能會認(rèn)為這是幸存者空間中的角色 )。 這是上一個垃圾回收(GC)期間的“收件人”角色。

[年輕一代/苗圃] Suvrivor 2(至)

這也是幸存者空間的一部分(您可能認(rèn)為這也是幸存者空間中的角色 )。 在這里,在GC期間,所有引用的對象
從'from'和'eden'移到。

[上一代]終身任職

根據(jù)閾值限制,可以使用-XX:+ PrintTenuringDistribution進(jìn)行檢查,該限制按年齡顯示對象(以字節(jié)為單位的空間)–將對象從“到” 幸存者空間移動到Tenured空間。 “年齡”是指它在幸存者空間內(nèi)移動的次數(shù)。 還有其他重要標(biāo)志,例如-XX:InitialTenuringThreshold,-XX:MaxTenuringThreshold和-XX:TargetSurvivorRatio ,這些標(biāo)志可導(dǎo)致對保有權(quán)空間和幸存者空間進(jìn)行最佳利用。 通過設(shè)置-XX:InitialTenuringThreshold和-XX:MaxTenuringThreshold,我們允許'Age'的初始值和最大值,同時保持-XX:+ NeverTenure和-XX指定的'Survivor(To)'中的利用率百分比。正如他們建議的那樣,+ AlwaysTenure用于永遠(yuǎn)不保管對象(使用風(fēng)險(xiǎn)較大 ),而相反的用法是始終保管,即始終使用“老一代”。 這里發(fā)生的垃圾收集是主要垃圾收集(主要GC)。 通常在堆已滿或舊代已滿時觸發(fā)。 這通常是接管執(zhí)行垃圾回收的' Stop-the-World '事件或線程。 還有另一種稱為完全垃圾收集(Full GC)的GC,它涉及其他內(nèi)存區(qū)域,例如permgen空間。

與整個堆相關(guān)的其他重要且有趣的標(biāo)志是-XX:SurvivorRatio和-XX:NewRatio ,它們指定eden空間與幸存者空間的比率以及舊一代與新一代的比率。

[永久世代] Permgen空間

“ Permgen”用于存儲以下信息:常量池(內(nèi)存池),字段和方法數(shù)據(jù)以及代碼。 他們每個人的名字都暗示著相同的細(xì)節(jié)。

垃圾收集算法

串行GC(-XX:UseSerialGC):年輕一代和老一代的GC

為年輕和終身一代使用簡單的標(biāo)記掃描緊湊循環(huán)。 這對于客戶端系統(tǒng)以及內(nèi)存占用量少和cpu較小的系統(tǒng)來說是一個好選擇

并行GC(-XX:UseParallelGC):年輕一代和老一代的GC

這使用了N個線程,可以使用-XX:ParallelGCThreads = N進(jìn)行配置,這里N也是CPU內(nèi)核的數(shù)量。 用于垃圾收集。 它在Young代中將這N個線程用于GC,而在Old代中僅使用一個線程。

并行舊GC(-XX:UseParallelOldGC):年輕一代和老一代的GC

這與并行GC相同,除了在舊一代和年輕一代中都使用N個線程進(jìn)行GC。

并發(fā)標(biāo)記和掃描GC(-XX:ConcMarkSweepGC):舊Generaton上的GC

顧名思義,CMS GC最大限度地減少了GC所需的停頓時間。 創(chuàng)建高響應(yīng)性的應(yīng)用程序最有用,并且僅在舊版本中才進(jìn)行GC。 它為GC創(chuàng)建了多個線程,這些線程與應(yīng)用程序線程并發(fā)工作,可以使用-XX:ParallelCMSThreads = n指定這些線程。

G1 GC(-XX:UseG1GC):年輕一代和老年人一代的GC(通過將堆分成相等大小的區(qū)域)

這是一個并行,并發(fā)且遞增壓縮的低暫停垃圾收集器。 它是在Java 7中引入的,其最終目標(biāo)是取代CMS GC。 它將堆劃分為多個大小相等的區(qū)域,然后執(zhí)行GC,通常從實(shí)時數(shù)據(jù)較少的區(qū)域開始-因此,即“垃圾優(yōu)先”。

最常見的內(nèi)存不足問題

所有Java開發(fā)人員都應(yīng)該知道的最常見的內(nèi)存不足問題,以便正確地開始調(diào)試,如下所示:

  • 線程“ main”中的異常:java.lang.OutOfMemoryError:Java堆空間這并不一定意味著內(nèi)存泄漏,這可能是由于為堆配置的空間較小所致。 否則,在壽命長的應(yīng)用程序中,可能是由于無意中提到了對堆對象的引用(內(nèi)存泄漏)。 甚至應(yīng)用程序調(diào)用的API都可能包含對不必要的對象的引用。 同樣,在過度使用終結(jié)器的應(yīng)用程序中,有時對象會排隊(duì)進(jìn)入終結(jié)隊(duì)列。 當(dāng)這樣的應(yīng)用程序創(chuàng)建更高優(yōu)先級的線程并導(dǎo)致finalizaton隊(duì)列中的對象越來越多時,它可能會導(dǎo)致內(nèi)存不足。
  • 線程“ main”中的異常:java.lang.OutOfMemoryError:PermGen空間如果加載了許多類和方法,或者創(chuàng)建了很多字符串文字,尤其是通過使用intern()(從JDK 7開始,不再使用實(shí)習(xí)字符串) (PermGen的一部分)–然后會發(fā)生這種類型的錯誤。 發(fā)生這種錯誤時,文本ClassLoader.defineClass可能會出現(xiàn)在所打印的堆棧跟蹤頂部附近。
  • 線程“ main”中的異常:java.lang.OutOfMemoryError:請求的數(shù)組大小超出VM限制當(dāng)請求的數(shù)組大小大于可用堆大小時,再次發(fā)生這種情況。 如果為數(shù)組大小請求一個非常大的值,則通常可能是由于運(yùn)行時的程序錯誤導(dǎo)致的。
  • 線程“ main”中的異常:java.lang.OutOfMemoryError:請求<r>的<s>個字節(jié)。 交換空間不足?
    通常這可能是內(nèi)存泄漏的根本原因。 當(dāng)操作系統(tǒng)沒有足夠的交換空間或另一個進(jìn)程占用系統(tǒng)上所有可用的內(nèi)存資源時,就會發(fā)生這種情況。 簡而言之,由于空間耗盡,它無法從堆中提供請求空間。 該消息指示失敗的請求的大小“ s”(以字節(jié)為單位)以及內(nèi)存請求的原因“ r”。 在大多數(shù)情況下,消息的<r>部分是報(bào)告分配失敗的源模塊的名稱,盡管在某些情況下它表示原因。
  • 線程“ main”中的異常:java.lang.OutOfMemoryError:<原因> <堆棧跟蹤>(本機(jī)方法)
    這表明本機(jī)方法遇到分配失敗。 根本原因是該錯誤發(fā)生在JNI中,而不是在JVM內(nèi)部執(zhí)行的代碼中發(fā)生。 當(dāng)本機(jī)代碼不檢查內(nèi)存分配錯誤時,應(yīng)用程序?qū)⒈罎⒍皇呛谋M內(nèi)存。

內(nèi)存泄漏的定義

“將內(nèi)存泄漏視為一種疾病,而將OutOfMemoryError視為一種癥狀。 但是,并非所有OutOfMemoryErrors都暗示內(nèi)存泄漏,也不是所有內(nèi)存泄漏都表現(xiàn)為OutOfMemoryErrors。 ”

在計(jì)算機(jī)科學(xué)中,內(nèi)存泄漏是一種資源泄漏,當(dāng)計(jì)算機(jī)程序錯誤地管理內(nèi)存分配以致不再釋放不再需要的內(nèi)存時,就會發(fā)生這種情況。 在面向?qū)ο蟮木幊讨?,當(dāng)對象存儲在內(nèi)存中但無法被運(yùn)行的代碼訪問時,可能會發(fā)生內(nèi)存泄漏。

Java中內(nèi)存泄漏的常見定義:

當(dāng)不必要的對象引用被不必要地維護(hù)時,就會發(fā)生內(nèi)存泄漏。

在Java中,內(nèi)存泄漏是指某些對象不再被應(yīng)用程序使用,但GC無法將其識別為未使用的情況。

當(dāng)程序中不再使用某個對象,但仍在無法訪問的某個位置引用該對象時,將出現(xiàn)內(nèi)存泄漏。 因此,垃圾收集器無法刪除它。 用于該對象的內(nèi)存空間將不會釋放,并且用于程序的總內(nèi)存將增加。 隨著時間的推移,這將降低性能,并且JVM可能會耗盡內(nèi)存。

從某種意義上說,當(dāng)在永久性空間上無法分配任何內(nèi)存時,就會發(fā)生內(nèi)存泄漏。

內(nèi)存泄漏的一些最常見原因是:

  • 線程局部變量
  • 圓形和復(fù)雜雙向參考
  • JNI內(nèi)存泄漏
  • 可變的靜態(tài)字段(最常見)
  • 我建議使用與JDK捆綁在一起的Visual VM,以開始調(diào)試內(nèi)存泄漏問題。

    內(nèi)存泄漏的常見調(diào)試

  • NetBeans探查器
  • 使用jhat實(shí)用程序
  • 創(chuàng)建堆轉(zhuǎn)儲
  • 在運(yùn)行過程中獲取堆直方圖
  • 在OutOfMemoryError處獲取堆直方圖
  • 監(jiān)視即將完成的對象數(shù)量
  • 第三方內(nèi)存調(diào)試器
  • 調(diào)試內(nèi)存泄漏問題的常用策略或步驟包括:

    • 識別癥狀
    • 啟用詳細(xì)垃圾回收
    • 啟用分析
    • 分析痕跡

    祝幸福時光,解決Java內(nèi)存問題!

    翻譯自: https://www.javacodegeeks.com/2015/11/java-memory-architecture-model-garbage-collection-and-memory-leaks.html

    js內(nèi)存泄露 垃圾回收

    總結(jié)

    以上是生活随笔為你收集整理的js内存泄露 垃圾回收_Java内存体系结构(模型),垃圾回收和内存泄漏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。