减少Solaris(UNIX)上多个Java进程的内存占用

减少Solaris(UNIX)上多个Java进程的内存占用,java,memory,process,fork,shared-memory,Java,Memory,Process,Fork,Shared Memory,有没有办法让一个Java进程分叉或启动另一个Java进程并使用共享内存来最小化RAM的使用 为了在不影响其他人的情况下安全地杀死一个人,将有许多过程。此外,如果线程处于不同的进程中,这将允许简单地检测哪些线程正在使用更多的内存或CPU。这应该允许任何进程发生崩溃或OutOfMemoryError,而不会影响其他进程 如果我们能同时运行100-300个java进程,那就太好了,每个进程都有自己的用途。我意识到,如果我们不想从数据库和文件系统中掠夺太多内存,我们可能必须限制这个数量,并要求进程承担多

有没有办法让一个Java进程分叉或启动另一个Java进程并使用共享内存来最小化RAM的使用

为了在不影响其他人的情况下安全地杀死一个人,将有许多过程。此外,如果线程处于不同的进程中,这将允许简单地检测哪些线程正在使用更多的内存或CPU。这应该允许任何进程发生崩溃或OutOfMemoryError,而不会影响其他进程

如果我们能同时运行100-300个java进程,那就太好了,每个进程都有自己的用途。我意识到,如果我们不想从数据库和文件系统中掠夺太多内存,我们可能必须限制这个数量,并要求进程承担多个角色

编辑:

我想当我说共享内存时,我的意思是错误的。我的意思是可以在多个进程之间使用的内存,比如Java类(而不是变量)。如果可能,所有java包和库都可以重用。

共享内存是什么意思?你是说主机系统的内存吗

因为您使用的是Solaris,所以Java线程就是Solaris线程,每个线程都有自己的进程。但是Java仍然在您给定的JVM内存参数下运行。如果出现OutOfMemoryError,则JVM的内存池已达到极限,而不是主机系统。换句话说,在Java中,您永远不会真正访问共享内存——这是JVM的工作。如果Java进程需要更多内存,则必须提高JVM的内存限制。但是所有这些内存都是由JVM管理的。为了真正访问共享内存,您需要使用JNI从JVM中取出并进入主机内存


如果您谈论的是一个JVM启动另一个JVM,我认为这是可能的,但接下来您谈论的是多个JVM,为了最大限度地减少RAM的使用,每个JVM都应该有一个非常小的初始内存池来使用。否则,就会有一堆JVM占用它们的虚拟内存模型以及相关线程的内存。

不,据我所知,这是不可能的。这有几个原因:

  • 共享对象的所有权将是一件可疑的事情,因此每个线程的内存限制将是不可执行的
  • 如果一根线死了,那是一个严重的问题。线程不会像那样意外死亡,如果您安装了一个catch-all异常处理程序,则不会。在编写良好的系统中,线程意外死亡的唯一原因是抛出了
    错误,这意味着系统不稳定,通常还意味着应该尽快停止VM
  • 除了一些非常特殊的情况(尤其是应用程序/Web服务器),任何系统都不可能在丢失一个线程后继续运行。这往往会产生可怕的后果

  • 更新:发现它是一个需要解决方案的Web服务器后,我将尝试更进一步。尽管Java不是为达到您所需要的隔离级别而设计的。有些功能可以通过代理实现。具体来说,线程可以是,等等。坏消息是,您的代理必须用C或类似语言编写,这是出了名的难以调试,任何错误都可能导致虚拟机崩溃。

    @George Bailly-刚刚听到您的评论

    是的,较新的JVM确实共享类文本,但据我所知,仅在客户端(非服务器)JVM中共享。这样做的好处是减少了IO和启动时间,但有助于减少占地面积

    您可以在此处阅读更多内容:


    您可能还希望在堆大小调整参数上采取积极措施,以允许更小的占用空间。虽然是半商业化的,但我维护了一个小型软件包,它可以管理多个(数百个)JVM的工作负载,并动态管理操作系统级IO和进程优先级,以满足工作负载目标。一个穷人的虚拟机WLM。thusfar未能在运行时管理JVM人体工程学,但WLM方法出人意料地运行良好。如果您需要更多信息,请告诉我。

    这是针对webapp服务器的。某些Web应用程序将在生产环境中频繁更改。因此,错误代码不可避免地会导致无休止的循环和内存溢出。如果出现这种情况,它将不得不与其他线程隔离——我希望这只能通过分离进程来完全实现。如有必要,具有无限循环的进程中的现有线程可以完成,Web服务器可以知道is不应该在该进程上启动(请求)任何新线程。不要嘲笑我写了一个新的网络服务器。“这是经过深思熟虑的,”乔治·贝利说,“我为什么要笑呢?”?我将更新我的答案。这是一个JVM启动另一个JVM的情况。我指的是Java核心或任何在父进程和子进程中保持不变的东西,或者最初是相同的,但是如果需要更改,一些片段可能会被复制到进程特定的空间。我不知道我在说什么。我只是想尽量减少RAM的使用。我知道我必须锁定
    -Xmx
    以保持合理。但是,类存储(不是变量)用于MySQL连接器、所有java包;Java邮件,PDF生成器。这些通常会在多个流程中使用。谢谢,这似乎就是我要寻找的。请转到一个答案,以便我可以接受@Xepoch根据文档,在服务器JVM中使用-Xshare:dump生成共享归档(classes.jsa)