HTML5服务器内存使用情况
Terminal Service Plus HTML5 服务器运行在 JAVA 上。理解 JAVA 如何处理内存有助于理解 Terminal Service Plus HTML5 服务器的内存使用。
分配的内存
当Java运行时,它尝试分配计算机物理内存的25%。这部分内存是“分配的”,但并未直接使用 - 它不是在Windows任务管理器中可以看到的实际内存使用情况。
JAVA平台:32位与64位
这两个平台之间有一个很大的区别:
- JAVA 32位根据定义无法处理超过4GB的RAM。由于它将分配25%的所有可用内存,因此在假设有4GB物理内存的情况下,最多将分配1GB。如果只有2GB物理内存,它将仅分配500MB,等等。
- JAVA 64位可以处理超过4GB的更多内容(理论上可达16GB) exa 字节,因此分配的内存将仅取决于物理内存。
JAVA内存管理
JAVA 是一个“虚拟机”。这意味着 JAVA 自行处理内存管理。一旦 JAVA 分配了一些内存,即使它不再需要这些内存,它也不会自动将其返还给系统。这是出于性能原因,因为内存分配和释放是 CPU 密集型任务。
JAVA 通常会等到它有一大块未使用的内存后才会将其返还给系统。这一大块的大小直接取决于计算机物理内存的大小。计算机的物理内存越多,JAVA 分配的内存就越多。
TSplus HTML5 服务器内存使用情况
所有这些技术细节都是为什么人们可以打开 Windows 任务管理器并认为 Terminal Service Plus HTML5 服务器使用了大量内存,或者认为 JAVA 32 位使用的内存少于 JAVA 64 位的原因。
实际上,Terminal Service Plus HTML5 服务器实际使用的内存与打开的 HTML5 会话数量直接相关。计算机上可用的内存越多,您可以打开的 HTML5 会话就越多。
HTML5会话内存使用情况
HTML5会话使用的内存取决于用户活动(使用的应用程序和程序,Word/Excel与绘图密集型程序)以及在Terminal Service Plus HTML5服务器与客户端计算机之间建立的连接方式。
在一般使用情况下,HTML5 会话将使用 30 MB 的内存(标准使用,二进制 websockets 连接)。在最坏的情况下,会话将使用高达 100 MB 的内存(密集使用,“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堆被放置在前32 GB的地址空间中。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
-
通过AdminTool GUI重新启动HTML5服务器以应用更改。
但在此之前,请确保 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