【问题标题】:How to dynamically set java memory size in bash?如何在bash中动态设置java内存大小?
【发布时间】:2012-03-27 10:42:23
【问题描述】:
#!/bin/bash
#
module add apps/java/1.6 
java -Xmx1024m HelloWorld

我需要设置-XmxYm,其中Y 应该是系统上可用内存的95%,单位为Mb。

【问题讨论】:

  • “可用内存”的定义是什么?您是指操作系统可用的 RAM 吗?你的意思是进程可用的虚拟内存?还是什么?
  • @DavidSchwartz 表示 Java 可以使用且不会导致系统崩溃的所有内存。我认为这是操作系统可用的 RAM。
  • 请注意,您不能总是为 JVM 分配尽可能多的内存。一些提示:stackoverflow.com/questions/171205/…stackoverflow.com/questions/1190837/…stackoverflow.com/questions/3030263/…
  • 堆只是 Java 使用的内存的一部分。在任何情况下,您都希望它是操作系统未使用的内存和合理大小的磁盘缓存。如果您保留默认选项,它将使用 1/4 的内存(使用服务器 JVM)
  • @bizso09:不,因为如果系统有可用的交换空间,进程可以使用比可用 RAM 更多的内存。如果问题不是导致系统崩溃,您还需要考虑交换/分页。

标签: java linux bash memory


【解决方案1】:

这是一个使用所需堆大小调用 Java 的脚本。

#!/bin/bash

# Total memory in KB
totalMemKB=$(awk '/MemTotal:/ { print $2 }' /proc/meminfo)

# Percentage of memory to use for Java heap
usagePercent=95

# heap size in KB
let heapKB=$totalMemKB*$usagePercent/100

# heap size in MB
let heapMB=$heapKB/1024

module add apps/java/1.6 
java -Xmx${heapMB}m HelloWorld

我强烈建议您使用较低的 usagePercent,因为 Java 应用程序使用的内存大于堆大小(例如,对于 PermGen)。

【讨论】:

    【解决方案2】:

    正如 Peter Lawrey 所说,将 95% 的内存分配给堆可能并不明智。

    但是,您可以通过读取“/proc/meminfo”文件来确定内存大小。试试

    cat /proc/meminfo
    MemTotal:     32958996 kB
    MemFree:      23461744 kB
    Buffers:        133772 kB
    Cached:        1651888 kB
    SwapCached:          0 kB
    Active:        8460504 kB
    Inactive:       740048 kB
    HighTotal:           0 kB
    HighFree:            0 kB
    LowTotal:     32958996 kB
    LowFree:      23461744 kB
    SwapTotal:    34996216 kB
    SwapFree:     34996216 kB
    Dirty:             372 kB
    Writeback:           0 kB
    AnonPages:     7415344 kB
    Mapped:          61260 kB
    Slab:           206896 kB
    PageTables:      24320 kB
    NFS_Unstable:        0 kB
    Bounce:              0 kB
    CommitLimit:  51475712 kB
    Committed_AS: 18514524 kB
    VmallocTotal: 34359738367 kB
    VmallocUsed:    282388 kB
    VmallocChunk: 34359454135 kB
    HugePages_Total:     0
    HugePages_Free:      0
    HugePages_Rsvd:      0
    Hugepagesize:     2048 kB
    

    【讨论】:

    • 那么我该如何在 bash 文件中设置呢?
    • @bizso09 - awk '/MemTotal:/ { print $2 }' /proc/meminfo
    • @jordanm 你能在原始脚本和问题的上下文中写出来吗?我对 bash 还很陌生。
    猜你喜欢
    • 2012-05-18
    • 2019-11-25
    • 2011-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多