글쎄, 여기에 몇 가지 질문이 있습니다!
1-수명이 짧은 개체는 어떻게 관리됩니까?
앞서 언급했듯이 JVM은 약한 세대 별 가설을 따르기 때문에 엄청난 양의 단기 객체를 완벽하게 처리 할 수 있습니다 .
주 메모리 (힙)에 도달 한 개체에 대해 이야기하고 있습니다. 항상 그런 것은 아닙니다. 생성 한 많은 객체는 CPU 레지스터를 남기지 않습니다. 예를 들어,이 for 루프를 고려하십시오.
for(int i=0, i<max, i++) {
// stuff that implies i
}
루프 언 롤링 (JVM이 코드에서 많이 수행하는 최적화)에 대해 생각하지 마십시오. 경우 maxIS가 동일 Integer.MAX_VALUE하면 루프가 실행하는 데 시간이 걸릴 수 있습니다. 그러나 i변수는 루프 블록을 벗어나지 않습니다. 따라서 JVM은 해당 변수를 CPU 레지스터에 넣고 정기적으로 증분하지만 주 메모리로 다시 보내지 않습니다.
따라서 수백만 개의 개체를 만드는 것은 로컬에서만 사용되는 경우 큰 문제가 아닙니다. 그들은 Eden에 저장되기 전에 죽을 것이므로 GC는 그들을 알아 채지 못할 것입니다.
2-GC의 오버 헤드를 줄이는 것이 유용합니까?
평소처럼 상황에 따라 다릅니다.
먼저, 무슨 일이 일어나고 있는지 명확하게 볼 수 있도록 GC 로깅을 활성화해야합니다. 다음으로 활성화 할 수 있습니다.-Xloggc:gc.log -XX:+PrintGCDetails .
애플리케이션이 GC주기에서 많은 시간을 소비하는 경우, 예, GC를 조정하십시오. 그렇지 않으면 실제로 가치가 없을 수 있습니다.
예를 들어, 100ms마다 10ms가 걸리는 젊은 GC가있는 경우 GC에서 시간의 10 %를 소비하고 초당 10 개의 컬렉션이 있습니다 (이는 huuuuuge). 이 경우 10 GC / s가 여전히 존재하므로 GC 튜닝에 시간을 소비하지 않습니다.
3-약간의 경험
엄청난 양의 주어진 클래스를 생성하는 응용 프로그램에서 비슷한 문제가 발생했습니다. GC 로그에서 응용 프로그램의 생성 속도가 약 3GB / s라는 것을 알았습니다. 이것은 너무 많은 것입니다 (초당 3GB의 데이터?!).
문제 : 너무 많은 객체가 생성되어 너무 자주 GC가 발생합니다.
필자의 경우 메모리 프로파일 러를 연결하고 클래스가 모든 개체의 막대한 비율을 나타내는 것을 발견했습니다. 인스턴스화를 추적하여이 클래스가 기본적으로 개체에 래핑 된 한 쌍의 부울이라는 것을 알아 냈습니다. 이 경우 두 가지 솔루션을 사용할 수 있습니다.
두 번째는 애플리케이션에 미치는 영향이 가장 적고 도입하기 쉽기 때문에 선택했습니다. 스레드로부터 안전하지 않은 캐시가있는 팩토리를 만드는 데 몇 분이 걸렸습니다.
할당 속도는 1GB / s로 떨어졌고, 젊은 GC의 빈도도 감소했습니다 (3으로 나눈 값).
도움이 되길 바랍니다!