JVM大页内存的学习与使用


原理和背景

操作系统是计算机的重要组成部分.
现代的操作系统一般都采用 段页式内存管理. 段一般是为了管理和权限
页主要是为了虚拟内存和物理内存的映射. 分页管理可以让物理上不连续的内存在程序看来是逻辑地址连续的.
但是这也意味着分页分页内存管理需要有一个虚拟内存和物理内存的映射关系 为了加快操作系统的速度, 一般采用硬件的MMU进行映射管理.
而CPU内部有一块TLB 就是进行快速查找使用的 CPU内存的寄存器容量是非常小的, 所以为了提高寸土寸金的利用率.
大小恒定的TLB如果能够过滤查找更多的内存时, 他的效果是最佳的
2M的内存页比4KB的内存也, TLB 能够多存储512倍的地址空间
所以使用比默认地址页更大的内存页面, 是很好的提高访存性能的方法. 64位系统的寻址空间其实非常大, 一般操作系统都采用 48位的虚拟地址空间
理论上可以访问 256T的内存. 页面大小一般是从 2的12次方开始计算 也就是 4KB
然后每次提升 2的9次方. 也就是 2MB和 1GB.

JVM

JVM 其实是一套小型的虚拟机.
其实自己也是一套操作系统.
也进行进程管理, 内存管理, IO管理等.
他的性能其实也受到硬件等的制约. 比较大的内存情况下, 使用大页内存能够加快TLB的访存处理
对性能有比较好的提高. 其实需要说明TLB: 每个核心都有自己的TLB.
Linux环境下的不管是多进程结构(Nginx) 还是 多线程结构(JVM) 其实都是prcess的概念.
他的TLB其实是多核心理论上需要保持同步. 进程切换时, 其实TLB就会被刷出和刷入, 是进程切换的一大时间损耗. 如果能够减少TLB的内容, 并且符合程序的空间和时间局限性, 那么性能可能会有较大的提升.
不需要加载太多的TLB, 并且可以访存更大的地址, 提高性能.

大页内存的种类

透明大页和大页

透明大页是 redhat 发明的
他的目标是减少管理成本, 只要开启了, 他会自主的帮你去扩展连续的页面作为大页使用.
他不会造成不使用透明大页的内存浪费, 但是他的申请和释放会有比较大的延迟,
所以很多大型内存应用,比如Oracle数据库 严令需要关闭透明大页 大页内存
大页内存在有足够空间时指定, 并且设置了之后不使用大页内存的程序无法访问这一块内存.
基本上可以理解为是独占独享的, 不会被释放,也不会被swap到磁盘
性能是最优秀的, 但是也是比较浪费空间的一种方式. 开启也大页内存 需要说明必须修改默认共享段的大小, 理论上可以设置的很大
大于操作系统的内存也可以.

透明大页的使用方式

查看透明大页的情况:
cat /sys/kernel/mm/transparent_hugepage/enabled
如果JVM使用透明大页需要修改为:
echo "madvise" > /sys/kernel/mm/transparent_hugepage/enabled JVM 支持在 madvise mode 中配置时使用 THP ,但需要使用 -XX:+UseTransparentHugePages。
完成此操作后,Java 堆以及其他内部 JVM 数据结构将由 transparent huge pages 支持。 可以在 JVM的启动日志里面: -Xlog:gc+init -Xlog:pagesize 进行查看.

标准大页的使用方式

查看系统里面的大页信息
ls /sys/kernel/mm/hugepages/
一般会得到两个:
hugepages-2048kB hugepages-524288kB 一般可以采用在线修改. 或者是修改 sysctl.conf的方式进行
如果没发重启机器 或者是其他方式, 可以使用 如下方式进行处理.
echo 64009 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages 需要注意 JVM的参数与 透明大页的不一样:
-XX:+UseLargePages 或者是 -XX:+UseHugeTLBFS 进行启用.

优缺点

两种方法各有利弊,选择哪一种取决于多个方面。

THP 更易于设置和使用,但在使用 HugeTLB 页面时你有更多控制权。
如果延迟是你最关心的问题,那么你可能应该使用 HugeTLB 页面,因为你永远不会等待操作系统释放足够的连续内存。
作为替代方案,你可以将 defrag THP 选项配置为在没有 large pages 可用时不停止,但这可能会带来吞吐量成本。
如果内存占用是一个问题,THP 是避免必须预先提交整个 Java 堆的更好选择。 使用哪种类型的 large pages 取决于应用程序和环境,但在很多情况下,使用任何类型的 large pages 都会对性能产生积极影响。 来源: https://juejin.cn/post/7011002046899978253

JVM大页内存的学习与使用的更多相关文章

  1. 大页内存(HugePages)在通用程序优化中的应用

    今天给大家介绍一种比较新奇的程序性能优化方法-大页内存(HugePages),简单来说就是通过增大操作系统页的大小来减小页表,从而避免快表缺失.这方面的资料比较贫乏,而且网上绝大多数资料都是介绍它在O ...

  2. [development][dpdk][hugepage] 大页内存的挂载

    参考: [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存 完成了以上内容之后, 下一步需要做的是挂载, 大页内存只有被挂载了之后,才能被应用程序使用. 挂 ...

  3. [development][dpdk][hugepage] 为不同的结点分配不同大小的大页内存

    这个事来自dpdk, 所以, 先参考. http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html 当前, 假设你已经读过上边内容, 知道大页内存时候, dp ...

  4. 大页内存(HugePages)

    原文转载自:http://blog.csdn.net/yutianzuijin/article/details/41912871 今天给大家介绍一种比较新奇的程序性能优化方法—大页内存(HugePag ...

  5. OpenStack 高性能虚拟机之大页内存

    目录 文章目录 目录 前文列表 虚拟存储器系统 页式虚拟存储器 大页内存 Linux 的大页内存 大页的实现原理 大页内存配置 透明巨型页 THP 大页面对内存的影响 Nova 虚拟机的大页内存设置 ...

  6. Linux大页内存管理等---菜鸟初学

    1. 查看linux的内存情况: free -m 2. 查看是否开启大页的方法: cat /proc/meminfo |grep -i HugePage AnonHugePages: 276480 k ...

  7. Linux 之 hugepage 大页内存理论

    HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能.尤其是对于8GB以上的内存以 ...

  8. JVM运行时内存结构学习

    学习JVM运行模型比较重要,先看一幅图片: 运行时数据区(内存结构) :  1.方法区(Method Area)类的所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在这里定义.简单来说,所 ...

  9. 关于JVM加载内存图学习小密招

    先看如下代码: Person.java public class Person { private String name; private int age; static int count = 0 ...

  10. UIO,大页内存,CPU亲和性,NUMA机制等

    Linux环境下的UIO(Userspace I/O) UIO 用户空间下驱动程序的支持机制.DPDK使用UIO机制使网卡驱动程序运行在用户态,并采用轮询和零拷贝方式从网卡收取报文,提高收发报文的性能 ...

随机推荐

  1. VSCode 终端选择文本自动复制

    Ctrl + , 打开设置 搜索 copyOnSelection,勾选即可 对应的 settings.json 如下 "terminal.integrated.copyOnSelection ...

  2. 2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等。 输入: nums = [4, 3, 2, 3, 5,

    2023-09-13:用go语言,给定一个整数数组 nums 和一个正整数 k, 找出是否有可能把这个数组分成 k 个非空子集,其总和都相等. 输入: nums = [4, 3, 2, 3, 5, 2 ...

  3. 没有苹果开发者账号能否创建ios证书-最新

    ​ 摘要: 本文介绍了在没有Mac电脑的情况下,使用appuploader工具生成iOS证书和描述文件的方法.随着大前端和H5框架的热门话题,越来越多的人希望将H5应用打包成iOS应用.苹果官方提供的 ...

  4. Jenkins + SVN/Git + Maven + Docker + 阿里云镜像 + Kubernetes(K8S)

    Jenkins 2361.2 + Maven Integration + SVN/GIT + Docker + 阿里云镜像 + Kubernetes(K8S) 本文用于学习,了解原理,和实际应用,有所 ...

  5. Mac 修改文件默认打开方式

    Mac 播放 swf Flash文件 选中文件,Command+i 打开简介 不过文件图标还没变过来.重新下明天再看看

  6. 发布会回放|Gradio 4.0 正式发布!

    Gradio 的目标是使机器学习模型的演示更容易定制和访问,以满足不同用户的需求.在 4.0 正式版的发布活动上,Hugging Face 的 Gradio 团队介绍了自己为了提高机器学习模型的可访问 ...

  7. PS 项目报工与取消

    1.项目报工 1.1.CN25 1.2.BAPI:BAPI_NETWORK_CONF_ADD "-----------------------------@斌将军-------------- ...

  8. (转)Github+jsDelivr+PicGo 打造稳定快速、高效免费图床

    转载自:https://www.itrhx.com/2019/08/01/A27-image-hosting/ 写在开头,之前我是使用Gitee作为图床和Picgo搭配使用的 (图片不允许超过1MB) ...

  9. # 0x56 动态规划-状态压缩DP

    0x56 动态规划-状态压缩DP Mondriaan's Dream Description Squares and rectangles fascinated the famous Dutch pa ...

  10. 第九届蓝桥杯(2018)C/C++大学A组省赛题解

    第一题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似:3/2 当然,这只是加了前2项而已. ...