2017-11-09 20 views
2

나는으로 설정하고, 512K로 예상되는 공간을 예상하지만 실제로는 0K입니다.왜 -Xmn1m -XX : SurvivorRatio = 2가 에덴 공간을 만듭니다. 038

정말 이상합니다. 이유는 알 수 없습니다. 도움이 필요해.

VM 선택해 -Xmx20m -Xms20m -Xmn1m -XX : SurvivorRatio = 2 -XX : + PrintGCDetails

Java 버전 : 다음으로 1.7.0_79

코드 결과이다 :

public class NewSizeDemo { 
    public static void main(String[] args){ 
     byte[] b = null; 

     for (int i=0; i<10; i++){ 
      b = new byte[1*1024*1024]; 
     } 
    } 
} 
Heap 
PSYoungGen  total 512K, used 0K [0x00000007fff00000, 0x0000000800000000, 0x0000000800000000) 
    eden space 0K, -2147483648% used [0x00000007fff00000,0x00000007fff00000,0x00000007fff00000) 
    from space 512K, 0% used [0x00000007fff80000,0x00000007fff80000,0x0000000800000000) 
    to space 512K, 0% used [0x00000007fff00000,0x00000007fff00000,0x00000007fff80000) 
ParOldGen  total 19456K, used 11573K [0x00000007fec00000, 0x00000007fff00000, 0x00000007fff00000) 
    object space 19456K, 59% used [0x00000007fec00000,0x00000007ff74d5a0,0x00000007fff00000) 
PSPermGen  total 21504K, used 2996K [0x00000007f9a00000, 0x00000007faf00000, 0x00000007fec00000) 
    object space 21504K, 13% used [0x00000007f9a00000,0x00000007 

답변

1

나는 자바 7 및 Java 8와 함께 몇 가지 실험을했다 다른 옵션. 핵심은 것 같다

  • 스페이스 당신이 할 수있는 것을 의미하는 작은 설정이 "1×512k에, 1×512k에서, 1×512k을 에덴"되도록, 512k의 배수 및 비어있을 수 없습니다 항상 크기가 1536k보다 작은 새 크기가 있습니다. 또한, 비율 제약은 512k 단위 크기의 전체 수 요소를 사용하여 가능한 한 존중할 수 있습니다.

  • 지정한 숫자는 512k의 배수로 반올림되고 각 공간에 대해 최소 크기 인 512k이 적용됩니다 (불일치가 가장 먼저 나타나는 곳). 예 : Xmn1m을 Java 8과 함께 사용하여 NewSize1536k (분명히 이미 적용됨)이 MaxNewSize (1024k)을 초과했음을 알았습니다. (명백하게 적응되지 않은 것 같습니다.) Xmn1m은 모두 동일한 값으로 설정해야하기 때문에 혼란 스럽습니다. 둘 다 너무 작아서 더 이해할 수 있습니다. 또한 경고는 Xmn1m을 사용할 때만 나타났습니다. Xmn1024k은 반올림하지 않고 Xmn1023k 또는 Xmn1025k으로 표시되지 않았습니다.

  • JVM이 해당 옵션과 충돌하지 않기 때문에 적응은 항상 합리적인 값을 갖지만 통계를 인쇄하는 코드에는 버그가있는 것으로 보입니다 (Java 7에서만). 시도 된 구성 번호를 실제로 JVM에서 사용하는 숫자.

  • 젊은 세대에 대해보고 된 전체 크기는 항상 가 포함 크기 뒤에보고 된 주소에 일관성이 항상 비어 - 공간을 무시하고, 부스에서 및 을 에덴 포함 전체 스팬, 3 개의 공간 모두 포함.

+0

어떻게 든 관련 생각 : https://www.google.com/url?sa=t&source=web&rct=j&url=https://stackoverflow.com/questions/43798527/hotsot-jvm-options&ved=0ahUKEwiz4IyYqbLXAhUCCewKHYOnAokQjjgIIjAA&usg= AOvVaw0D3I5GbJFe9_6olMMqlaRK – Eugene

2

이 JDK의 7u40-B27과의 JDK 7u40-B28 사이에 도입 JVM 버그입니다.
버그 신고 JDK-8016309가 공개적으로 열려 있지 않습니다.

JDK 7u40 이전에는 힙 영역의 최소 크기가 512 단어 (4KB)였습니다.주어진 JVM 인수와 에덴 크기가 올바르게 512K로 설정 하였다

PSYoungGen  total 768K, used 287K [0x00000000fff00000, 0x0000000100000000, 0x0000000100000000) 
    eden space 512K, 56% used [0x00000000fff00000,0x00000000fff47e08,0x00000000fff80000) 
    from space 256K, 0% used [0x00000000fffc0000,0x00000000fffc0000,0x0000000100000000) 
    to space 256K, 0% used [0x00000000fff80000,0x00000000fff80000,0x00000000fffc0000) 

JDK-6725714

65536 개 단어 (512킬로바이트)에 최소 영역의 크기를 증가.
여기는 related change입니다. 동일한 변경으로 인해 크기 조정 정책이 변경되었습니다.
이것은 디버그 어설 션 오류 결과 JVM 빌드 :
# A fatal error has been detected by the Java Runtime Environment: 
# 
# Internal Error (/home/hotspot/src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp:183), pid=10261, tid=1081264448 
# assert(eden_size > 0 && survivor_size > 0) failed: just checking 
# 

빌드 제품에 더 어설 션 오류가 없었다, 오히려 이상한 행동 당신은 관찰했습니다.

이 문제는 JDK 8에서 발견되어 해결되었습니다. 젊은 세대의 가능한 최소 크기는 1536KB가되었습니다. 핫스팟/GC :

지역 : 나는 그것을 JDK 7u40 release notes에서 문제를 문서화하기로 결정하고, 버그가 7

그러나 JDK 이후 업데이트에 남아 있도록 수정, 백 포팅에 적합하지이었다고 생각한다
시놉시스 : 새로운 최소 세대 생성 크기가 이 JVM에 의해 올바르게 검사되지 않습니다. JDK의 7u40에서

는 병렬 가비지 콜렉터 신세대의 최소 크기는 64 비트 JVM에서 KB 32 비트 JVM, 에서 1536 768 KB 192 KB로 증가 하였다. 이 새로운 최소 크기가 올바르게 JVM에 의해 검사되지 않습니다. 젊은 세대 크기가 보다 작 으면 명령 줄에 새로운 최소값이 지정되어 이 충돌하거나 성능이 저하 될 수 있습니다.

젊은 생성 크기는 -XX : NewSize = 및 -XX : MaxNewSize = 옵션 또는 -Xmn 옵션으로 설정됩니다 (후자의 옵션은 NewSize 및 MaxNewSize를 모두 설정하는 것과 같습니다). 위의 옵션을 사용하지 않으면 젊은 생성 크기가 최대 힙 크기의 일부로 으로 계산됩니다.

해결 : ( 32 비트 JVM에 대한) 적어도 7백68킬로바이트 또는 1천5백36킬로바이트 (64 비트 JVM의 경우) 인 젊은 세대의 크기를 사용합니다.