JVM优化之调整大内存分页(LargePage)本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大内分页的副作用。OK,让我们开始吧! 内存分页大小对性能的提升原理首先,我们需要回顾一小部分计算机组成原理,这对理解大内存分页至于JVM性能的提升是有好处的。 什么是内存分页? 但在实践过程中,碰到了这样的问题,程序需要使用4G内存,而可用物理内存小于4G,导致程序不得不降低内存占用。 MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由 MMU 负责将虚址映射为物理地址。
内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。 这种机制,从数据结构上,保证了访问内存的高效,并使OS能支持非连续性的内存分配。 在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。 从这张图中,可以清晰地看到CPU与页表,物理内存之间的交互关系。 进一步优化,引入TLB(Translation lookaside buffer,页表寄存器缓冲) 对比 9.6 那张图,在中间加入了TLB。 为什么要支持大内存分页? 为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。 如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。 调整OS和JVM内存分页在Linux和windows下要启用大内存页,有一些限制和设置步骤。 Linux: # cat /proc/meminfo | grep Huge 如果有HugePage字样的输出内容,说明你的OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。 共享内存段最大值 # echo 4294967295 > /proc/sys/kernel/shmmax 大内存页数量 # echo 154 > /proc/sys/vm/nr_hugepages 这个值一般是 Java进程占用最大内存/单个页的大小 ,比如java设置 1.5G,单个页 10M,那么数量为 1536/10 = 154。 Windows:
注意: 需要管理员操作。 单个页大小调整 大内存分页的副作用因为每页size变大了,导致JVM在计算Heap内部分区(perm, new, old)内存占用比例时,会出现超出正常值的划分。最坏情况下是,某个区会多占用一个页的大小。不过后续jvm版本也在调整这个策略。 一般情况,不建议将页size调得太大,4-64M,是可以接受的(默认是4M)。为了合理设置这个值,你应该对你的系统做一下benchmark。 另外,网上有很多GC调优的文章内容中都有提到 LargePageSizeInBytes,但未提任何OS限制。在OS不支持的情况下,设置这个参数,这个参数将仅仅是个摆设。 |
|