2011-02-10 58 views
0

有没有办法让Java进程fork或者启动另一个Java进程,并使用共享内存来尽量减少RAM的使用?减少Solaris上多个Java进程的内存占用(UNIX)

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

如果我们可以同时运行100-300个java进程,每个进程都有自己的目的,那将会很不错。我意识到,如果我们要避免从数据库和文件系统中抢夺太多内存,我们可能不得不限制这个数量并要求进程承担多个角色。

编辑:
我想我说当我说共享内存不正确的含义。我的意思是只能在多个进程中使用的内存,例如Java类(而不是变量)。如果可能的话,所有的java包和库都可以重用。

+1

http://download.oracle.com/javase/1.5.0/docs/guide/vm/class-data-sharing.html – Xailor 2011-02-11 00:29:26

+0

谢谢,这似乎是我正在寻找。请移至答案,以便我可以接受。 @Xepoch – 2011-02-24 17:48:56

回答

0

@George Baily - 刚刚发现了上面的评论。

是的,新的JVMs共享类文本,但据我了解,它只在客户端(非服务器)的JVMs。这样做的好处是减少了IO和启动时间,但在帮助减小占用空间方面还有额外的好处。

你可以在这里阅读更多:

http://download.oracle.com/javase/1.5.0/docs/guide/vm/class-data-sharing.html

您可能还需要得到堆上调整参数,以允许更小的体积侵略性。虽然是半商业化的,但我维护一个小型软件包,可管理多个(数百个)JVM的工作负载,并动态管理OS级别的IO和进程优先级,以实现工作负载目标。 JVM的穷人WLM。因为能够在运行时管理JVM人机工程学,所以我一直未能成功,但WLM方法的出色表现非常出色。让我知道你是否想要更多信息。

0

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

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

如果你正在谈论JVM启动另一个JVM,我想这是可能的,但是你谈论的是多个JVM,并且为了最大限度地减少RAM的使用,应该给每个JVM一个非常小的初始内存池用。否则,你会有一堆JVM为他们的虚拟内存模型以及相关的线程占用内存。

+0

这是一个JVM启动另一个时的情况。我指的是Java内核或任何在父进程和子进程中保持相同的内容,或者最初是相同的,但稍后可能会将某些段复制到处理特定空间(如果需要更改)。我不知道我在说什么。我只是想尝试尽可能减少内存使用量。我知道我必须锁定`-Xmx`以保持合理。但是,类存储(而不是变量)的东西,如MySQL连接器,所有的java包; Java邮件,PDF生成器。这些通常会在多个进程中使用。 – 2011-02-11 00:00:07

0

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

  1. 共享对象的所有权将是一个可疑的事情,所以每个线程的内存限制将无法执行。
  2. 如果一个线程死亡,这是一个严重的问题。线程不会像这样意外死掉,如果你安装了一个catch-all异常处理程序。线程在一个写得好的系统中无意中死掉的唯一原因是抛出了一个Error,这意味着系统不稳定,并且通常也意味着VM应该尽快停止。
  3. 抛开一些非常特殊的情况(尤其是app/webservers)任何系统都不可能在丢失其某个线程后继续运行。往往这会产生可怕的后果。

更新:已经发现,这是一个网络服务器是需要一个解决方案,我会尽量走得更远一点。尽管Java的设计并不是像您所需的那样高度隔离。一些功能可以通过JVMTI代理来实现。具体而言,线程可以是stopped,objects reachable by a thread can be checkedquery the time used up by each thread等。坏消息是你的代理将不得不用C语言或类似的语言编写,它非常难以调试,任何错误都可能导致虚拟机崩溃。

+0

这是一个webapp服务器。一些webapps会在生产环境中经常更改。因此,不可避免的会由于错误的代码而导致无限循环和内存溢出。如果发生这种情况,它将不得不与其他线程隔离 - 我希望这只能通过分离进程才能完全实现。如果有必要,无限循环的进程中的现有线程可以完成,并且Web服务器可以知道不应该启动(请求)该进程上的任何新线程。不要因为写一个新的网络服务器而嘲笑我。它已经很好地思考过了。 – 2011-02-10 23:57:46