20

我正在处理一个系统,它在自己的 JVM 中为每个客户运行一个 Java 应用程序。我们现在有大约六台专用服务器,总共运行近 100 个 JVM,以及用于管理这些 JVM 的自定义脚本集。这种设置在这一点上确实显示了它的时代:管理这么多 JVM 正在成为监控/管理的噩梦,我们一直在处理堆大小问题。我们希望采用更现代的方法,只在每台物理机器的单个应用服务器中运行一堆应用程序。但是,将应用程序分开在隔离方面确实具有明显的优势(例如,内存不足错误仅影响一位客户)。每个客户的软件堆栈的内存需求差异很大。

我的问题:有没有一种方法可以两全其美,在一个 JVM(应用服务器)中运行多个应用程序,并且仍然保持一定程度的隔离?或者,如今您需要管理一组应用程序的内存需求只是现代生活中的一个事实?除了我在这里缺少的应用程序服务器或 Java EE 容器(例如 Wildfly 或 Spring)之外,这里还有其他解决方案吗?这个系统似乎是另一个时代的产物!

4

4 回答 4

9

签出“多租户”JVM。

IBM 的 JRE 已经有了它:http: //www.ibm.com/developerworks/library/j-multitenant-java/

Waratek 在 Oracle JRE 之上实现了它,他们创建了 ElastiCat,这是一个 Tomcat 分支,可将不同应用程序隔离在同一容器中:http ://www.elasticat.com/faq/

据传多租户也出现在官方的 Oracle Java 9 JVM 中。

==================================================== =====

更新:Java 9 已经发布,但 Oracle 没有关于多租户的消息。似乎他们现在更喜欢拥有多个 JVM,甚至是多个容器(例如 docker)。

于 2014-10-01T21:41:17.880 回答
6

两种方法各有利弊:

共享 JVM

  • 更低的开销 - JVM 内存占用(核心库等)只需要加载一次。
  • 更好的内存使用。Java 进程将消耗操作系统内存来获取当前可能未使用的堆空间。

独立的JVM

  • 与“贪婪”或“泄漏”应用程序绝缘。
  • 从恶意代码中获得更好的安全性。
  • 更轻松的更新,更新一个应用程序而不会关闭另一个应用程序。

总的来说,我不会制定一揽子政策。寻找小型/微服务或其他低使用率的应用程序,这些应用程序可能是首先分享并从那里扩展的良好候选者。

于 2014-10-01T16:10:24.390 回答
1

查看Spring BootFabric8,了解以可管理方式运行 Java 的现代方法

于 2014-10-02T08:25:27.253 回答
1

拥有多个 JVM 而不是一个的另一个重要原因是面对 numa 组时。您不能像使用多个 jvm 进程那样将线程分布在适当的 numa 组上的一个 JVM 中。至少我从来没有找到这样做的方法。

我们这里有两个 cpu 的机器,每个都有 18 个内核,这提供了两个 numa 组,如果只使用一个 JVM,我们不能强制在两个 cpu 上分布 34 个线程。这显然是因为它假设同一个 JVM 进程的所有线程都需要快速访问同一个内存,但事实并非如此。

拥有 34 个进程,系统假设它们不需要共享内存,因此将它们分布在两个 cpu 上。

如果有人知道这样做的更好方法,我会很高兴听到它。

于 2017-06-06T16:19:33.487 回答