限制 Vaadin 会话的内存消耗
Limit memory consumption of Vaadin session
在Vaadin Flow web apps, the state of the entire user-interface is maintained in the session on the web server, with automatic dynamic generation of the HTML/CSS/JavaScript needed to represent that UI remotely on the web browser client. Depending on the particular app, and the number of users, this can result in a significant amount of memory used on the web container.
是否可以限制会话和与其相关的请求可以使用的内存量?
例如,我想将每个用户会话限制为 1 MB。此限制应适用于处理请求时创建的任何对象。这可能吗?
理论上可能,但不实际。
据我所知,没有任何 JVM 会跟踪(比如说)线程分配的内存量。所以如果你想这样做,你会建立很多基础设施来做到这一点。这里有一些理论想法。
你可以使用字节码工程在每个new
之前注入一些代码来测量和记录分配的对象的大小。您需要 运行 在您的整个代码库中执行此操作...包括您应用程序使用的任何 Java SE 类 和第 3 方 类。
您可以修改JVM 来记录信息本身。例如,您可以修改 new
使用的内存分配器。
然而,这两者都需要大量的实施、调试和维护工作。两者都可能对性能产生重大影响。
我不清楚为什么您 需要 这个...作为一般的东西。如果您对特定类型的请求的内存使用有疑问,那么请求代码本身就可以更简单地监视请求数据结构的大小。当数据结构变得太大时,请求可能会自行“中止”。
正如正确的 所解释的那样,没有简单的自动方法来限制或管理 Java 中使用的内存。
鉴于 Vaadin Flow 网络应用程序的性质,服务器上可能会消耗大量内存用于包含每个用户用户界面的所有状态的用户会话。
减少代码库的内存使用量
第一步是检查您的代码库。
您是否拥有跨用户复制的数据,这些数据可以以线程安全的方式在用户之间共享?您是否缓存了不经常使用的数据,这些数据可以从其来源(数据库、Web 服务调用)再次检索?您是否缓存了当前不在屏幕上的 UI 部分,这些部分可以在以后需要时再次实例化?
更多内存
下一步是简单地向您的 Web 服务器添加更多内存。
购买 RAM 比支付程序员和系统管理员的时间要便宜得多。如此简单,只需放入更多内存即可。
多个网络服务器
下一步是横向扩展:使用多个网络服务器。
使用负载平衡器,您可以在服务器之间公平地分配用户负载。 “粘性”会话可用于将进一步的用户交互定向到同一服务器以继续会话。
当然,这种水平缩放的方法比较复杂。但这种做法在业界很普遍,而且很好理解。
Vaadin 融合
另一个编程步骤可能涉及重构应用程序以使用 Vaadin Fusion 构建应用程序的一部分。
与 Vaadin Flow 不同,您的应用程序是从服务器驱动的,Fusion 专注于浏览器中的 Web 组件 运行。不是用纯 Java 编写,而是用 TypeScript 编写,JavaScript 的超集。 Fusion 可以根据需要调用 Vaadin Flow 服务器以访问那里的数据和服务。
咨询
Vaadin Ltd 公司 sells consulting 提供服务,与其他公司一样,协助完成任何这些步骤。
会话序列化
请注意,如果不采取这些步骤,当 运行 内存不足时,一些 web containers 例如 Apache Tomcat 会将会话序列化到磁盘以暂时将它们从内存中清除。
如果人类用户仍然积极参与这些会话,这可能会导致性能不佳。但是更严重的问题是你整个session中的所有对象都必须是serializable。并且您必须为重新连接数据库连接等编写代码。如果支持此类序列化不可行,您可能可以关闭 Web 服务器的低内存序列化会话功能。但是当 运行 内存不足且没有可用的资源时,您的 Web 服务器将受到影响。
在Vaadin Flow web apps, the state of the entire user-interface is maintained in the session on the web server, with automatic dynamic generation of the HTML/CSS/JavaScript needed to represent that UI remotely on the web browser client. Depending on the particular app, and the number of users, this can result in a significant amount of memory used on the web container.
是否可以限制会话和与其相关的请求可以使用的内存量?
例如,我想将每个用户会话限制为 1 MB。此限制应适用于处理请求时创建的任何对象。这可能吗?
理论上可能,但不实际。
据我所知,没有任何 JVM 会跟踪(比如说)线程分配的内存量。所以如果你想这样做,你会建立很多基础设施来做到这一点。这里有一些理论想法。
你可以使用字节码工程在每个
new
之前注入一些代码来测量和记录分配的对象的大小。您需要 运行 在您的整个代码库中执行此操作...包括您应用程序使用的任何 Java SE 类 和第 3 方 类。您可以修改JVM 来记录信息本身。例如,您可以修改
new
使用的内存分配器。
然而,这两者都需要大量的实施、调试和维护工作。两者都可能对性能产生重大影响。
我不清楚为什么您 需要 这个...作为一般的东西。如果您对特定类型的请求的内存使用有疑问,那么请求代码本身就可以更简单地监视请求数据结构的大小。当数据结构变得太大时,请求可能会自行“中止”。
正如正确的
鉴于 Vaadin Flow 网络应用程序的性质,服务器上可能会消耗大量内存用于包含每个用户用户界面的所有状态的用户会话。
减少代码库的内存使用量
第一步是检查您的代码库。
您是否拥有跨用户复制的数据,这些数据可以以线程安全的方式在用户之间共享?您是否缓存了不经常使用的数据,这些数据可以从其来源(数据库、Web 服务调用)再次检索?您是否缓存了当前不在屏幕上的 UI 部分,这些部分可以在以后需要时再次实例化?
更多内存
下一步是简单地向您的 Web 服务器添加更多内存。
购买 RAM 比支付程序员和系统管理员的时间要便宜得多。如此简单,只需放入更多内存即可。
多个网络服务器
下一步是横向扩展:使用多个网络服务器。
使用负载平衡器,您可以在服务器之间公平地分配用户负载。 “粘性”会话可用于将进一步的用户交互定向到同一服务器以继续会话。
当然,这种水平缩放的方法比较复杂。但这种做法在业界很普遍,而且很好理解。
Vaadin 融合
另一个编程步骤可能涉及重构应用程序以使用 Vaadin Fusion 构建应用程序的一部分。
与 Vaadin Flow 不同,您的应用程序是从服务器驱动的,Fusion 专注于浏览器中的 Web 组件 运行。不是用纯 Java 编写,而是用 TypeScript 编写,JavaScript 的超集。 Fusion 可以根据需要调用 Vaadin Flow 服务器以访问那里的数据和服务。
咨询
Vaadin Ltd 公司 sells consulting 提供服务,与其他公司一样,协助完成任何这些步骤。
会话序列化
请注意,如果不采取这些步骤,当 运行 内存不足时,一些 web containers 例如 Apache Tomcat 会将会话序列化到磁盘以暂时将它们从内存中清除。
如果人类用户仍然积极参与这些会话,这可能会导致性能不佳。但是更严重的问题是你整个session中的所有对象都必须是serializable。并且您必须为重新连接数据库连接等编写代码。如果支持此类序列化不可行,您可能可以关闭 Web 服务器的低内存序列化会话功能。但是当 运行 内存不足且没有可用的资源时,您的 Web 服务器将受到影响。