java 简化判断_简化Java内存分析
java 簡(jiǎn)化判斷
作為一名典型的Java開(kāi)發(fā)人員,除了遵循關(guān)閉連接,流等典型的最佳實(shí)踐外,我從未監(jiān)視過(guò)應(yīng)用程序的內(nèi)存使用情況。最近,我們?cè)贘Boss服務(wù)器中遇到了一些問(wèn)題,不得不深入研究?jī)?nèi)存管理Java中最好的事情之一是,創(chuàng)建對(duì)象時(shí),不需要開(kāi)發(fā)人員處理內(nèi)存分配。 JVM為我們做到了。 大多數(shù)時(shí)候,我們只需要堆內(nèi)存和垃圾收集器的外層知識(shí)。 我將分享一些非常有趣的調(diào)查。 我是一個(gè)巨大的話題,我是從Web應(yīng)用程序開(kāi)發(fā)人員的角度寫(xiě)的,我認(rèn)為我們應(yīng)該了解的所有最低要求。 工具有許多不錯(cuò)的工具可用于剖析Java應(yīng)用程序,其中一些是,
1. 您的套件Java Profiler
2. JProfiler
3. Eclipse MAT 4. 可視VM
其中,您的Kit和JProfilers需要許可證,其他則可以免費(fèi)使用產(chǎn)品。 我們將使用VisualVM。 它是一個(gè)簡(jiǎn)單但功能強(qiáng)大的工具,并捆綁在JDK中。 它具有可下載和使用的插件功能列表。 要開(kāi)始使用VisualVM,請(qǐng)轉(zhuǎn)到<JDK_HOME> \ bin并運(yùn)行jvisualvm.exe 。 我發(fā)現(xiàn)以下文章對(duì)繼續(xù)學(xué)習(xí)很有用。
1. 使用VisualVM進(jìn)行分析
2. VisualVM性能調(diào)整工具
3. 如何在不崩潰的情況下獲取VisualVM來(lái)配置JBoss
由于我們?cè)谶@里討論內(nèi)存,因此請(qǐng)確保按照本文所述,在VisualVM上安裝Visual GC插件。
設(shè)置階段– JVM內(nèi)存結(jié)構(gòu)
JVM內(nèi)存分為三部分,如下圖所示。 在我們的應(yīng)用程序中,我們關(guān)注堆內(nèi)存。 我們可以使用參數(shù)將此值輸入到JVM,
-Xmx <size> –設(shè)置最大Java堆大小
-Xms <size> –設(shè)置初始Java堆大小
非堆內(nèi)存存儲(chǔ)每個(gè)類(lèi)的結(jié)構(gòu),例如運(yùn)行時(shí)常量池,字段和方法數(shù)據(jù),以及方法和構(gòu)造函數(shù)的代碼以及內(nèi)部字符串。
這是一篇不錯(cuò)的文章,其中包含有關(guān)JVM內(nèi)存大小的更多詳細(xì)信息。 在這里閱讀Javin關(guān)于JVM堆空間的文章。
一種常見(jiàn)的混淆是關(guān)于堆棧內(nèi)存和堆內(nèi)存 。 此處對(duì)此進(jìn)行了很好的解釋。堆棧值僅存在于創(chuàng)建它們的函數(shù)的范圍內(nèi)。一旦返回,它們將被丟棄。 Java僅將原語(yǔ)存儲(chǔ)在堆棧中。 這樣可使堆棧變小,并有助于使各個(gè)堆棧幀變小,從而允許更多的嵌套調(diào)用。 對(duì)象是在堆上創(chuàng)建的,并且只有引用(即原語(yǔ))在堆棧上傳遞。
現(xiàn)在,讓我們變得真實(shí)。 在Visual GC的圖像下方給出,這是前面提到的VisualVM內(nèi)部的一個(gè)插件。 我們?cè)谶@里看到許多圖表,在這里可以找到輸出的詳細(xì)描述。
游戲開(kāi)始–應(yīng)用程序運(yùn)行時(shí)會(huì)發(fā)生什么
創(chuàng)建對(duì)象時(shí),它們位于Eden內(nèi)部。 運(yùn)行垃圾收集器(GC)時(shí),如果對(duì)象已死(意味著它們不是活動(dòng)引用),則將其清除,否則將其移至S1 (生存空間1)或S2 。 這稱(chēng)為GC循環(huán)。 內(nèi)部GM算法確定GC循環(huán)的頻率。 堆內(nèi)存的Eden + S1 + S2部分稱(chēng)為Young generation。 在固定數(shù)量的GC循環(huán)中幸存下來(lái)的對(duì)象將移入Old Gen空間。 大多數(shù)Java對(duì)象死于嬰兒,并且永遠(yuǎn)都不會(huì)到達(dá)OldGen。這通常包括局部變量,這些局部變量在方法執(zhí)行后會(huì)刷新。
老一代內(nèi)部的GC循環(huán)頻率要比年輕一代少得多。老一代對(duì)象的典型示例是單例,緩存的對(duì)象和其他應(yīng)用程序廣泛使用的數(shù)據(jù)。
當(dāng)事情沒(méi)有按照計(jì)劃進(jìn)行時(shí)
在典型的應(yīng)用中,Old Gen空間內(nèi)部的變化較小。 如果即使在GC循環(huán)之后,Old Gen空間也隨著時(shí)間線性增長(zhǎng),則將導(dǎo)致OutOfMemoryError。 這可能表明代碼內(nèi)部存在內(nèi)存泄漏。 但是,我們可能需要使用探查器來(lái)找出造成這種情況的確切原因。 這是Dzon上有關(guān)Java EE企業(yè)性能問(wèn)題的某些原因的文章。
這些是執(zhí)行應(yīng)用程序時(shí)JVM內(nèi)存的組織方式和響應(yīng)方式的基本構(gòu)建塊。 從這一點(diǎn)開(kāi)始,有很多主題,包括調(diào)整內(nèi)存參數(shù)和垃圾收集器。 我將添加一些與此相關(guān)的有用資源。
1. Java性能調(diào)優(yōu),性能分析和內(nèi)存管理
2. InfoQ演示:診斷Web應(yīng)用程序內(nèi)存不足錯(cuò)誤
3. InfoQ演示:我所學(xué)到的有關(guān)JVM性能調(diào)整@twitter的一切 4. InfoQ演示:高性能Java 5. Java理論與實(shí)踐:垃圾收集與性能
參考: Java內(nèi)存概要分析(來(lái)自JCG合作伙伴 Manu PK)在“面向?qū)ο蟮纳睢辈┛椭泻?jiǎn)化 。
翻譯自: https://www.javacodegeeks.com/2012/09/java-memory-model-simplified.html
java 簡(jiǎn)化判斷
總結(jié)
以上是生活随笔為你收集整理的java 简化判断_简化Java内存分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JSR-308和Checker框架为jO
- 下一篇: java面试题:集合_Java:选择正确