자바 - Java-Xmx, 시스템의 최대 메모리




자바 배열 메모리 구조 (5)

-XmX의 한계는 32 비트 창에서 -Xmx1500m입니다. 공유 라이브러리는 더 큰 힙을 사용합니다. 이 작업을 수행하려면 약 2GB의 RAM이 필요합니다.

비 Windows 운영 체제에서는 더 커질 수 있고 64Bit JVM은 훨씬 더 많이 가능합니다.

Windows XP는 RAM의 3Gb 이상을 허용하지 않습니다 (XP SP3 이후 4Gb 물리적 인 경우 상관하지 않음). Vista는 YMMV와 다를 수 있습니다.

나는 64 비트 리눅스에서 64 비트 JVM에서 -Xmx4000M을 시도했지만 괜찮았다. 6Gb의 물리적 인 RAM을 가지고 있다고 생각하면 커다란 요청이 아니 었습니다.

귀하의 80 % 아이디어는 흥미 롭지 만, 제 테스트 시스템은 나쁜 영향을 미치지 않는 것보다 더 높은 비율로 실행됩니다. (당신이 다른 일을 시도하지 않는 한.)

그리고 다른 주석 기자가 맞습니다. JVM의 메모리 내 이미지를 페이징하는 것이 빠르지 않습니다. 나중에 JVM은 덜 복잡하게 처리하는 것이 더 좋습니다 (하지만 더 나은 가비지 컬렉터도 있습니다).

메모리 사용량을 줄일 수 없다면 - 그리고 얼마나 어려운지 알게 될 것입니다 - 그런 다음 많은 양의 숫양을 가지고 그것의 대부분을 할당하십시오.

https://code.i-harness.com

내 Java 응용 프로그램은 "java -jar j.jar"프로세스를 실행하여 다른 Java 응용 프로그램을 실행합니다. J.jar는 주어진 데이터 세트에 따라 많은 메모리를 사용하는 것으로 알려져 있으며 종종 OutOfMemoryError 힙을 가져옵니다. 그래서 -Xmx를 사용하여 최대한 많은 메모리를 할당 할 수 있습니다. 나는 시스템에서 총 메모리를 얻고 -Xmx에서 80-90 %를 지정하려고 생각했습니다.

내 문제에 대한 해결책이 있습니까? 그리고 내 솔루션 사운드는 어떻게됩니까?

편집 : 사용중인 메모리가 JAR 파일을 압축하는 데 사용하는 Java의 내장 pack200 압축에 의해 메모리 사용량을 줄일 수 없습니다.


OS에 따라 여유 공간이 있고 사용 가능한 메모리 크기를 얻는 데 적합합니다.

java.lang.management.OperatingSystemMXBean mxbean = java.lang.management.ManagementFactory.getOperatingSystemMXBean();
com.sun.management.OperatingSystemMXBean sunmxbean = (com.sun.management.OperatingSystemMXBean) mxbean;
long freeMemory = sunmxbean.getFreePhysicalMemorySize();
long availableMemory = sunmxbean.getTotalPhysicalMemorySize();

거기에서 80-90 %를 알아 내고 원하는 최대 메모리 크기로 병을 시작할 수 있습니다.

나는 이것이 모든 OS (예 : Windows)에서 작동하는지 모르지만 OSX와 Linux 모두에서이를 테스트했을 때 작동했습니다.


아직 수행하지 않은 경우 메모리 프로파일 러를 통해 프로그램을 실행해야합니다. 특정 데이터 구조는 더 이상 사용되지 않더라도 처리되지 않을 수 있습니다.

JProfiler는 꽤 멋지지만 Java 5에서 소개 된 HPROF를 사용하여 동일한 정보를 얻을 수 있습니다. http://java.sun.com/developer/technicalArticles/Programming/HPROF.html

아키텍처마다 (32 비트 대 64 비트), OS 및 JVM을 기반으로하는 다른 플랫폼의 최대 힙 크기가 다릅니다.

XML 파일에서 읽는 문자열과 같이 재사용 할 수있는 값이 많은 경우 개체를 풀링하여 메모리 요구량을 크게 줄일 수 있습니다.


음, 내가 말할 수있는 한 가지는 앱이 램을 채우는 데 가까이 가지 못하게하는 것입니다. Java 응용 프로그램은 정상적으로 교환되지 않습니다. 내 생각에 가비지 수집, 자바 스왑에서 지속적으로 메모리를 당긴다 생각합니다.

나는 시스템이 GC를 일으키고 스왑 파일에서 물건을 꺼내는 메모리를 자바에 요청하고 있다고 생각하는 교착 상태에 빠졌습니다.이 시점에서 시스템은 리셋 할 때까지 회전 할 것입니다.

이것은 많은 양의 RAM과 스왑 공간 (많은 경우)과 오래된 Java VM을 사용했기 때문에 마일리지가 다를 수 있습니다.

또한 다른 앱을 시작하는 방법에 따라 다른 앱 대신 앱에 -Xms를 지정해야 할 수도 있습니다. 전체 명령을 내리면 -Xms를 주면됩니다. 그러나 항아리에서 기본 클래스를 호출하는 경우 앱에 -Xms가 필요합니다. (오, 당신이 지정했는데, 당신은 당신이 호출하는 "자바"명령에 그것을 전달해야합니다.)






memory-management