2017-11-22 13 views
2

Java 메모리 사용에 문제가 있습니다.총 메모리 제한에 대해 정상적으로 Java를 알려주는 방법은 무엇입니까?

Java에 다음과 같이 말하고 싶습니다. "8GB의 메모리가 있습니다. 사용하십시오. 정말로이 메모리 풀에 모든 리소스를 넣을 수없는 경우에만 실패합니다. OOM ".

-Xmx와 같은 기본 매개 변수가 있습니다. 힙만을 제한합니다. 다른 매개 변수도 많이 있습니다. 이 매개 변수의 문제점은 다음과 같습니다.

  • 관련이 없습니다. 나는 힙 크기를 6GB로 제한하고 싶지 않으며 네이티브 메모리가 2GB 이상을 차지하지 않을 것이라고 믿는다. 모든 메모리 (힙, 네이티브, 무엇이든)를 제한하고 싶습니다. 그리고 "-Xmx1GB"라고 말하는 것만이 아니라 안전을 위해서 효과적으로 그렇게하십시오.

  • 메모리와 관련된 매개 변수가 너무 많아서 목표를 달성하기 위해 모든 구성 방법을 모르겠습니다.

그래서 저는 힙, 퍼머 및 기타 메모리 유형에 신경 쓰고 싶지 않습니다. 내 높은 수준의 기대는 : 8GB 만 있고 정적 메모리가 필요하기 때문에 - 8GB에서 정적 메모리를 가져 와서 다른 동적 메모리 엔티티간에 남아있는 메모리를 조심스럽게 분리하십시오.

또한 ulimit 및 유사한 항목이 작동하지 않습니다. 일단 예상보다 많은 메모리를 소비하면 Java 프로세스를 중단하고 싶지 않습니다. Java가 한계에 도달하지 못하도록 최선을 다하고 싶습니다. Java가 프로세스를 죽일 수없는 경우에만 가능합니다.

그리고 저는 100 개의 자바 매개 변수도 정의 할 수 있습니다. 이유는 무엇입니까? :) 그런데 필요한 매개 변수의 전체 목록 (예를 들어, Java 8)에 대한 지원이 필요합니다.

+0

https://stackoverflow.com/questions/3513903/how-to-calculate-and- total-memory-space-allowed-for-java-process를 지정 하시겠습니까? –

답변

0

AFAIK,이를 수행 할 매개 변수 집합 또는 java 명령 줄 매개 변수가 없습니다.

최상의 힙 (IMO)은 최대 힙 크기와 최대 메타 공간 크기를 설정하는 것입니다. 으로 여러분의 응용 프로그램에 대해 매우 정적/예측 가능하게 될 것입니다. (., 메모리 등등 파일, 스택을 매핑 그것은 JVM 바이너리의 크기를 포함하지 않으며 아마 네이티브 라이브러리를 포함하지 않습니다)

을 코멘트에서 당신은 말했다 :

그래서 안전하지 않은 상당한 양의 메모리가 필요했습니다.

여기 당신이 잘못 생각하고 있다고 생각합니다. 주소 공간 또는 스왑 공간 제한으로 인해 제한을받지 않는다고 가정하면 메모리는 사용되지 않습니다. 메모리는 중요하지 않습니다.

주소 공간의 페이지가 사용되지 않으면 OS는 (장기적으로)이를 스왑하고 실제 RAM 페이지를 다른 것으로 보냅니다.

힙의 페이지는 일반적인 Java 응용 프로그램에서 그러한 상황에 있지 않습니다. (주소 공간 페이지는 GC가 "공간"안의 객체들을 이동함에 따라 사용중과 사용 가능 사이를 순환합니다.)

그러나 플립 측은 GC 이 필요하고 전체 힙 크기가 실제 개체의 합계보다 훨씬 커야합니다. 너무 많은 힙이 도달 가능한 객체로 가득 차면 가비지 콜렉션 실행 간격이 줄어들고 GC 인체 공학이 저하됩니다. 최악의 경우, JVM은 GC에서 소비되는 시간이 100 %가되기 때문에 중단 될 수 있습니다. 추한. GC 오버 헤드 제한 메카니즘은 이것을 막아 주지만 JVM이 OOME을 더 빨리 가져온다는 것을 의미합니다.

일반적인 힙 경우에는 GC가 효율적으로 작동 할 수 있도록 메모리의 일부분을 "사용되지 않음"으로 유지해야한다는 것이 더 좋은 방법입니다.

+0

안녕하세요. 그러한 확인을 해 주셔서 감사합니다. 저는 신중하게기도하고기도하려고 노력할 것입니다. :) – Ilya

0

-XX:MetaspaceSize을 사용해 보셨습니까?
이것이 필요한가요?

,이 글을 읽어 보시기 바랍니다 :이 자바 만 유효 함을 http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/

염두에 두어야을 8

+0

안녕하세요. 그래, 내가 했어. 이미 말했듯이 -XX : -Xmx와 함께 MetaspaceSize는 동적 메모리 할당을 제한합니다 (또는 적어도 100 % 확신 할 수 없기 때문에 적어도 그렇게하기를 바랍니다). 하지만 그 일은 정적 인 부분을 올바르게 예측할 수 없다는 것입니다. 따라서 나는 안전하지 않은 상당한 양의 메모리를 사용해야합니다. 또한 솔직히 힙의 일부 메모리가 메타 데이터에 사용되는지 또는 그 반대인지에 상관하지 않기 때문에이 두 제한 사항은 매우 어리 석다. – Ilya