Java 多JVM与单个应用服务器

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

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


我的问题是:有没有一种方法可以在一个JVM(应用服务器)中运行多个应用程序,同时保持一定程度的隔离?或者,您现在需要管理一组应用程序的内存需求,这只是现代生活中的一个事实吗?除了appserver或javaee容器(例如Wildfly或Spring)之外,这里还有其他解决方案吗?看来这个系统是另一个时代的顽固分子

两种方法各有利弊:

共享JVM

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

  • 隔离“贪婪”或“泄漏”应用
  • 提高了恶意代码的安全性
  • 更轻松的更新,更新一个应用程序而不关闭另一个应用程序

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

签出“多租户”JVM

IBM的JRE已经具备:

Waratek在Oracle JRE之上实现了它,他们创建了ElastiCat,一个Tomcat分支,用于在同一容器中隔离不同的应用程序:

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

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

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

看看以一种可管理的方式运行Java的现代风格。

拥有多个JVM而不是一个JVM的另一个重要原因是当面对numa组时。您不能像在多个JVM进程中一样,通过numa组在一个JVM中分发线程。至少我从来没有找到这样做的方法

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

由于有34个进程,系统假定它们不需要共享内存,因此将它们分布在两个CPU上


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

谢谢米卡维利。我很清楚这里的权衡。我要处理的是同一个应用程序的大约100个实例,每个实例都在自己的JVM中运行(每个客户一个实例)。这给了我们极大的灵活性(可以根据客户运行不同版本的应用程序)和隔离(应用程序崩溃不会影响其他客户)。然而,这让人觉得既陈旧又笨拙,难以管理/监控,而且越来越难以扩展。必须有一种更现代的方式来处理这些应用程序部署……我建议将任何适合的应用程序迁移到现代应用程序服务器(JBoss或Glassfish),这取决于它们是否主要是web应用程序,或者它们是否需要一些返工。应用程序服务器承担了管理和监控的许多痛苦,因此它可能值得过渡的痛苦。Glassfish已经死了——我不推荐任何人使用它。现代方法越来越多地在虚拟化主机上使用每应用程序JVM。对于您需要的规模,我强烈建议您考虑云铸造,以抽象出您所谈论的大部分管理。与chrylis的评论类似,现代方法是不使用应用程序服务器。多租户也已经死了,因为当您可以使用VM或Docker之类的容器来实现真正的分离时,为什么会有这样的麻烦呢?我认为您关注的问题是错误的:为什么总是出现堆大小问题?你的应用程序是否正在泄漏内存?你有无限的内存消耗吗?对于给定的工作负载,你的应用程序不会稳定地使用内存吗?@Noky你能补充一些关于这些管理约束到底是什么的细节吗。只是想知道管理100个JVM需要什么!它们都用于创建单独的虚拟机。你解决了监控/管理问题,但你仍然需要手动进行内存管理。我怀疑核心问题不在于应用程序及其内存的管理,但为什么应用程序如此不稳定,以至于需要不断调整内存?史蒂文说得好。问题不在于应用程序不稳定。这不是一个webapp,而是一个相当大的应用程序,具有许多不同的自定义选项和附加组件,这些选项和附加组件根据客户的需求和大小而有所不同。因此,没有一套“一刀切”的方法来分配应用程序的内存。虽然该应用程序总体上相当稳定,但有时会出现问题,这是生活中的一个事实;当出现问题时,隔离应用程序是一个巨大的胜利。因此,能够为每个客户贡献大量内存是一件好事,也是一件坏事。我担心你的期望值降低了。如果高度可变的工作负载是一个特点