R大部分文章整理

整理rednaxelafx.iteye.com上適合的內容


  • 手動System.gc()與JVM自動gc有什么根本上的區別么?
    • System.gc()可能在自動GC原本不會進入GC的位置上進入GC
      • 正常情況下,Java代碼要嘗試在GC堆上分配空間的時候才會觸發GC;換句話說,基本上是“new”的時候才會觸發GC。但System.gc()、JVMTI的強制GC等動作都在正常情況之外提示系統要做一次GC
    • System.gc()不一定是觸發所謂的“full GC”或者叫“major GC”
      • 在Sun JDK6與OpenJDK 6的HotSpot里,"GCCause是_java_lang_system_gc"的時候,如果VM啟動參數DisableExplicitGC為false,則會觸發一次full GC,如果該參數為true則完全不觸發任何GC。要將這個參數設置為true,啟動的時候寫上-XX:+DisableExplicitGC就行
      • 當使用Concurrent Mark-Sweep (CMS)時,可以通過-XX:+ExplicitGCInvokesConcurrent 或 -XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses 參數來指定System.gc()觸發并發GC而不是full GC
        在CMS中,并發GC不對old gen做壓縮,而full GC是stop-the-world的并且會做壓縮
    • HotSpot對System.gc()有特別處理
      • 最主要的地方體現在一次System.gc()是否與普通GC一樣會觸發GC的統計/閾值數據的更新
        • HotSpot里的許多GC算法都帶有自適應的功能,會根據先前收集的效率來決定接下來的GC中使用的參數,
          但System.gc()默認不更新這些統計數據,避免用戶強行調用GC對這些自適應功能的干擾
          可以參考HotSpot的UseAdaptiveSizePolicyWithSystemGC參數,默認是false
    • 除此之外,在HotSpot里,System.gc()所觸發的full GC跟普通的full GC沒啥大差別

整理rednaxelafx.zhihu.com上適合的內容



最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • System.gc整理 System.gc()源碼public static void gc() { Runtim...
    andersonoy閱讀 2,980評論 0 1
  • Java 虛擬機有自己完善的硬件架構, 如處理器、堆棧、寄存器等,還具有相應的指令系統。JVM 屏蔽了與具體操作系...
    尹小凱閱讀 1,706評論 0 10
  • 原文閱讀 前言 這段時間懈怠了,罪過! 最近看到有同事也開始用上了微信公眾號寫博客了,挺好的~給他們點贊,這博客我...
    碼農戲碼閱讀 6,018評論 2 31
  • 一 、java虛擬機底層結構詳解 我們知道,一個JVM實例的行為不光是它自己的事,還涉及到它的子系統、存儲區域、...
    葡萄喃喃囈語閱讀 1,518評論 0 4
  • Troubleshooting 整理 kill -3 pid發送一個SIGQUIT信號給Java應用, 通常會有當...
    andersonoy閱讀 715評論 0 0