多个JVM与单个应用服务器

时间:2014-10-01 15:53:07

标签: java java-ee jvm appserver

我正在处理一个系统,该系统在每个客户的JVM中运行Java应用程序。我们现在有大约六个专用服务器,总共运行着近100个JVM,还有一些用于管理这些JVM的自定义脚本。此设置实际上显示了它的时代:管理许多JVM正在成为监控/管理的噩梦,我们一直在处理堆大小问题。我们希望转向更现代的方法,只需在每台物理计算机的单个应用服务器中运行一堆应用程序。但是,保持应用程序分离确实在隔离方面具有明显的优势(例如,内存不足错误仅影响一个客户)。每个客户的软件堆栈都有不同的内存要求。

我的问题:有没有办法在这里兼顾两个世界并在一个JVM(应用服务器)中运行多个应用程序并仍然保持一定程度的隔离?或者,这些天你需要管理一组应用程序的内存需求,这只是一个现代的事实吗?除了我在这里缺少的app服务器或Java EE容器(例如Wildfly或Spring)之外,还有其他解决方案吗?看起来这个系统是另一个时代的坚持!

4 个答案:

答案 0 :(得分:8)

结帐'多租户' JVM' S。

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已经发布,但甲骨文没有关于多租户的消息。 现在看来他们更喜欢拥有多个JVM,甚至是多个容器(例如docker)。

答案 1 :(得分:5)

两种方法都有利弊:

共享JVM

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

分离JVM

  • 来自'贪婪'或'漏水'应用程序的绝缘。
  • 提高恶意代码的安全性。
  • 更容易更新,更新一个应用而不会降低另一个应用。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

拥有多个JVM而不是一个JVM的另一个重要原因是面对numa组。您不能像使用多个jvm进程一样在一个适合于numa组的JVM中分发线程。至少我从未找到过这样做的方法。

我们这里有两个cpu的机器,每个都有18个核心。这给了两个numa组,如果只使用一个JVM,我们就不能强制34个线程在两个cpu上传播。这显然是因为它假定同一个JVM进程的所有线程都需要快速访问同一个内存,而不是这种情况。

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

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