如何解决限制 Vaadin 会话的内存消耗
在 Vaadin Flow 网络应用中,整个用户界面的状态在网络服务器上的 session 中维护,并自动动态生成表示该 UI 所需的 HTML/CSS/JavaScript远程在 Web 浏览器客户端上。根据特定的应用程序和用户数量,这可能会导致 web container 上使用大量内存。
是否可以限制会话和与之相关的请求可以使用的内存量?
例如,我想将每个用户会话限制为 1 兆字节。此限制应适用于处理请求时创建的任何对象。这可能吗?
解决方法
理论上可行,但不切实际。
据我所知,没有 JVM 会跟踪(比如说)线程分配的内存量。所以如果你想这样做,你会建立很多基础设施来做到这一点。以下是一些理论想法。
-
您可以使用字节码工程在每个
new
之前注入一些代码来测量和记录分配对象的大小。您需要在整个代码库中运行它……包括您的应用使用的任何 Java SE 类和第 3 方类。 -
您可以修改 JVM 以记录信息本身。例如,您可以修改
new
使用的内存分配器。
然而,这两者都需要大量的工作来实现、调试和维护。并且两者都可能对性能产生重大影响。
我不清楚为什么你会需要这个......作为一个普遍的事情。如果您对特定类型请求的内存使用有问题,那么请求代码本身可以更简单地记录请求数据结构的大小。当数据结构变得太大时,请求可能会自行“中止”。
,正如正确的 Answer by Stephen C 解释的那样,没有简单的自动方法来限制或管理 Java 中使用的内存。
鉴于 Vaadin Flow 网络应用程序的性质,服务器上可能会为包含每个用户用户界面所有状态的用户会话消耗大量内存。
减少代码库的内存使用
第一步是检查您的代码库。
您是否有跨用户复制的数据,而这些数据可以以线程安全的方式在用户之间共享?您是否有不经常使用的缓存数据,而这些数据可以从其源(数据库、Web 服务调用)中再次检索?您是否缓存当前不在屏幕上的 UI 部分,以便稍后在需要时再次实例化?
更多内存
下一步是简单地向您的网络服务器添加更多内存。
购买 RAM 比支付程序员和系统管理员的时间便宜得多。如此简单,只需放入更多内存库存即可。
多个网络服务器
之后的下一步是水平扩展:使用多个 Web 服务器。
使用负载平衡器,您可以在服务器之间公平地分配用户负载。 “粘性”会话可用于将进一步的用户交互定向到同一服务器以继续会话。
当然,这种水平缩放的方法更复杂。但这种方法在行业中很常见,并且很好理解。
Vaadin Fusion
另一个编程步骤可能涉及重构应用以使用 Vaadin Fusion 构建应用的一部分。
您的应用不像 Vaadin Flow 那样由服务器驱动,Fusion 专注于在浏览器中运行的 Web 组件。您不是用纯 Java 编写,而是用 TypeScript(JavaScript 的超集)编写。 Fusion 可以根据需要调用 Vaadin Flow 服务器以访问那里的数据和服务。
咨询
Vaadin Ltd 公司 sells consulting 与其他公司一样提供服务,以协助完成任何这些步骤。
会话序列化
请注意,如果不采取这些步骤,当内存不足时,某些 web containers(例如 Apache Tomcat)会将会话序列化到磁盘以暂时从内存中清除它们。
如果人类用户仍然积极参与这些会话,这可能会导致性能不佳。但更严重的问题是整个会话中的所有对象都必须是 serializable。并且您必须编写用于重新连接数据库连接等的代码。如果支持此类序列化不可行,您可能可以关闭 Web 服务器的这个 serialize-sessions-on-low-memory 功能。但是,当内存不足且没有可用的资源时,您的 Web 服务器将会受到影响。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。