2016-08-26 16 views
8

JVM의 고유 한 오버 헤드가 있음을 알고 있으며 오버 헤드가 무엇인지 정확히 조사하기 위해 추가 조사를하고 싶었습니다.JVM이 모든 0의 거대한 int []를 사용하는 이유는 무엇입니까?

YourKit 프로파일 러를 사용하면 무작위 정보로 가득 찬 거대한 int []가 있음을 알 수있었습니다. 내 생각 엔 JVM이 애플리케이션을 최적화하기 위해 사용하는 성능 메트릭 및 기타 사항을 저장합니다. 놀랍게도 모든 요소는 0입니다.

내 결과를 얻으려면 다음과 같은 "아무 것도하지 않는"프로그램을 사용하여 결과에 JVM에서만 발생하는 사항이 포함되도록하십시오.

public final class Main { 

    public static void main(String[] args) throws InterruptedException { 
     Thread.sleep(Long.MAX_VALUE); 
    } 

} 

이것은 프로파일 링 결과의 스크린 샷이며, 필요한 경우 메모리 스냅 샷을 업로드 할 수 있습니다.

Screenshot from YourKit profiler

+3

아마 그가이 질문을 게시 한 이유는 무엇입니까? –

+1

@Jire 게시물을 가로 챌 수있는 내용을 수정해서는 안됩니다. 이 경우 OP가 승인했으나 일반적으로 받아 들일 수 없습니다. – 4castle

+0

@ 4castle 영어가 모국어가 아니기 때문에 그의 편집 내용을 알게되었습니다. FYI에 감사드립니다. –

답변

0

나는 이것들을 좀더 가지고 놀았으며 확실히 힙 크기와 관련이있다. 예를 들어, -Xmx5m -Xmx5m을 설정하면 int 배열 할당이 없어집니다. 반면에 -Xmx5g -Xms5g를 설정하면 더 큰 배열이 생성됩니다.

enter image description here

나는 그들이 사용할 궁금해.

/r/java에서 도움을 얻었습니다.

"아마, 그 힙 parsability에 도움이 스레드 지역 할당 버퍼에 필러 객체 대부분의 :. https://shipilev.net/jvm-anatomy-park/5-tlabs-and-heap-parsability/ 그들은이 도달 할 수 있어야하고, 힙 덤프를 분석 도구에 의해 필터링 된 스크린 샷에있는 프로파일 러가 표시 "모든 객체 (접근 가능하고 도달 할 수없는) "."

+0

이 질문에 대한 답변이 아니기 때문에이 플래그가 지정되어 곧 삭제 될 가능성이 높습니다.대신 질문을 편집하고 발견 한 새 정보를 포함시켜야합니다. – Marco13

1

당신은 그 배열로 들어오는 링크를 검사하여 답을 찾을 수 있습니다. 연결할 수있는 배열을 마우스 오른쪽 버튼으로 클릭하고 '선택한 객체'를 선택한 다음 '들어오는 참조'로 전환하십시오.

나는에 테이블이 있다는 것을 발견 sun.util.calendar.ZoneInfo, sun.util.Calendar.BaseCalendar, java.util.Currency

그것은 확실히 말할 어렵지만, 대부분 그 큰 도달하지-제로화 어레이에서 자바 바이트 코드를로드하는 JVM에 의해 사용되었다 .class-files. JVM은 컴파일 후에 필요하지 않으므로 릴리스되었지만 아직 수집하지 않았습니다.

+2

감사합니다. 그러나 나의 주요 관심사는 도달 할 수없는> 600k 인덱스를 가진 배열이다. –

+0

답변에 대한 내 생각을 추가했습니다. –

+1

프로그램의 전체 수명 동안 수집 된 적이 없기 때문에 사용 된 프로그램이 무엇인지 궁금합니다. 그래도 좋은 이론 :) –