HTML5 서버 메모리 사용량
Terminal Service Plus HTML5 Server는 JAVA에서 실행됩니다. JAVA가 메모리를 처리하는 방식을 이해하면 Terminal Service Plus HTML5 Server의 메모리 사용을 이해하는 데 도움이 됩니다.
할당된 메모리
Java가 실행될 때, 컴퓨터의 물리적 메모리의 25%를 할당하려고 합니다. 이 메모리는 "할당"되지만 직접 사용되지는 않으며, Windows 작업 관리자에서 볼 수 있는 실제 메모리 사용량은 아닙니다.
JAVA 플랫폼: 32비트 vs 64비트
이 두 플랫폼 간에는 큰 차이점이 하나 있습니다:
- JAVA 32비트는 정의상 4GB 이상의 RAM을 처리할 수 없습니다. 사용 가능한 모든 메모리의 25%를 할당하므로, 4GB의 물리적 메모리가 있다고 가정할 때 최대 1GB를 할당합니다. 물리적 메모리가 2GB만 있는 경우에는 500MB만 할당합니다.
- JAVA 64비트는 4GB보다 훨씬 더 많은 용량을 처리할 수 있습니다(이론적으로 최대 16GB까지). 엑사 바이트이므로 할당된 메모리는 물리적 메모리에만 의존하게 됩니다.
JAVA 메모리 관리
JAVA는 "가상 머신"입니다. 이는 JAVA가 메모리 관리를 스스로 처리한다는 것을 의미합니다. JAVA가 일부 메모리를 할당하면, 더 이상 필요하지 않더라도 시스템에 자동으로 반환하지 않습니다. 이는 성능상의 이유로, 메모리 할당 및 해제는 CPU 집약적인 작업이기 때문입니다.
JAVA는 일반적으로 시스템에 반환하기 전에 사용되지 않는 메모리의 큰 덩어리를 기다립니다. 이 큰 덩어리의 크기는 컴퓨터 물리적 메모리의 크기에 직접적으로 의존합니다. 컴퓨터의 물리적 메모리가 많을수록 JAVA에 의해 할당되는 메모리도 많아집니다.
터미널 서비스 플러스 HTML5 서버 메모리 사용량
이 모든 기술적 세부사항은 사용자가 Windows 작업 관리자를 열고 Terminal Service Plus HTML5 Server가 많은 메모리를 사용한다고 생각하거나 JAVA 32비트가 JAVA 64비트보다 적은 메모리를 사용한다고 생각하는 이유입니다.
실제로 Terminal Service Plus HTML5 Server에서 실제로 사용되는 메모리는 열려 있는 HTML5 세션의 수와 직접적으로 관련이 있습니다. 컴퓨터의 사용 가능한 메모리가 많을수록 더 많은 HTML5 세션을 열 수 있습니다.
HTML5 세션 메모리 사용량
HTML5 세션에서 사용되는 메모리는 사용자 활동(사용된 애플리케이션 및 프로그램, 워드/엑셀 대 드로잉 집약적인 프로그램)과 Terminal Service Plus HTML5 서버와 클라이언트 컴퓨터 간에 설정된 연결 방법에 따라 달라집니다.
일반적인 사용 사례에서 HTML5 세션은 30MB의 메모리를 사용합니다(표준 사용, 이진 웹소켓 연결). 최악의 경우, 세션은 최대 100MB의 메모리를 사용할 수 있습니다(집중 사용, 구형 브라우저를 위한 "XHR" 폴백 연결).
HTTP 및 HTTPS 서버 수신 손실
각 Java 오류 로그는 작동을 위한 충분한 네이티브 메모리를 나타냅니다.
문제는 사실 꽤 간단합니다.
HTML5 세션이 시작되면 보고된 값에 따라 충분한 메모리가 있습니다.
그런 다음 RDP 세션 내에서 알 수 없는 프로그램을 시작하고 모든 기본 메모리를 자신을 위해 훔칩니다.
Java가 다시 요청할 때 갑자기 더 이상 사용할 수 없게 되어 이 메모리 부족 오류가 발생합니다.
- Java 실행 환경이 계속 실행될 수 있도록 메모리가 부족합니다.
- 네이티브 메모리 할당(mmap)이 234881024 바이트를 매핑하는 데 실패했습니다. 오류 세부정보: 가상 공간 G1# 가능한 이유:
- 시스템에 물리적 RAM 또는 스왑 공간이 부족합니다. 이 프로세스는 압축된 Oops가 활성화된 상태로 실행되고 있으며, Java 힙이 네이티브 힙의 성장을 차단할 수 있습니다.
가능한 솔루션:
- 시스템의 메모리 부하를 줄이십시오.
- 물리적 메모리 또는 스왑 공간 증가# 스왑 지원 저장소가 가득 찼는지 확인하십시오.
- Java 힙 크기 줄이기 (-Xmx/-Xms)
- Java 스레드 수 감소 # Java 스레드 스택 크기 감소 (-Xss)
- -XX:ReservedCodeCacheSize=의 더 큰 코드 캐시를 설정합니다.
JVM은 제로 기반 압축 Oops 모드에서 실행되고 있으며, 이 모드에서는 Java 힙이 처음 32GB 주소 공간에 배치됩니다. Java 힙의 기본 주소는 네이티브 힙 성장의 최대 한계입니다.
사용해 주세요
-XX:HeapBaseMinAddress
잠재적으로, 처음부터 Java에 더 많은 네이티브 메모리를 할당하고 시스템에 메모리를 반환하지 않도록 강제하여 자신에게 할당할 수 있습니다.
그러나 이 경우 RDP 세션에서 실행 중인 프로그램이 메모리가 부족해질 수 있으며, 전체 시스템이 중단될 수 있습니다.
하지만 여전히 시도해 볼 수 있습니다.
-
다음 파일을 메모장으로 열고 수정하십시오: *\Clients\webserver\runwebserver.ini
-
거기에서 다음과 같은 명령줄 설정을 찾을 수 있습니다.
-Djdk.tls.ephemeralDHKeySize=matched -Djdk.tls.rejectClientInitiatedRenegotiation=true -Dorg.jboss.netty.epollBugWorkaround=true -XX:+UseG1GC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=10 ************and so on
- runwebserver.ini 파일의 전체 줄을 제거하고 그 자리에 다음을 추가하십시오:
-server -javaagent:"%~dp0httpwebs.jar" -Djdk.tls.ephemeralDHKeySize=matched -Djdk.tls.rejectClientInitiatedRenegotiation=true -Dorg.jboss.netty.epollBugContourn=true --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/sun.security.ssl=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.prefs/java.util.prefs=ALL-UNNAMED ---add-exports java.base/java.lang.reflect=ALL-UNNAMED --add-exports java.base/sun.security.ssl=ALL-UNNAMED --add-exports java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.base/java.nio=ALL-UNNAMED
-
HTML5 서버를 AdminTool GUI를 통해 재시작하여 변경 사항을 적용하십시오.
하지만 그렇게 하기 전에 web server\runwebserver.bat 파일의 속성에 읽기 전용 속성이 설정되어 있지 않은지 확인하십시오. 그렇지 않으면 AdminTool GUI가 재시작 후 runwebserver.bat를 조정할 수 없습니다.
대부분의 경우, 이것으로 충분해야 합니다. Java가 메모리를 사용하면 시스템에 반환하는 대신 다른 용도로 할당합니다. 따라서 html5service.exe의 메모리 사용량은 시스템의 사용 가능한 메모리의 70%에 이를 수 있습니다. 이 경우, Java는 충돌을 멈춰야 합니다. 그러나 다른 프로그램이 많은 메모리를 소비하고 있다면 대신 충돌할 수 있습니다. 그런 경우, 우리는 무력합니다; Java HTML 서버와 다른 프로그램을 실행할 수 있는 충분한 메모리가 있는지 확인해야 합니다.
Java에는 -XX:+AggressiveHeap이라는 옵션이 있어 Java 가상 머신 자체의 메모리 할당을 개선할 수 있으며, 따라서 *\webserver\runwebserver.ini의 최종 내용에 영향을 줄 수 있습니다.
이것은 다음과 같이 보일 수 있습니다:
-XX:+AggressiveHeap -server -javaagent:"%~dp0httpwebs.jar" -Djdk.tls.ephemeralDHKeySize=matched -Djdk.tls.rejectClientInitiatedRenegotiation=true -Dorg.jboss.netty.epollBugWorkaround=true --add-opens java.prefs/java.util.prefs=ALL-UNNAMED --add-opens java.base/java.lang.reflect=ALL-UNNAMED --add-opens java.base/sun.security.ssl=ALL-UNNAMED --add-opens java.base/java.nio=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-exports java.prefs/ java.util.prefs=ALL-UNNAMED --add-exports java.base/java.lang.reflect=ALL-UNNAMED --add