限制 Vaadin 会话的内存消耗

如何解决限制 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res