>  Q&A  >  본문

java - ArrayList 메모리 할당, 세대 간 참조 gc 문제

JVM에서 ArrayList의 메모리 할당은 어떻게 되나요?

으아악

BigObject를 지속적으로 추가하는데, 참조 관계는 다음과 같나요?

그렇다면 ygc가 발생하는 건가요? arrayList 객체가 기존 영역에 들어가지 않으면 세대 간 참조가 발생하지 않을까요? 들어가면 ygc 이후에 obj = new BigObject()가 새로운 세대에 할당되고 list.add(obj)가 할당되면 old->young 영역에 대한 참조가 있지 않을까요? 할당 같은?

문제의 근원

다음 코드를 실행하세요:
매개변수: /jdk1.7.0_79.jdk/bin/java -Xmx500M -Xms500M -Xmn200M -XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=90 -XX:+PrintGCApplicationConcurrentTime -XX: +PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC -XX:+PrintGCDateStamps -verbose:gc -XX:+PrintGCDetails -Xloggc:/Users/*/temp/test.gc.log

으아악

gc.log를 보면 할당() 메서드를 실행한 후에도 이전 영역이 여전히 90% 이상 점유되어 CMS GC가 계속 수행되지만 재활용할 수 없는 것으로 나타납니다.

黄舟黄舟2712일 전854

모든 응답(1)나는 대답할 것이다

  • 高洛峰

    高洛峰2017-05-17 10:09:27

    최근에 귀하에게 유용할 수 있는 두 가지 기사를 봤습니다.

    http://zhuanlan.51cto.com/art...
    http://zhuanlan.51cto.com/art...

    회신하다
    0
  • 취소회신하다