0

我专注于

  • 通过足迹分析获得对 Java 应用程序的架构理解
  • 通过调整内存占用和优化 Java 集合和 Java 缓存使用来提高应用程序性能

为此,我在使用 WebSphere 应用程序服务器 v7 的 Java EE 应用程序上运行了负载测试并使用 Java 堆分析工具memoryanalyzer分析了 Java 堆转储快照。

我在问“软参考统计”和“弱参考统计”是否有助于实现我的目标,即:了解我们是否有问题或在应用程序 java 代码或应用服务器的配置。

建议找出如何弄清楚如何利用这些数据将不胜感激

软参考统计

总共找到了 11.416 个 java.lang.ref.SoftReference 对象,其中软引用了 393 个对象。总共 122,9 KB 的 2.414 个对象仅通过软引用保留(保持活动状态)。没有总计 0 B 的对象被软引用,并且还通过软引用强烈保留(保持活动状态)。

弱参考统计

一共找到了28.849个java.lang.ref.WeakReference对象,其中弱引用了11.663个对象。总共 7,4 MB 的 132.437 个对象仅通过弱引用保留(保持活动状态)。没有总计 0 B 的对象被弱引用,并且还通过弱引用强保留(保持活动状态)。

4

1 回答 1

1

第一条规则:永远不要使用软参考。那些补充说的人对他们的决定感到遗憾,因为他们没用并且使 GC 更昂贵。

弱引用是可以的。

问题是:如果您确实需要内存中的所有数据,那么尝试减少占用空间将导致额外的 CPU、网络或磁盘开销,因为您需要将数据存储在其他地方。

应用程序的堆有多大,您需要使其性能更好?当 GC 启动时,您能够接受的最大延迟是多少?您是否尝试过调整 GC?


编辑

为什么从不使用软引用。软引用不好,因为

  • 它们需要 2 个 GC 周期来收集。第一个 GC 循环标记它们,第二个实际收集内存。(这与 MarkSweep 收集器没有任何关系)
  • 它们被标记为在完整 GC 后收集。

如果你真的需要SoftReference中保存的数据,加载SF,full GC,再次加载SF,full GC将启动,这很糟糕。该应用程序可能不会因为 OOME 而崩溃,但它将接近无法使用。

弱引用更好,因为它们仅在“弱”可访问时清除,而不是在应用程序内存不足时清除。我所知道的使用弱引用的框架中最好的(也是唯一的)例子是Robotium(一个 android 测试框架)。

于 2012-10-10T18:12:32.690 回答