限制Vaadin会话的内存消耗



在Vaadin Flow web应用程序中,整个用户界面的状态在web服务器的会话中维护,并自动动态生成在web浏览器客户端上远程表示该UI所需的HTML/CSS/JavaScript。根据特定的应用程序和用户数量,这可能会导致在web容器上使用大量内存。

是否有可能限制会话和与其相关的请求可以使用的内存量?

例如,我想将每个用户会话限制为1兆字节。此限制应适用于处理请求时创建的任何对象。这可能吗?

理论上是可能的,但不实际。

据我所知,没有JVM跟踪(比如说)线程分配的内存量。所以如果你想这么做,你会建立很多基础设施。这里有几个理论的想法。

  • 您可以使用字节码工程在每个new之前注入一些代码来测量和记录分配对象的大小。你需要在整个代码库中运行它。包括应用程序使用的任何Java SE类和第三方类。

  • 您可以修改JVM以记录信息本身。例如,您可以修改new使用的内存分配器。

然而,这两种方法都需要大量的工作来实现、调试和维护。两者都可能对性能产生重大影响。


我不清楚为什么你会需要这个…一般来说。如果您对特定类型的请求的内存使用有问题,那么请求代码本身监视请求数据结构的大小会更简单。当数据结构变得太大时,请求可能会"中止"。本身。

正如Stephen C的正确答案所解释的那样,没有简单的自动方法来限制或管理Java中使用的内存。

考虑到Vaadin Flow web应用程序的性质,包含每个用户用户界面的所有状态的用户会话可能会在服务器上消耗大量内存。

减少代码库的内存使用

第一步是检查代码库。

您是否有跨用户复制的数据,而这些数据可以以线程安全的方式在用户之间共享?您是否有不经常使用的缓存数据,可以从其源(数据库、web服务调用)再次检索?是否缓存当前不在屏幕上的UI部分,以便在需要时再次实例化?

<标题>更多RAM h1> 一步是简单地添加更多的内存到您的web服务器。

购买RAM比支付程序员和系统管理员的时间要便宜得多。这很简单,只要增加内存就可以了。

多个web服务器

下一步是水平扩展:使用多个web服务器。

使用负载均衡器,您可以在服务器之间公平地分配用户负载。"粘性"会话可用于将进一步的用户交互引导到同一服务器以继续会话。

当然,这种水平缩放方法更复杂。但这种方法在业内是很常见的,而且很容易理解。

Vaadin融合

另一个编程步骤可能涉及重构应用程序,使用Vaadin Fusion构建应用程序的部分。

不像Vaadin Flow那样由服务器驱动应用程序,Fusion专注于在浏览器中运行的web组件。你不用纯Java编写,而是用JavaScript的超集TypeScript编写。Fusion可以根据需要调用Vaadin Flow服务器来访问那里的数据和服务。

<标题>

咨询Vaadin有限公司出售咨询服务,就像其他公司一样,帮助你完成这些步骤。

<标题>会话序列化h1> 注意,如果不采取这些步骤,当内存不足时,一些web容器(如Apache Tomcat)会将会话序列化到磁盘,以便暂时从内存中清除会话。

如果人类用户仍然积极地参与这些会话,这可能导致性能不佳。但更严重的问题是,整个会话中的所有对象都必须是可序列化的。您还必须编写用于重新连接数据库连接的代码,等等。如果支持这种序列化是不可行的,您可以关闭web服务器的低内存上的序列化会话特性。但是,当你的web服务器内存耗尽时,没有这样的资源可用,你的web服务器就会受到影响。

最新更新