深入JVM 原理(五)Java堆内存调整参数(调优关键)

目录

深入JVM 原理(一)Java内存模型:http://blog.csdn.net/qq_34707744/article/details/79278169
深入JVM原理(二)Java对象访问模式: http://blog.csdn.net/qq_34707744/article/details/79279979
深入JVM原理(三)JVM 垃圾收集:http://blog.csdn.net/qq_34707744/article/details/79281249
深入JVM原理(四)JVM垃圾回收流程:http://blog.csdn.net/qq_34707744/article/details/79281852
深入JVM原理(五)Java堆内存调整参数(调优关键):http://blog.csdn.net/qq_34707744/article/details/79287403
深入JVM原理(六)年轻代:http://blog.csdn.net/qq_34707744/article/details/79287900
深入JVM原理(七)老年代、永久代和元空间:http://blog.csdn.net/qq_34707744/article/details/79288787
深入JVM原理(八)JVM垃圾回收策略:http://blog.csdn.net/qq_34707744/article/details/79289110
深入JVM原理(九)JVM垃圾回收策略参数配置:http://blog.csdn.net/qq_34707744/article/details/79289556
深入JVM原理(十)G1收集器:http://blog.csdn.net/qq_34707744/article/details/79290595
深入JVM原理(十一)Java引用类型:http://blog.csdn.net/qq_34707744/article/details/79291451

堆内存的参数调整
这里写图片描述

通过之前的分析可以发现,实际上每一块子内存区中都会存在有一部分的可变伸缩区,其基本流程:
如果空间不足,在可变的范围之内扩大内存空间,当一段时间之后发现内存空间没有这么紧张的时候,再将可变空间进行释放。所以在整个调整过程之中:

这里写图片描述

-Xms:设置初始分配大小,默认为物理内存的“1/64”
-Xmx:最大分配内存,默认为物理内存的“1/4”

在整个堆内存的调整策略之中,有经验的人基本只会调整两个参数:“-Xmx”(最大内存)、“-Xms”(初始化内存)。如果要取得这些内存的整体信息,直接利用Runtime类即可;

System.out.println(“Max_memory=”+Runtime.getRuntime().maxMemory()/(double)1024/1024+”M”);
System.out.println(“Total_memory=”+Runtime.getRuntime().totalMemory()/(double)1024/1024+”M”);

Max_memory=1820.5M (默认最大内存)
Total_memory=123.0M (初始化内存)

发现默认的情况下分配的内存是总内存的1/4;;而初始化内存为“1/64”;那么也就是说整个内存的可变范围(伸缩区):123.0M ~ 1820.5M 之间,那么现在就可能造成程序性能下降;所以,我最好能让伸缩区的大小为0;即让 Max_memory 和 Total_memory 保持一致;

(java -Xms2G -Xmx2G TestDemo)

这里写图片描述

Max_memory=1963.0M
Total_memory=1963.0M

那么这个时候就避免了伸缩区的可调策略,从而提升了整个程序的性能;

范例:观察GC的详解日志(java -Xms2G -Xmx2G -XX:+PrintGCDetails TestDemo)

Max_memory=1963.0M
Total_memory=1963.0M
[GC (System.gc()) [PSYoungGen: 31488K->608K(611840K)] 31488K->616K(2010112K), 0.0149295 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[Full GC (System.gc()) [PSYoungGen: 608K->0K(611840K)] [ParOldGen: 8K->490K(1398272K)] 616K->490K(2010112K), [Metaspace: 2791K->2791K(1056768K)], 0.0061879 secs] [Times: user=0.02 sys=0.00, real=0.01 secs]
Heap
PSYoungGen total 611840K, used 5248K [0x0000000795580000, 0x00000007c0000000, 0x00000007c0000000)
eden space 524800K, 1% used [0x0000000795580000,0x0000000795aa0178,0x00000007b5600000)
from space 87040K, 0% used [0x00000007b5600000,0x00000007b5600000,0x00000007bab00000)
to space 87040K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007c0000000)
ParOldGen total 1398272K, used 490K [0x0000000740000000, 0x0000000795580000, 0x0000000795580000)
object space 1398272K, 0% used [0x0000000740000000,0x000000074007ab88,0x0000000795580000)
Metaspace used 2798K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 304K, capacity 386K, committed 512K, reserved 1048576K

下面再编写一个代码,观察GC的触发操作:
范例:测试GC处理(请保存内存空间小)(-Xms10M -Xmx10M -XX:+PrintGCDetails)

Random random = new Random();
String string = “213123”;
while (true)
{
string += string + random.nextInt(8888888)+random.nextInt(8888888);
string.intern(); //强制产生垃圾
}
}

如果在开发之中,你发现程序执行速度变慢,那么就需要对程序内存进行分析:
可视化工具:jvisualvm (命令行执行此命令) 或 jconsole

这里写图片描述

这里写图片描述

命令查看:jmap(jmap -heap PID)

这里写图片描述

他会将整个内存空间的情况进行取得;即日常开发下可用这两者方法进行查看调整堆内存;
如果不会调内存的话,可直接将-Xms 和 -Xmx 调成一样大小即可。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@SokachWang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值