java启动jar包修改JVM默认内存

本文介绍了JVM内存配置的相关参数,如-Xms、-Xmx、-Xmn和-Xss,并给出了如何通过free-h和top命令查看系统内存使用情况。建议在服务器上设置-Xms和-Xmx相等以避免频繁调整堆大小,同时提供了调整JVM内存参数的示例,以优化Java应用程序的性能。

 

JVM默认物理内存

JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。

设置JVM内存的参数有四个

-Xmx   Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;

-Xms   Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn   Java Heap Young区大小,不熟悉最好保留默认值;

-Xss   每个线程的Stack大小,不熟悉最好保留默认值;

操作步骤

  1. 执行命令:free -h,查询当前的内存占用情况(Mem是当前物理内存使用情况,Swap是swap交换分区使用情况)

         

    2. 执行命令:top,查看各个应用的内存占用情况

        

       

       第一行:
       10:51:46 — 当前系统时间
       601 days, 17:08 — 系统已经运行了601天17小时8分钟(在这期间没有重启过)
       1 users — 当前有1个用户登录系统
       load average: 0.86, 0.73, 0.74 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。

       load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。

 

       第二行:
       Tasks — 任务(进程),系统现在共有163个进程,其中处于运行中的有1个,162个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。

   3. 启动jar包:

java -Xms1024m -Xmx1024m -Xmn700m -Xss16m -jar xxx.jar &

       -Xms1024m  设置JVM促使内存为1024M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

       -Xmx1024m ,设置JVM最大可用内存为1024M。

       -Xmn700m设置年轻代大小为700M。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的                                    3/8。

       -Xss16m

       

  4. 如果是tomcat项目启动,则在bin目录下,执行命令:vim catalina.sh,然后在顶部加上: 

JAVA_OPTS="-Xms1024m -Xmx1024m -Xmn700m -Xss16m"

  重新启动项目之后,执行命令查询修改情况:jps -v

### 默认内存分配情况分析 在使用 `java -jar` 启动 Java 程序时,JVM默认内存分配主要由以下几个参数决定: 1. **初始堆小(Initial Heap Size)** JVM 的初始堆小通常设置为物理内存的 1/64。如果未显式指定 `-Xms` 参数,则会采用此默认值[^3]。 2. **最小(Maximum Heap Size)** 最默认为物理内存的 1/4,或者在 32 位系统上限制为 1GB。如果没有通过 `-Xmx` 参数显式指定,则会使用该默认值[^3]。 3. **非堆内存(Non-Heap Memory)** 非堆内存括方法区、元空间等,默认情况下,元空间的最小取决于操作系统和可用内存。在 64 位系统上,默认值可能达到几 GB,而在 32 位系统上则受限于地址空间[^1]。 以下是启动时的默认内存分配行为总结: - 如果未指定任何 JVM 参数,JVM 会根据系统的物理内存自动调整初始堆小和最小。 - 非堆内存小也会根据系统资源动态调整,但其增长可能会受到操作系统的限制。 ### 如何查看默认内存设置 可以通过以下命令查看 JVM默认内存分配设置: ```bash java -XX:+PrintFlagsFinal -version | grep -E 'HeapSize|PermSize|ThreadStackSize' ``` 上述命令将输出与内存相关的默认参数值,例如 `InitialHeapSize` 和 `MaxHeapSize`[^3]。 ### 自定义内存分配 如果需要更改默认内存分配,可以在启动程序时通过命令行参数进行设置。例如: ```bash java -Xms512m -Xmx2g -jar your-application.jar ``` 上述命令将初始堆小设置为 512MB,最小设置为 2GB。此外,还可以通过 `-XX:MaxMetaspaceSize` 参数限制元空间的最小[^2]。 ### 容器环境中的内存分配 在 Docker 容器中运行 Java 应用时,JVM 可能无法正确识别容器的内存限制。因此,建议显式设置内存参数以避免 OOM(Out of Memory)问题。例如: ```bash docker run -m 4g your-image java -Xms512m -Xmx3g -jar your-application.jar ``` 上述命令将容器的内存限制设置为 4GB,并将 JVM 的最小设置为 3GB,确保 JVM 不会超出容器的内存限制[^1]。 ### 示例代码:动态调整 JVM 内存参数 以下是一个示例脚本,用于根据容器的内存限制动态调整 JVM 参数: ```bash #!/bin/bash CONTAINER_MEMORY=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes) MAX_HEAP=$((CONTAINER_MEMORY * 3 / 4)) # 设置最堆为容器内存的 75% MIN_HEAP=$((CONTAINER_MEMORY / 4)) # 设置最小堆为容器内存的 25% java -Xms${MIN_HEAP} -Xmx${MAX_HEAP} -jar your-application.jar ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值