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

时间:2015-11-05 19:13:25

标签: java caching garbage-collection ehcache distributed-computing

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

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

一旦加载了所有内容,当消耗某些消息时,必须读取缓存中的每个记录以循环遍历它们。应用程序保留一个Lock of Lock对象,每个对象用于缓存中的每个记录,以避免竞争条件。如果记录符合某些条件,则使用最多5000条记录的后写,将时间戳写入缓存和数据库。

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

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

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

除此之外,我不知道如何配置JVM或GC使用何种类型。有人建议我开始阅读的任何想法或任何博客或文件?

谢谢!

1 个答案:

答案 0 :(得分:1)

当您运行Java 8时,您可以更改垃圾收集器。所谓的" Garbage First"从早期版本的Java 7开始,GC一直作为一种选择。从婴儿期开始的问题已经解决,并且通常建议用于需要快速响应的交互式应用程序。

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

http://www.oracle.com/technetwork/tutorials/tutorials-1876574.html

了解详情