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. TypeScript开篇

    1.什么是TypeScript(TS)? Typescript 为 JS 带来了类型能力,如今已被越来越多的大型前端项目选用.Typescript 的出现大大改善了开发体验,增强了代码的可维护性和稳定 ...

  2. Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香...

    做程序员就少不了与一些工具打交道,比如:监控工具.管理工具等,有些工具是命令行界面,有些工具是可视化界面,反正都是可以能够满足日常使用的功能需求. 对于redis管理工具来说,也有不少可能的产品,比如 ...

  3. 五菱宝骏车机升级教程【嘟嘟桌面或ES文件管理器】

    文章来源:https://www.djww.net/607.html 简介 越来越多的汽车厂商自研车机系统,其实就是在原来安卓的基础上加入自己的元素,然后禁用某些功能从而实现禁止用户安装第三方app. ...

  4. MySQL进阶篇:详解存储引擎MyISAM

    MySQL进阶篇:第一章_一.三_存储引擎特点_MyISAM 1.1 存储引擎特点 1.1.2 MyISAM 1). 介绍 MyISAM是MySQL早期的默认存储引擎.. 2). 特点 不支持事务,不 ...

  5. 知道Python中的字符串是什么吗?

    摘要:本文将告诉您Python中的字符串是什么,并向您简要介绍有关该概念的所有知识. 本文将介绍以下内容: 如何创建一个字符串? 如何从字符串访问字符? 格式化字符串 因此,让我们开始吧. 什么是Py ...

  6. DevUI开源经验分享:从0到1开始运营你的开源项目

    摘要:DevUI是面向企业中后台产品的开源前端解决方案,于2019年6月正式在GitHub开源,从当时的无人问津到去年8月累计1000 Star,再到现如今上千名社区成员.上百位贡献者.达成了3000 ...

  7. 带你认识大模型训练关键算法:分布式训练Allreduce算法

    摘要:现在的模型以及其参数愈加复杂,仅仅一两张的卡已经无法满足现如今训练规模的要求,分布式训练应运而生. 本文分享自华为云社区<分布式训练Allreduce算法>,原文作者:我抽签必中. ...

  8. MRS离线数据分析:通过Flink作业处理OBS数据

    摘要:MRS支持在大数据存储容量大.计算资源需要弹性扩展的场景下,用户将数据存储在OBS服务中,使用MRS集群仅做数据计算处理的存算分离模式. 本文分享自华为云社区<[云小课]EI第47课 MR ...

  9. 本地已存在jar包,maven打包还是去下载

    解决方法 在pom文件里面添加以下: file后修改为本地仓库的位置 oss file:C:\Users\admin\.m2\repository <pluginRepositories> ...

  10. 顶级加密混淆混淆工具测评:ipagurd

    ​ 顶级加密混淆混淆工具测评:ipagurd 摘要 JavaScript代码安全需求日益增长,因此JavaScript混淆工具的使用变得广泛.本文将对专业.商业JavaScript混淆工具ipagur ...