如何在 java 中调整缓存密集型应用程序?
How to tweak cache intensive app in java?
有谁知道编写仅使用缓存作为存储的应用程序时正确的configuration/development方法吗?
为了提供一些背景信息,应用程序不需要存储任何信息(它实际上存储时间戳,但我稍后会解释)因为它只读取另一个应用程序写入的内容。我们有一个从该应用程序的数据库中读取的存储过程,returns 我们当时的信息。从应用程序启动的那一刻起,任何更新都会通过主题通知,因此不再需要数据库(直到下次重新启动)。
加载所有内容后,当某些消息被消耗以循环遍历它们并单独处理它们时,必须读取缓存中的每条记录。应用程序保留一个 Lock 对象映射,每个对象对应缓存中的每条记录,以避免竞争条件。如果记录满足特定条件,则会使用最多 5000 条记录的后写将时间戳写入缓存和数据库。
该应用程序已经开发,但我认为我们在 GC 方面遇到了一些问题。我们不断收到尖峰,我想知道是否有关于如何减少尖峰的建议。
这些是我们到目前为止所做的事情:
- 有一个字符串集合,对每条记录一遍又一遍地重复。我正在实习这些(我们正在使用 java 8)
- 我们使用的缓存是EhCache。为避免重新创建对象,直接使用缓存中的元素。
- 除了枚举值和执行某些日期检查所需的 LocalDateTime 之外,每个变量都是长整数或字符串。
- 有两个缓存。这是因为,一旦满足条件,就必须将时间戳复制到应用程序的另一个实例。为此,我们使用来自 EhCache 的 JMS 复制,它使用这些更新的主题。
- 时间戳更新并不经常发生,因此这可能产生的影响应该是最小的。
- 目前记录的数量是 350000,每一个都有一堆字符串和多头以及前面提到的枚举和 LocalDateTime。
- 我们遇到的一个随机问题是有时它会抛出
GC overhead limit exceeded
。通常情况下,应用程序会在某些 GC 之后不断降低它使用的内存量,但有时它似乎无法处理负载。
- 这个盒子有 3GB 的内存,主要 GC 之后的应用程序使用大约 500MB 的缓存。
除此之外,我不知道JVM是如何配置的,使用了什么样的GC。有人可以建议我开始阅读的任何想法或任何博客或文档吗?
谢谢!
因为你是 运行 Java 8 你可以改变垃圾收集器。所谓的 "Garbage First" GC 自 Java 7 的早期版本以来一直作为一个选项存在。它初期的问题已经解决,通常建议用于需要快速响应的交互式应用程序。
它可以通过使用 -XX:+UseG1GC
启用,并将成为 Java 9 上的默认设置。
在 http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
阅读更多相关信息
有谁知道编写仅使用缓存作为存储的应用程序时正确的configuration/development方法吗?
为了提供一些背景信息,应用程序不需要存储任何信息(它实际上存储时间戳,但我稍后会解释)因为它只读取另一个应用程序写入的内容。我们有一个从该应用程序的数据库中读取的存储过程,returns 我们当时的信息。从应用程序启动的那一刻起,任何更新都会通过主题通知,因此不再需要数据库(直到下次重新启动)。
加载所有内容后,当某些消息被消耗以循环遍历它们并单独处理它们时,必须读取缓存中的每条记录。应用程序保留一个 Lock 对象映射,每个对象对应缓存中的每条记录,以避免竞争条件。如果记录满足特定条件,则会使用最多 5000 条记录的后写将时间戳写入缓存和数据库。
该应用程序已经开发,但我认为我们在 GC 方面遇到了一些问题。我们不断收到尖峰,我想知道是否有关于如何减少尖峰的建议。
这些是我们到目前为止所做的事情:
- 有一个字符串集合,对每条记录一遍又一遍地重复。我正在实习这些(我们正在使用 java 8)
- 我们使用的缓存是EhCache。为避免重新创建对象,直接使用缓存中的元素。
- 除了枚举值和执行某些日期检查所需的 LocalDateTime 之外,每个变量都是长整数或字符串。
- 有两个缓存。这是因为,一旦满足条件,就必须将时间戳复制到应用程序的另一个实例。为此,我们使用来自 EhCache 的 JMS 复制,它使用这些更新的主题。
- 时间戳更新并不经常发生,因此这可能产生的影响应该是最小的。
- 目前记录的数量是 350000,每一个都有一堆字符串和多头以及前面提到的枚举和 LocalDateTime。
- 我们遇到的一个随机问题是有时它会抛出
GC overhead limit exceeded
。通常情况下,应用程序会在某些 GC 之后不断降低它使用的内存量,但有时它似乎无法处理负载。 - 这个盒子有 3GB 的内存,主要 GC 之后的应用程序使用大约 500MB 的缓存。
除此之外,我不知道JVM是如何配置的,使用了什么样的GC。有人可以建议我开始阅读的任何想法或任何博客或文档吗?
谢谢!
因为你是 运行 Java 8 你可以改变垃圾收集器。所谓的 "Garbage First" GC 自 Java 7 的早期版本以来一直作为一个选项存在。它初期的问题已经解决,通常建议用于需要快速响应的交互式应用程序。
它可以通过使用 -XX:+UseG1GC
启用,并将成为 Java 9 上的默认设置。
在 http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html
阅读更多相关信息