有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在单个服务器中为多个应用程序分配linux Java堆内存

我们有一个32 GB内存的Linux服务器。因此,服务器中分配的默认堆大小是1/4,即8GBjava -XX:+PrintFlagsFinal -version | grep HeapSize

现在,我们有3个java进程在服务器中运行


所需的最大堆大小(-Xmx) 进程1=4 GB
进程2=4 GB
进程3=2 GB

因此,最大堆大小之和变为10GB,大于服务器的最大堆大小8GB

这样分配最大堆大小可以吗?这会否导致日后出现问题


共 (3) 个答案

  1. # 1 楼答案

    第一个:服务器拥有的Ram称为内存,而不是堆大小;) 使用-Xmx定义的是应用程序可以使用多少内存。这意味着您将为您的应用程序使用10GB的ram或32GB的ram,这几乎不会触及服务器的限制

    编辑:但如果像stephen所写的那样分配超过32GB的内存,仍然可能会导致问题

  2. # 2 楼答案

    你不应该看到任何问题

    正如您提到的,“默认”最大堆大小是8GB。这是一个上限,并不意味着分配或使用8GB内存

    您指定两个进程需要4 GB,其中一个需要2 GB最大堆。请随意配置它们,它们很可能会进行三次单独的Java调用。这意味着您在运行时拥有的每一个JVM都可以获得它们所需的堆容量,而这远远低于32GB的内存

    但是,当您看到java进程的虚拟内存大小大于最大堆大小时,不要开始怀疑。堆只是java使用内存的一种方式,还有其他区域

    我仍然相信你是安全的,除非你在同一台服务器上运行很多你没有告诉我们的东西

  3. # 3 楼答案

    Is it fine to allocate max heap size like this? Will this lead to any issue in future?

    如果8GB是服务器的RAM,那么很可能会导致问题;见下文

    但是,报告的8GB

    $ java -XX:+PrintFlagsFinal -version | grep HeapSize
    

    是服务器硬件的JVM的默认值MaxHeapSize;i、 e.如果不提供任何堆大小参数,将得到的堆大小。它不是最大的Java堆大小。如果要设置实际MaxHeapSize,请使用-Xmx...

    实际可用内存将为32GB。。。减少操作系统内核和其他进程使用的RAM。10GB的Java堆(加上其他非堆内存)应该可以


    如果您有足够的交换空间,Linux系统可以运行所有进程的总和虚拟内存需求超过系统上的物理RAM

    但是,如果提交的虚拟内存(明显)多于物理RAM:

    • 当进程试图访问当前已调出的VM页时,性能将受到影响

    • 如果交换太多,Linux将采取措施防止系统颠簸。内核的OOM killer进程将试图找出内存需求过大的原因。。。。和它

    当JVM执行完全垃圾收集时,它很容易以(基本上)随机顺序访问其大部分页面。这可能会产生大量分页。。。如果你有过多的内存

    不幸的是,OOM杀手不知道它评估为杀人候选的各种过程的重要性。所以,如果你幸运的话(!)它将杀死引起最多问题的Java进程。如果你运气不好,它可能会扼杀一个更为关键的过程;e、 g.您的数据库进程、ssh守护进程等。理论上,您可以保护进程不被终止。在实践中,这样做很尴尬。。。你可能会因为保护那些应该被杀死的东西而陷入更糟糕的境地


    1-在当前版本的Java上,默认的MaxHeapSize是总RAM的1/4。。。据操作系统报道。您有32GB的RAM,因此默认的MaxHeapSize是8GB