有人知道编写仅使用缓存作为存储的应用程序时正确的配置/开发方法吗?
为了提供一些背景知识,应用程序不需要存储任何信息(它实际上存储时间戳,但我稍后会解释),因为它只读取另一个应用程序写入的内容。我们有一个存储过程,它从该应用程序的数据库中读取数据并返回当时的信息。从应用程序启动的那一刻起,任何更新都会通过主题通知,以便不再需要数据库(直到下次重新启动)。
加载所有内容后,当消耗某些消息以循环遍历它们并单独处理它们时,必须读取缓存中的每条记录。应用程序保留一个锁对象映射,每个对象对应缓存中的每条记录,以避免竞争条件。如果记录满足特定条件,则会将时间戳写入缓存并使用最多 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/