jvm和linux hugepage
在linux中启动huge page:
1.查看/proc/meminfo的 Hugepagesize配置,默认是是2m
2.计算jvm堆需要的huge page个数,因为huge page是linux中全局使用的,最好保留10%给其他情况使用
3.将计算出来的值写入 /proc/sys/vm/nr_hugepages
4.修改 /etc/sysctl.conf的sys.nr_hugepages 在重启后仍然生效
5.在jvm启动参数中加入-XX:+UserLargePages
linux上支持的hugepage的大小,依赖于cpu 处理器的支持。目前Intel支持 4K、8K、2M、256M等。jvm的LargePageSizeInBytes依赖系统的配置。
在Solaris上,jvm可以随意设置LargePageSizeInBytes。
在linux 2.6.32之后,系统默认启用transparent_hugepage透明大页
通过/sys/kernel/mm/transparent_hugepage/enabled 查看启动情况,默认值是madvise:只有程序明确使用transparent_hugepage时,才会使用transparent_hugepage。但是JVM不会明确使用transparent_hugepage,需要将值设置为always。
对于JVM参数UserLargePages,如果在启动了transparent_hugepage后,不需要再设置了。
如果仍然设置了UserLargePages:
1.系统配置了hugepages,就使用系统配置
2.系统没有配置hugepages,就使用正常page,不再使用hugepage
在Redhat上可以通过命令查看transparent_hugepage的使用:
总的使用量:grep AnonHugePages /proc/meminfo
每个线程的使用量:grep -e AnonHugePages /proc/*/smaps | awk '{ if($2>4) print $0} ' | awk -F "/" '{print $0; system("ps -fp " $3)} '