2012-05-04 2 views
1

JVM specification은 JVM 스택이 고정 크기이거나 동적으로 확장 될 수 있음을 나타냅니다.동적으로 확장 가능한 JVM 스택

-Xss JVM 옵션을 사용하면 고정 크기를 설정할 수 있습니다.이 옵션을 설정하지 않으면 기본값 (약 512-2048k)이 설정되지만 필요한 경우 JVM에 동적으로 스택을 할당하도록 지시 할 수 있습니까?

역동적 인 크기 옵션을 설정할 수 없다면 JVM의 각 스레드에 실제로 20MB의 메모리를 할당하거나 20MB로 제한되는 메모리를 동적으로 할당합니까?

답변

6

최대 스택 크기는 가상 주소 공간이 스택에 할당되는 양입니다. 메모리는 필요에 따라 스택에만 커밋됩니다.

32 비트 시스템에서 가상 주소 공간은 상대적으로 부족한 리소스입니다. 프로세스 당 4GB보다 적게 (때로는 , 많게는) 얻을 수 있습니다. 이를 염두에두고 20MB 스택을 사용하면 스레드 수를 75 ~ 175 사이로 제한 할 수 있습니다.

+0

주어진 스레드가 1024k가 넘는 스택을 사용하지 않는 경우 -Xss1024k 또는 -Xss1024m을 설정하면 정확히 동일한 성능을 얻을 수 있습니다. 짧은 제한은 버그가있는 재귀 코드의 보안 일뿐입니다? – A21z

+0

[HotSpot FAQ] (http://www.oracle.com/technetwork/java/hotspotfaq-138619.html) ("내 응용 프로그램에 많은 스레드가 있고 메모리가 부족합니다. Why? ") OutOfMemory를 바라 볼 때 더 많은 스레드를 실행할 수 있으려면 -Xss 값을 줄이는 것이 좋습니다. – A21z

+0

@ A21z'-Xss1m' 또는'-Xss1g'를 사용하면 64 비트 JVM에서 많은 효과를 볼 수 있습니다. 32 비트 JVM에서는 운영 체제에 따라 제한된 가상 주소 공간 (1.5 ~ 3.5GB)이 있습니다 (메모리 용량에 관계없이) –

1

동적 확장과 관련하여 사양이이를 지원할 수 있지만 구현이 그렇지 않을 수도 있습니다.

그래서 필요할 때 JVM에 스택을 동적으로 할당하도록 지시하는 방법은 무엇입니까?

너는 그러지 마라. 모든 설정을 기본값으로두고 스레드의 계산에 허용되는 것보다 큰 스택이 필요한 경우 Java 가상 머신은 StackOverflowError를 발생시킵니다.

이것은 새로운 스레드에 대한 메모리 할당을 명시 적으로 늘리려면 -Xss를 사용하는 단서입니다.

이것은 JVM 힙에 영향을주지 않습니다. [힙 크기 설정을위한 -Xmx -Xms 참조]

또한 20Mb는 스레드 당 약간 과도하게 보입니다.

모두 힙 크기와 지원하려는 동시 스레드 수에 따라 다릅니다.