欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

YGC前后新生代是否變大分析詳解

 更新時間:2022年01月24日 14:32:04   作者:你假笨@JVM  
要解釋這個問題,我們先要弄清楚YGC的過程,parNew是新生代的gc算法,簡單來說從gc roots開始掃描對象,當掃到一個只要是屬于新生代的對象就將其挪到to space,但是老的對象還不會做釋放,直到gc完成之后再看是否釋放老的對象

問題描述

我們都知道gc是為了釋放內(nèi)存,但是你是否碰到過ygc前后新生代反增不減的情況呢?gc日志效果類似下面的:

2016-05-18T15:06:13.011+0800: [GC [ParNew (promotion failed): 636088K->690555K(707840K), 0.2958900 secs][CMS: 1019739K->1019733K(1310720K), 2.6208600 secs] 1655820K->1655820K(2018560K), [CMS Perm : 205486K->205486K(262144K)], 2.9174390 secs] [Times: user=3.74 sys=0.01, real=2.91 secs]

從上面的gc日志來看,我們新生代使用的是ParNew,而老生代用的是CMS GC,我們注意到ParNew的效果是新生代從636088K新增到了690555K,這是什么情況?

原理分析

要解釋這個問題,我們先要弄清楚YGC的過程,parNew是新生代的gc算法,簡單來說從gc roots開始掃描對象,當掃到一個只要是屬于新生代的對象就將其挪到to space,但是老的對象還不會做釋放,直到gc完成之后再看是否釋放老的對象(比如說上面我們看到了promotion failed的關(guān)鍵字,意味著晉升失敗了,也就是說to和old都裝不下新生代晉升來的對象,那么在這種情況下其實是不會對eden和from里的老對象做釋放的,盡管to space里已經(jīng)可能存在一份副本了),但是在gc前后不管是否晉升成功,都會對from space和to space做一個對換,也就是原來的from變成to,原來的to變成from,再來看看打印gc前后內(nèi)存變化的代碼

void GenCollectedHeap::print_heap_change(size_t prev_used) const {
  if (PrintGCDetails && Verbose) {
    gclog_or_tty->print(" "  SIZE_FORMAT
                        "->" SIZE_FORMAT
                        "("  SIZE_FORMAT ")",
                        prev_used, used(), capacity());
  } else {
    gclog_or_tty->print(" "  SIZE_FORMAT "K"
                        "->" SIZE_FORMAT "K"
                        "("  SIZE_FORMAT "K)",
                        prev_used / K, used() / K, capacity() / K);
  }
}

size_t GenCollectedHeap::used() const {
  size_t res = 0;
  for (int i = 0; i < _n_gens; i++) {
    res += _gens[i]->used();
  }
  return res;
}

size_t DefNewGeneration::used() const {
  return eden()->used()
       + from()->used();      // to() is only used during scavenge
}

從上面代碼我們知道,gc之后的內(nèi)存情況是used()方法返回的,其中新生代的used方法返回的是eden+from的內(nèi)存,同樣的上面的prev_used也是這么計算的,只是發(fā)生在gc之前,這樣一來,根據(jù)我上面提到的情況,在gc之后不管是否成功都會做一次from和to的swap,那么gc之前新生代的使用大小,其實是gc之前eden+from的使用大小,而gc之后的新生代的使用大小,其實是eden+原來的to現(xiàn)在是使用的大小,原來的to現(xiàn)在使用的大小其實就是在gc過程中將eden和from拷貝過來的對象所占的大小。

綜上分析你應該知道為什么會出現(xiàn)這種情況了,其實是一種特殊情況,只有在出現(xiàn)promotion failed的情況下才會發(fā)生這樣的情況,因為在這個情況下存在to里新增對象,而from和eden不會變化的情況

以上就是YGC前后新生代是否變大分析詳解的詳細內(nèi)容,更多關(guān)于YGC前后新生代是否變的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot整合quartz實現(xiàn)定時任務示例

    springboot整合quartz實現(xiàn)定時任務示例

    spring支持多種定時任務的實現(xiàn)。我們來介紹下使用spring的定時器和使用quartz定時器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-04-04
  • Java實現(xiàn)線程同步方法及原理詳解

    Java實現(xiàn)線程同步方法及原理詳解

    這篇文章主要介紹了Java實現(xiàn)線程同步方法及原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • java中sdk與jdk的區(qū)別詳細解析

    java中sdk與jdk的區(qū)別詳細解析

    以下是對java中sdk與jdk的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Spring是怎么擴展解析xml接口的

    Spring是怎么擴展解析xml接口的

    這篇文章主要介紹了Spring是怎么擴展解析xml接口的,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Java Mybatis架構(gòu)設計深入了解

    Java Mybatis架構(gòu)設計深入了解

    在本篇文章里小編給大家整理的是一篇關(guān)于Java Mybatis架構(gòu)設計詳解內(nèi)容,對此有興趣的朋友們可以參考下,希望能夠給你帶來幫助
    2021-11-11
  • java基于C/S模式實現(xiàn)聊天程序(服務器)

    java基于C/S模式實現(xiàn)聊天程序(服務器)

    這篇文章主要為大家詳細介紹了java基于C/S模式實現(xiàn)聊天程序的服務器篇,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 新手初學Java流程控制

    新手初學Java流程控制

    這篇文章主要介紹了JAVA流程控制語句的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下,希望可以幫到你
    2021-07-07
  • JVM內(nèi)存模型/內(nèi)存空間:運行時數(shù)據(jù)區(qū)

    JVM內(nèi)存模型/內(nèi)存空間:運行時數(shù)據(jù)區(qū)

    這篇文章主要介紹了JVM內(nèi)存模型/內(nèi)存空間的相關(guān)資料,幫助大家更好的理解和學習Java虛擬機,感興趣的朋友可以了解詳細,希望能夠給你帶來幫助
    2021-08-08
  • ibatis遷移到mybatis3的注意事項

    ibatis遷移到mybatis3的注意事項

    這篇文章主要介紹了ibatis遷移到mybatis3的注意事項的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • 基于java使用釘釘機器人向釘釘群推送消息

    基于java使用釘釘機器人向釘釘群推送消息

    這篇文章主要介紹了基于java使用釘釘機器人向釘釘群推送消息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11

最新評論