java總結之full(java的總結)

  • 1、Java 中isFull是哪個包?
  • 2、java 怎樣規避full gc
  • 3、java fullgc什麼意思
  • 4、java培訓結束後總結如何寫?
  • 5、Java中full gc什麼意思?

isFull是自定義方法,一般用來判斷stack是否為滿棧。。

可以放到任意包

據我觀察JAVA程序,一般在命令行模式下運行JAVA任務,JDK可以承受的內存上限大概是機器物理內存的1/4。

比如我的服務器是16G的內存,那麼JAVA程序可以佔用的最大內存是4G左右,超出就報溢出。

所以在一般程序運行中,JAVA內存逐漸從

100MB 200MB, 300…1G…2G…… 膨脹到4G,在這個過程中,我的循環都設置了System.gc(),偶爾有佔用內存減少的時候,但是基本下降都很有限,然後過一會兒又繼續上升。直到上升到4G的時候,如果此時系統沒有明確的數據持續寫進內存,只是大量進行新建變量,賦值,然後生命周期結束待回收的過程,系統會大量進行GC的操作,保證JAVA內存不超過4G,但我似乎感覺一旦在內存在4G上下遊動的時候,JAVA程序的性能就開始走低。

所以我的理解是,GC直到不得不執行的時候才會被執行,而且效果並不好。。。。

PS,如果是8G內存的服務器,GC頻繁執行是在JAVA佔用內存到達2G的時候。

同不知道如何進行高效的內存回收。本來沒有任何寫入內存操作的程序,但是程序處理問題一大了,佔有內存就很多。

GC是垃圾回收站。

FULL GC分析和問題定位

a. GC log收集和分析

(1)在JVM啟動參數增加:”-verbose:gc -Xloggc:file_name -XX:+PrintGCDetails -XX:+PrintGCDateStamps”

PrintGCTimeStamp只能獲得相對時間,建議使用PrintGCDateStamps獲得full gc 發生的絕對時間

(2)如果採用CMS GC,仔細分析jstat FGC輸出和GC 日誌會發現, CMS的每個並發GC周期則有兩個stop-the-world階段——initial mark與final re-mark,使得CMS的每個並發GC周期總共會更新full GC計數器兩次,initial mark與final re-mark各一次

b. Dump JVM 內存快照

/opt/taobao/java/bin/jmap -dump:format=b,file=dump.bin pid

這裡有一個問題是什麼時候進行dump?

一種方法是前面提到的用jstat工具觀察,當OLD區到達比較高的比例如60%,一般會很快觸發一次FULL GC,可以進行一次DUMP,在FULL GC發生以後再DUMP一次,這樣比較就可以發現到底是哪些對象導致不停的FULL GC

另外一種方法是通過配置JVM參數

-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC分別用於指定在full GC之前與之後生成heap dump

c. 利用MAT((Memory Analyzer Tool)工具分析dump文件

關於MAT具體使用方法網上有很多介紹,這裡不做詳細展開,這裡需要注意的是:

(1) MAT缺省只分析reachable的對象,unreachable的對象(將被收集掉的對象)被忽略,而分析FULL GC頻繁原因時unreachable object也應該同時被重點關注。如果要顯示unreachable的對象細節必須用mat 1.1以上版本並且打開選項“keep unreachable object”

(2) 通常dump文件會好幾個G,無法在windows上直接進行分析,我們可以先把dump文件在linux上進行分析,再把分析好的文件拷貝到windows上,在windows上用MAT打開分析文件。

java語言是-種跨平台的高級語言,無論是網絡世界和桌面應用程序,還是分布式應用環境和嵌入式應用都可以看到java的身影。顯然java語言依然保持着旺盛的生命力,這也使得眾多的從業人員開始學習java語言。不過大家在Java培訓班學習之後,學校肯定會讓寫java學習總結的,這樣很多程序猿頭疼,因為學習程序之後,大家的作文水平明顯會下降,今天我就把總結的技巧告訴大家。1、在那個機構學習的,學習的過程怎樣:比如:某某在昆明北大青鳥學習JAVA軟件開發也有一段時間了,現在java的學習就要結束了,我對java從初步的認識的認識到能夠熟練掌握各個方面的問題。比如說一下面向對象:面向對象是個很嚴肅的問題,就向上下級關係一樣,下級在有的方面就得遵守.上級的指令做事,這樣就便於管理,更是提高了生產的效率。在這裡學習一段時間使我受益匪淺,從剛畢業的迷茫之際,到現在敢於去各大公司面試,上崗,對自己信心滿滿。2、從自身出發:比如:自從學習了這麼課程之後,最讓我感覺深刻的是時間不夠用,每天過得很充實。忙到沒時間拍拖,忙到沒時間休閑娛樂,忙到廢寢忘食還在寫着代碼,就連吃飯睡覺同學們都在談論着如何寫代碼才能實現某種功能。某位老師java編程的課程讓我受益匪淺,某某老師幽默風趣,由淺入深,循序漸進教學方式讓我們更快掌握代碼,而且他還讓我們參與軟件開發項目,理論結合實踐,讓我們在工作中發現問題,在實踐中成長。這種浸入式的java培訓教學我覺得很好,實踐出真知,只有在實踐中才能真正學到東西,發現問題,才能更好提升自己。3、認識到的朋友:比如:在這段時間的學習生活中,我也認識了很多同學,我們來自不同的學校,我們因為共同的理想而走在一起,其間我們有過迷茫和彷徨,有過艱辛還有歡笑,但不管怎樣,我們微笑着面對,因為我們是一個有理想的碼農。雖然我們在我們前行的道路上,或許有些許坎坷,但其實人生的快樂正是在起起落落間,只要堅信我們前進的方向正確,我深信,終有一天總會觸摸到天堂。4、最後感謝學校、老師、朋友感謝的話就不為大家舉例了,相信大家都會有對待學校老師朋友都有着重大的感情,以上觀點知識小編為大家總結的幾點技巧,只是本人的觀點,如果能夠幫助到大家,本人也是很高興的,今天java培訓結束後總結如何寫?就寫到這裡,希望能夠幫助到即將畢業的同學們。

轉發的~但能解決你的問題

除直接調用System.gc外,觸發Full GC執行的情況有如下四種。

1. 舊生代空間不足

舊生代空間只有在新生代對象轉入及創建為大對象、大數組時才會出現不足的現象,當執行Full GC後空間仍然不足,則拋出如下錯誤:

java.lang.OutOfMemoryError: Java heap space

為避免以上兩種狀況引起的FullGC,調優時應盡量做到讓對象在Minor GC階段被回收、讓對象在新生代多存活一段時間及不要創建過大的對象及數組。

2. Permanet Generation空間滿

PermanetGeneration中存放的為一些class的信息等,當系統中要加載的類、反射的類和調用的方法較多時,Permanet Generation可能會被佔滿,在未配置為採用CMS GC的情況下會執行Full GC。如果經過Full GC仍然回收不了,那麼JVM會拋出如下錯誤信息:

java.lang.OutOfMemoryError: PermGen space

為避免Perm Gen佔滿造成Full GC現象,可採用的方法為增大Perm Gen空間或轉為使用CMS GC。

3. CMS GC時出現promotion failed和concurrent mode failure

對於採用CMS進行舊生代GC的程序而言,尤其要注意GC日誌中是否有promotion failed和concurrent mode failure兩種狀況,當這兩種狀況出現時可能會觸發Full GC。

promotionfailed是在進行Minor GC時,survivor space放不下、對象只能放入舊生代,而此時舊生代也放不下造成的;concurrent mode failure是在執行CMS GC的過程中同時有對象要放入舊生代,而此時舊生代空間不足造成的。

應對措施為:增大survivorspace、舊生代空間或調低觸發並發GC的比率,但在JDK 5.0+、6.0+的版本中有可能會由於JDK的bug29導致CMS在remark完畢後很久才觸發sweeping動作。對於這種狀況,可通過設置-XX:CMSMaxAbortablePrecleanTime=5(單位為ms)來避免。

4. 統計得到的Minor GC晉陞到舊生代的平均大小大於舊生代的剩餘空間

這是一個較為複雜的觸發情況,Hotspot為了避免由於新生代對象晉陞到舊生代導致舊生代空間不足的現象,在進行Minor GC時,做了一個判斷,如果之前統計所得到的Minor GC晉陞到舊生代的平均大小大於舊生代的剩餘空間,那麼就直接觸發Full GC。

例如程序第一次觸發MinorGC後,有6MB的對象晉陞到舊生代,那麼當下一次Minor GC發生時,首先檢查舊生代的剩餘空間是否大於6MB,如果小於6MB,則執行Full GC。

當新生代採用PSGC時,方式稍有不同,PS GC是在Minor GC後也會檢查,例如上面的例子中第一次Minor GC後,PS GC會檢查此時舊生代的剩餘空間是否大於6MB,如小於,則觸發對舊生代的回收。

除了以上4種狀況外,對於使用RMI來進行RPC或管理的Sun JDK應用而言,默認情況下會一小時執行一次Full GC。可通過在啟動時通過- java-Dsun.rmi.dgc.client.gcInterval=3600000來設置Full GC執行的間隔時間或通過-XX:+ DisableExplicitGC來禁止RMI調用System.gc。

原創文章,作者:LY5OE,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/126437.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
LY5OE的頭像LY5OE
上一篇 2024-10-03 23:08
下一篇 2024-10-03 23:08

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論