java - 如何在java中调整缓存密集型应用程序?

标签 java caching garbage-collection ehcache distributed-computing

有人知道编写仅使用缓存作为存储的应用程序时正确的配置/开发方法吗?

为了提供一些背景知识,应用程序不需要存储任何信息(它实际上存储时间戳,但我稍后会解释),因为它只读取另一个应用程序写入的内容。我们有一个存储过程,它从该应用程序的数据库中读取数据并返回当时的信息。从应用程序启动的那一刻起,任何更新都会通过主题通知,以便不再需要数据库(直到下次重新启动)。

加载所有内容后,当消耗某些消息以循环遍历它们并单独处理它们时,必须读取缓存中的每条记录。应用程序保留一个锁对象映射,每个对象对应缓存中的每条记录,以避免竞争条件。如果记录满足特定条件,则会将时间戳写入缓存并使用最多 5000 条记录的后写方式写入数据库。

该应用程序已经开发出来,但我认为我们在 GC 方面存在一些问题。我们不断遇到峰值,我想知道是否有任何关于如何减少峰值的建议。

这些是我们迄今为止所做的事情:

  • 每个记录都有一个反复重复的字符串集合。我正在实习这些(我们使用的是 java 8)
  • 我们使用的缓存是EhCache。为了避免重新创建对象,直接使用缓存中的元素。
  • 除了执行某些日期检查所需的枚举值和 LocalDateTime 之外,每个变量都是长整型变量或字符串。
  • 有两个缓存。这是因为,一旦满足条件,就必须将时间戳复制到应用程序的另一个实例。为此,我们使用来自 EhCache 的 JMS 复制,该复制使用这些更新的主题。
  • 时间戳更新不会经常发生,因此可能产生的影响应该是最小的。
  • 目前的记录数量为 350000 条,每条记录都包含一堆字符串和长整型,以及前面提到的枚举和 LocalDateTime。
  • 我们遇到的一个随机问题是,有时它会抛出超出 GC 开销限制。通常,应用程序在几次 GC 后会不断降低其使用的内存量,但有时它似乎无法处理负载。
  • 该盒子为此配备了 3GB 内存,主要 GC 后的应用程序使用大约 500MB 的缓存。

除此之外,我不知道JVM是如何配置的,也不知道使用什么样的GC。有人可以建议我开始阅读任何想法或任何博客或文件吗?

谢谢!

最佳答案

当您运行 Java 8 时,您可以更改垃圾收集器。自 Java 7 的早期版本以来,所谓的“垃圾优先”GC 就作为一个选项存在。它的初期问题已得到解决,通常建议用于需要快速响应的交互式应用程序。

可以使用 -XX:+UseG1GC 启用它,并将成为 Java 9 上的默认设置。

欲了解更多信息,请访问 http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

关于java - 如何在java中调整缓存密集型应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33552897/

相关文章:

google-chrome - 在 Firefox 和 Chrome 浏览器中保留缓存 - Selenium WebDriver

javascript - PhoneGap 垃圾收集

javascript - 在javascript中将对象作为参数传递的性能

java - 如何检查 XML 节点是否是 Java 中的叶节点?

java - 将 JAXB 与签名、加密和编码结合使用

c# - LINQ to SQL 缓存问题

java - 装箱与创建 1 个元素的数组

java - 如何将Word转换为固定数字

java - 在 Eclipse 中执行 JVM 应用程序期间出现奇怪的输出 - 如何调试?

java - CouchbaseClient 如何获取存储桶中所有 DesignDocuments 的列表