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. ElasticSearch之Close index API

    关闭指定的索引. 索引关闭之后: 停止对读.写操作的响应. 停止检索操作的响应. 在索引关闭前,允许执行的操作,关闭之后均不允许执行. ElasticSearch取消对索引的相关维护操作,包含内存中的 ...

  2. Python中的协程、线程和进程

    一.协程与多线程和多进程一起使用有什么不同   协程.多线程和多进程都是实现程序并发执行的方法,不过它们在工作方式和适合的应用场景上存在一些区别. 1.协程(Coroutine)   协程是在单一线程 ...

  3. 用Python写一个简单的TCP客户端和服务端

    在渗透测试过程中,经常需要创建一个TCP客户端,用来测试服务.发送数据.进行 fuzz 等等.如果黑客潜伏在某大型企业的内网环境中,则不太可能直接获取网络工具或编译器,有时甚至连复制/粘贴或者连接外网 ...

  4. JavaFx 打包jar(六)

    JavaFx 打包jar(六) JavaFX 从入门入门到入土系列 我们编写了不少javafx,那么如何打包成jar给用户呢?下面我给出比较全的打包方式. 打包jar 下面我给出比较全的打包方式. 1 ...

  5. javaGUI入门之swing(一)

    javaGUI入门之swing(一) 前面学过javafx,发现他们有"异曲同工"之处,demo写起来也类似,无非是类名不一样.个人觉得实现一个桌面应用不应该只看用一种语言一种框架 ...

  6. 使用IO流写一个随机点名程序

    前言 最近学习了关于IO流的一些知识点,但是应用还不够,所以今天做个简单案例: 随机创建名字导入文件中: package ioandcollection; import java.io.Buffere ...

  7. 浅析AIGC for MMKG

    摘要:AIGC和多模态知识图谱(MMKG)中的知识获取又是怎么实现的呢?他们之间有什么关联呢? 本文分享自华为云社区<GPT-4发布,AIGC时代的多模态还能走多远?系列之四 AIGC for ...

  8. 解读登录双因子认证(MFA)特性背后的TOTP原理

    摘要:随着互联网密码泄露事件频发,越来越多的产品开始支持多因子认证(MFA),TOTP则是MFA领域里最普遍的一种实现方式,本文介绍TOTP的原理和华为云的实践经验. 原理 TOTP(Time-Bas ...

  9. iOS代码安全加固利器:深入探讨字符串和代码混淆器的作用

    ​ 在网上搜"代码混淆"关键词,可以看到n多教程.包括本篇博客,大部分重要内容也是从网上各位大神的博客里面看到然后摘取和总结出来的.虽然网上都有,但是对于我个人来说,很难找到一篇博 ...

  10. MongoDB 读写分离——MongoDB 安装

    下载安装包:https://www.mongodb.com/try/download/community 同一台电脑装了两服务,所以下载zip包,单机服务 mis 安装方便些 解压并重命名. 4.2  ...