JVM优化之调整大内存分页(LargePage)
来源:互联网 发布:酒鬼蔷薇 知乎 编辑:程序博客网 时间:2024/05/17 02:03
转载自:http://jm.taobao.org/2009/11/21/3157/
MMU 的核心思想是利用虚拟地址替代物理地址,即CPU寻址时使用虚址,由MMU负责将虚址映射为物理地址。MMU的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4G内存一样。
内存分页(Paging)是在使用MMU的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(4K)分割成页(page)和页帧(page frame),并保证页与页帧的大小相同。这种机制,从数据结构上,保证了访问内存的高效,并使OS能支持非连续性的内存分配。在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是虚拟内存。
在上文中提到,虚拟地址与物理地址需要通过映射,才能使CPU正常工作。而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。 如下图:
页表是被存储在内存中的,CPU通过总线访问内存,肯定慢于直接访问寄存器的。为了进一步优化性能,现代CPU架构引入了TLB(Translation lookaside buffer,页表寄存器缓冲),用来缓存一部分经常访问的页表内容。如下图:
为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。
如果有HugePage字样的输出内容,说明OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。接下来,为了让JVM可以调整大内存页size,需要设置下OS 共享内存段最大值和大内存页数量。
共享内存段最大值,建议这个值大于Java Heap size,这个例子里设置了4G内存。
大内存页数量,这个值一般是 Java进程占用最大内存/单个页的大小,比如java设置1.5G,单个页10M,那么数量为1536/10 = 154。
单个页大小调整,JVM启用时加参数 -XX:LargePageSizeInBytes=10m。如果JDK是在1.5 update5以前的,还需要手动加 -XX:+UseLargePages,作用是启用大内存页支持。
什么是内存分页?
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正常工作。而映射就需要存储映射表。在现代CPU架构中,映射关系通常被存储在物理内存上一个被称之为页表(page table)的地方。 如下图:
页表是被存储在内存中的,CPU通过总线访问内存,肯定慢于直接访问寄存器的。为了进一步优化性能,现代CPU架构引入了TLB(Translation lookaside buffer,页表寄存器缓冲),用来缓存一部分经常访问的页表内容。如下图:
为什么要支持大内存分页?
TLB是有限的,这点毫无疑问。当超出TLB的存储极限时,就会发生 TLB miss,之后,OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss,程序的性能会下降地很快。为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。
调整OS和JVM内存分页
在Linux确认是否支持,请在终端敲如下命令:如果有HugePage字样的输出内容,说明OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。接下来,为了让JVM可以调整大内存页size,需要设置下OS 共享内存段最大值和大内存页数量。
共享内存段最大值,建议这个值大于Java Heap size,这个例子里设置了4G内存。
大内存页数量,这个值一般是 Java进程占用最大内存/单个页的大小,比如java设置1.5G,单个页10M,那么数量为1536/10 = 154。
单个页大小调整,JVM启用时加参数 -XX:LargePageSizeInBytes=10m。如果JDK是在1.5 update5以前的,还需要手动加 -XX:+UseLargePages,作用是启用大内存页支持。
阅读全文
0 0
- JVM优化之调整大内存分页(LargePage)
- JVM优化之调整大内存分页(LargePage)
- JVM优化之调整大内存分页(LargePage)
- JVM优化之调整大内存分页(LargePage)
- JVM优化之调整大内存分页(LargePage)
- JVM优化之整合大内存储器分页(LargePage)
- 大内存windows系统优化
- linux大内存Hugepages优化
- Win7 64 大内存性能调整
- Java的大内存分页支持
- Linux大内存页Oracle数据库优化
- DELPHI大内存清零快速算法(Delphi MMX优化算法应用之二)
- Oracle10G内存参数调整以及使用大内存
- ORCALE10G内存参数调整以及使用大内存
- JVM内存调整优化
- MySQL 5.5.49 大内存优化配置文件优化详解
- 申请大内存 + 数据库千万级数据存储 +查询优化
- linux服务器深度历险之使用4G大内存
- 关于Ionic3使用hewz/cordova-baidu-location插件定位的问题
- 将字符串中的空格替换成“%20”
- kubernetes资源对象--持久化存储Persistent Volume和Persistent Volume Claim
- A*寻路算法与它的速度
- android下运行时动态链接dlopen()和dlsym()的实现
- JVM优化之调整大内存分页(LargePage)
- IBM Rational Software Architect V9.0安装
- C++里面的malloc与new的区别
- LA 3263
- 智能小车一《arduino是什么》
- invalid character found in the request target the valid characters are defined in rfc 7230 and rfc 3
- 1054. 求平均值 (20)
- 固定电话+手机号码 正则表达式
- for/in语句(js)