【问题标题】:Java object taking too much space in Tomcat session (Legacy code)Java 对象在 Tomcat 会话中占用太多空间(遗留代码)
【发布时间】:2014-08-27 11:57:35
【问题描述】:

我正在维护一个在 Tomcat6 上运行的遗留 GUI 应用程序,在某些情况下,当用户登录时,该应用程序会将大量 java 对象加载到会话中,并且需要大量内存(高达 200MB)。 我安装了 psi-probe 来监控内存,它显示了这个:

当前内存使用率为 99.3%

免费:3.41 MB 总计:487.25 MB 最大:487.25 MB

我想避免触及对象本身的结构,因为它也是一个复杂的怪物,我可能会破坏一些东西。 我真的不知道我有什么选择。我正在考虑尝试对其进行序列化并将其作为文件写入驱动器上并按需访问它。

有什么想法吗?

干杯。

【问题讨论】:

  • 你检查过日志吗?
  • 您需要将加载推迟到实际需要时,并避免将其存储在用户会话中:例如,看看您是否可以将其设为请求范围。您必须找到它在会话中存储的位置以及从会话中获取它的位置,然后更改它们。并拍摄设计师和以前的实施者。
  • 是的,我想我现在会尝试这样做,并在需要时尝试加载它,然后再将其删除。这似乎是最好的。但整个事情非常复杂。
  • 嗯,经过测试,对象需要3.5s才能实例化。每当用户单击链接时,都无法做到这一点。

标签: java session tomcat memory tomcat6


【解决方案1】:

如果您不想将大对象加载到会话中, 您需要将占位符加载到会话中,然后使用占位符访问对象或对象中的数据。

一种技术是在数据库中创建一个或多个行,其中包含与大对象中相同的数据, 存储会话中行(或行)的键, 然后使用密钥访问数据。 这将避免使用大对象。

【讨论】:

  • 问题是对象中有很多很多嵌套的对象,这是一个非常复杂的结构。
  • 根据您对问题的描述,在我看来对象并不重要;对象中包含的数据是您关心的。
  • 是的,该对象是在登录时创建的,并存储了用户可能需要的 xml 文件中的所有数据。关键是从 xml 文件创建这个对象的过程非常复杂,许多开发人员都在研究它,每一个都增加了它的复杂性。我的第一个想法是尝试从 xml 文件中按需加载所需的精确数据,但这似乎非常困难,并且可能会产生副作用。
  • 您在 xml 文件中有数据。考虑将其加载到数据库中,然后从那里访问它。
  • xml 文件本身并不太复杂,应用程序所做的是读取它并从中构造许多非常复杂的对象,然后将它们全部放在我遇到问题的那个巨大的对象中。这些对象不能简单地存储在数据库中。除非您的意思是存储序列化的 java 对象。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
  • 2022-07-13
相关资源
最近更新 更多