Java:我怎样才能避免GC停止世界事件?

时间:2014-08-19 17:20:38

标签: java garbage-collection

假设我正在阅读单个传入流,每毫秒有数百万个事务,速度非常快,以至于我无法负担GC或整个系统都会挂起。

功能非常简单,它只是记录通过NIC卡的每一个数据包。 (假设的)

甚至可能吗? 这种实施有设计模式吗?我只知道flyweight和资源池设计模式。 我真的需要用C编码才能管理它吗​​?

1)我可以有合理数量的内存,但不像100gb(可能是16gb)那样荒谬吗? 2)CPU处理不是问题。

常见问题:

一定是Java吗?不,请推荐另一种可以支持大多数平台的语言。 (linux,aix,windows)

3 个答案:

答案 0 :(得分:1)

  1. 如果您真的想要处理通过网卡的所有内容。 Java是错误的语言。查看C可能是C ++或汇编程序。

  2. 正如您所知,每毫秒一百万笔交易似乎不切实际,只有当您能够在多台计算机之间拆分工作时(<多少台计算机

  3. )才能实现。
  4. 那里有很多垃圾收集器,如果有什么对你有益的话,去做一些搜索。

  5. 如果你真的不想让垃圾收集器加入,我认为你唯一的选择是:不要制造垃圾。初始化一个字节数组作为你的内存工作。只使用原语,没有对象。这将是繁琐的,但它可能很快,我被告知这是人们在实时系统上工作的那种东西。

答案 1 :(得分:1)

假设你的意思是每秒数百万次,而不是ms,你可以使用Chronicle,它承诺每秒最多5-20m的交易,持续存在。

答案 2 :(得分:0)

我希望每毫秒数百万的交易是一个笑话或夸张。没有一台计算机可以处理那么多,特别是如果仅仅100Gb算作可笑的RAM数量。

但忽略了预期交易的实际数量,此类任务所需的是real-time Java。只要你想坚持使用Java。

无论哪种方式,您可能首先需要一个实时操作系统,因为您的应用程序不会是计算机上唯一运行的应用程序,并且操作系统决定不给您的应用程序控制它需要它,你无能为力。

更新:如果您只想捕获网络流量,请不要重新发明轮子,请使用libpcap.。 AFAIK甚至还有Java包装器。