当前位置:首页 > 内存 > 正文

堆内存占jvm总内存多少

  • 内存
  • 2024-08-16 09:14:59
  • 4357

一、为什么Java程序占用的内存比指定的堆栈大小要大本文简单介绍了Java程序的内存结构
对象

线程
本机数据结构
本机代码
每个因素对内存使用的影响会有所不同取决于应用程序、运行环境和系统平台那么如何计算总内存使用量呢?是的,要获得准确的数字并不那么容易,因为原始零件很难控制。你唯一可以控制的部分是堆大小:-Xmx,类占用的内存:-XX:MaxPermSize,线程栈:-Xss控制每个线程占用的内存。请注意,堆栈大小设置得太小会导致StackOverflow异常和程序错误。因此,计算公式为:
(-Xmx)+(-XX:MaxPermSize)+线程数*(-Xss)+其他内存
其他内存部分取决于本地代码占用的内存,如NIO、套接字缓冲区、JNI等。它通常约为JVM内存的5%。那么假设我们有以下JVM参数和100个线程:
-Xmx1024m-XX:MaxPermSize=256m-Xss512k
那么JVM进程至少会占用内存量:1024m+256m+100*512k+(0.05*1330m)=1396.5m
我通常使用(1.5*堆最大值)作为近似值来表示Tomcat进程所需的最小内存如果你有一个应用程序需要将MaxPermSize增加到大于256M,这个值可以再大一点


二、JVM中,如果把堆内存参数配置的超过了本地内存,会怎么样?Java内存可分为堆内存和非堆内存:
堆是供开发人员使用的,在JVM启动时创建;非堆是为JVM本身保留的,用于存储类型(类和接口)信息。它与堆不同,在运行时不会释放空间。如果webapp使用了大量的第三方jar或者应用程序有太多的class文件而MaxPermSize设置显得很小,超过限制就会过度使用这块内存并导致溢出,或者服务器Tomcat会怎么做热部署时不清理之前加载的环境只会将上下文更改为新部署的环境,并且非堆栈内容会越来越多在最近几次热部署中发生了emoryError:PermGenspace。
a)堆内存设置:程序可访问和使用
-Xms的初始堆内存默认设置为物理内存的1/64,这也是最小分配的堆内存。当空闲堆内存小于40%时,会增加到-Xms的最大限制
-Xmx最大堆内存分配默认物理内存的1/4,当空闲堆内存大于70%时,它将减少-Xms的最小限制。
常规设置-Xms和.
-XX:MaxPermSize非堆内存的最大值,默认为物理内存的1/4。


三、64g内存服务器+jvm参数?

如果您的服务器有64GB内存,您可以使用这些JVM参数来优化Java程序的使用:

-Xmx:设置Java堆的最大内存使用量。建议将此模块设置为总内存的50%至80%。例如,可以设置为-Xmx48g,这意味着Java堆栈最多可以使用48GB内存。

-Xms:设置Java堆栈的初始内存使用量。建议我们将此模块设置为总内存的25%到50%。例如可以设置为-Xms16g,表示Java堆最初使用16GB内存。

-Xmn:设置新一代的自定义内存。建议将此参数设置为Java堆栈的1/4到1/3。比如可以附加-Xmn16g,表示新一代16GB内存。

-XX:+UseG1GC:使用decuman垃圾收集器,这是一个针对服务器端应用程序的decuman垃圾收集器,可以高效管理内存堆栈。

-XX:MaxGCPauseMillis:设置垃圾收集暂停的最大时间。建议将此参数设置在200毫秒到500毫秒之间。例如可以设置为-XX:MaxGCPauseMillis=200,表示最大超时时间为200毫秒。

-XX:+HeapDumpOnOutOfMemoryError:内存溢出时一般堆转储文件。通过分析堆栈转储表可以发现内存引脚等问题。

-XX:HeapDumpPath:指定堆转储文件的保存路径。JVM参数示例:

java-Xmx48g-Xms16g-Xmn16g-XX:+UseG1GC-XX:MaxGCPauseMillis=200-XX:+HeapDumpOnOutOfMemoryError-XX:HeapDumpPath=/iter/to/dump/file-jaryour_

注意:JVM参数的位置必须根据具体情况进行调整。如果你的应用程序内存占用较小,可以方便地减少-Xmx和-Xms设置;如果应用程序出现问题,可以尝试调整垃圾收集器的参数。