JVM应用探索

JVM里的堆大小如何配置?

JVM默认堆大小
官方文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/parallel.html#default_heap_size

  1. Default Heap Size
    Unless the initial and maximum heap sizes are specified on the command line, they are calculated based on the amount of memory on the machine.
    默认堆大小:
    若没有在命令行中指定了初始化和最大的堆大小,则取决于计算机上的的物理内存大小
  2. Client JVM Default Initial and Maximum Heap Sizes
    The default maximum heap size is half of the physical memory up to a physical memory size of 192 megabytes (MB) and otherwise one fourth of the physical memory up to a physical memory size of 1 gigabyte (GB).
    默认最大堆在物理内存192MB以下时是物理内存的一半,并且在物理内存1GB以下时,为其四分之一
    For example, if your computer has 128 MB of physical memory, then the maximum heap size is 64 MB, and greater than or equal to 1 GB of physical memory results in a maximum heap size of 256 MB.
    例如,计算机物理内存为128MB时,最大堆为64MB,当物理内存大于等于1GB时最大堆都为256MB
    The maximum heap size is not actually used by the JVM unless your program creates enough objects to require it. A much smaller amount, called the initial heap size, is allocated during JVM initialization. This amount is at least 8 MB and otherwise 1/64th of physical memory up to a physical memory size of 1 GB.
    最大堆实际上并不被JVM经常用到,除非你的程序会创建足够多的对象。有个更小的数字,称为初始化堆大小,会在JVM初始化时分配。初始化堆大小至少为8MB,并且直到物理内存达到1GB时,都为其六十四分之一
    The maximum amount of space allocated to the young generation is one third of the total heap size.
    yong区分配的空间最大值为堆大小的三分之一
    客户端的默认堆大小
    最大堆大小:物理内存小于192MB时,为物理内存的一半;物理内存大192MB且小于1GB时,为物理内存的四分之一;大于等于1GB时,都为256MB
    初始化堆大小:至少为8MB;物理内存大于512MB且小于1GB时,为物理内存的六十四分之一;大于等于1GB时,都为16MB
  3. Server JVM Default Initial and Maximum Heap Sizes
    The default initial and maximum heap sizes work similarly on the server JVM as it does on the client JVM, except that the default values can go higher. On 32-bit JVMs, the default maximum heap size can be up to 1 GB if there is 4 GB or more of physical memory. On 64-bit JVMs, the default maximum heap size can be up to 32 GB if there is 128 GB or more of physical memory. You can always set a higher or lower initial and maximum heap by specifying those values directly; see the next section.
    服务端JVM默认的初始化堆大小和最大堆大小除了能设定更大的值以外,其分配规律与客户端JVM相同。在32位的JVM中,如果物理内存大于等于4GB,默认最大堆的大小可以达到1GB。在64位的JVM中,如果物理内存大于等于128GB,默认最大堆大小可以达到32GB。你可以可以直接指定更大或者更小的初始化堆大小和最大堆大小。
    服务器端的默认堆大小
    初始化堆大小:客户端JVM相同
    最大堆小大:
    32位的JVM上,物理内存小于192MB时,为物理内存的一半;物理内存大192MB且小于4GB时,为物理内存的四分之一;大于等于4GB时,都为1GB
    64位的JVM上,物理内存小于192MB时,为物理内存的一半;物理内存大192MB且小于128GB时,为物理内存的四分之一;大于等于128GB时,都为32GB
  4. 最大堆大小查看方式
    Linux环境下可通过如下命令去查看:
    java -XX:+PrintFlagsFinal -version | grep MaxHeapSize
    1
    在程序中可用如下语句打印JVM最大内存
    Runtime.getRuntime().maxMemory()

————————————————
版权声明:本文为CSDN博主「Match_h」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20107237/article/details/89554571

经验值:
在WAS里配置是最大堆设置(JDK1.6,1。7版本)为内存的2/3。

关于JDK1.8

JDK1.8以后永久代被元空间取代。元空间本质和永久代类似。
元空间(java8)与永久代(java7)之间最大的区别在于:永久代使用的是JVM堆内存,但是java8以后的元空间并不在虚拟机中,而是使用本机物理内存。因此,默认情况下,元空间大小受本地内存限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆,这样可以加载多少类的元数据就不再由MaxPermSize控制,而是由系统实际可用空间决定。

二、堆内存初始大小

packge heaptest;
/**
 * -Xms 堆内存初始大小,默认内存大小:系统64/1
 * -Xmx 堆内存最大值,默认内存大小:系统4/1
 * -Xmn 堆内存年轻代大小
 */
public class InitailHeapSizeDemo {
    public static void main(String[] args) {
        long initialHeapSize = Runtime.getRuntime().totalMemory();
        long maxHeapSize = Runtime.getRuntime().maxMemory();
        System.out.println("-Xms = " + initialHeapSize / 1024 + "kb or " + initialHeapSize / 1024 / 1024 + "mb");
        System.out.println("-Xmx = " + maxHeapSize / 1024 + "kb or " + maxHeapSize / 1024 / 1024 + "mb");
    }
}

程序执行结果如下:初始堆大小为系统内存64/1,堆内存最大为系统内存4/1。

测试结果:

-Xms = 249344kb or 243mb
-Xmx = 3699200kb or 3612mb

结论:

(一般最大堆配置不能超过内存的一半)

JVM堆大小调整参数及建议

https://blog.csdn.net/xxfigo/article/details/8147954

JVM里垃圾回收器如何配置,选哪个?

参考文章https://www.cnblogs.com/lemon-flm/p/10194229.html中的配置建议。
JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。
1、吞吐量优先的并行收集器

如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置:

java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
2、响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
典型配置:
java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值