JVM(九)JVM优化思路分析

1.将新对象预留在年轻代

原因:由于 Full GC 的成本远远高于 Minor GC,因此某些情况下需要尽可能将对象分配在年轻代。因此,在 JVM 参数调优时可以为应用程序分配一个合理的年轻代空间,以最大限度避免新对象直接进入年老代的情况发生。

总结:合理设置一个年轻代的空间大小 -Xmn 调整这个参数,最好设置成堆内存的3/8,例如最大-Xmx5G,那么 -Xmn应该设置成3/8*2大约在2G左右

2.让大对象进入年老代

原因:因为大对象出现在年轻代很可能扰乱年轻代 GC,并破坏年轻代原有的对象结构。因为尝试在年轻代分配大对象,很可能导致空间不足,为了有足够的空间容纳大对象,JVM 不得不将年轻代中的年轻对象挪到年老代。因为大对象占用空间多,所以可能需要移动大量小的年轻对象进入年老代,这对 GC 相当不利。基于以上原因,可以将大对象直接分配到年老代,保持年轻代对象结构的完整性,这样可以提高 GC 的效率。

总结:如果对象的大小大于某个阀值将其直接放到老年代 XX:PetenureSizeThreshold=1000000 1M 调整这个参数

3.设置线程栈大小

-Xss128k:减少线程栈的大小,这样可以使剩余的系统内存支持更多的线程; 设置小了能减少内存的使用,也可以创建更多的线程,但是系统的线程不是无限生成的,所以不要太小。

4.设置新生代用并行收集器

-XX:+UseParNewGC ParNew垃圾器是多条垃圾收集线程并行工作,收集垃圾停顿时间少,可与CMS收集同时使用,JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值

5.设置老年代用CMS内存收集器

-XX:+UseConcMarkSweepGC CMS收集器是用户线程与垃圾收集线程并发同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行。而垃圾收集程序运行在另一个CPU上,停顿时间少。

6.对年老代进行压缩

-XX+UseCMSCompactAtFullCollection CMS垃圾收集器使用的是标记-清除算法不会对内存进行整理, 因此容易产生碎片, 导致内存不够用, 内存的压缩整理内存碎片。 在进行内存压缩时可能会影响性能,但是可以消除碎片

-XX:CMSFullGCsBeforeCompaction=0 由于并发收集器不对内存空间进行压缩,整理,所以运行一段时间以后会产生”碎片”,使得运行效率降低.此值设置运行多少次FullGC以后对内存空间进行压缩,整理

7.尝试使用大的内存分页

分析:CPU 是通过寻址来访问内存的。32 位 CPU 的寻址宽度是 0~0xFFFFFFFF ,计算后得到的大小是 4G,也就是说可支持的物理内存最大是 4G。但在实践过程中,碰到了这样的问题,程序需要使用 4G 内存,而可用物理内存小于 4G,导致程序不得不降低内存占用。为了解决此类问题,现代 CPU 引入了 MMU(Memory Management Unit 内存管理单元)。MMU 的核心思想是利用虚拟地址替代物理地址,即 CPU 寻址时使用虚址,由 MMU 负责将虚址映射为物理地址。MMU 的引入,解决了对物理内存的限制,对程序来说,就像自己在使用 4G 内存一样。

内存分页 (Paging) 是在使用 MMU 的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页 (page) 和页帧 (page frame),并保证页与页帧的大小相同。这种机制,从数据结构上,保证了访问内存的高效,并使 OS 能支持非连续性的内存分配。在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是大家耳熟能详的虚拟内存。

总结: 使用大的内存分页可以增强 CPU 的内存寻址能力,从而提升系统的性能。
-XX:LargePageSizeInBytes=128M
注意:过大的内存分页会导致 JVM 在计算 Heap 内部分区(perm, new, old)内存占用比例时,会出现超出正常值的划分,最坏情况下某个区会多占用一个页的大小。所以不要设置太大!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值