首页 > 系统相关 >[转帖]JVM优化之调整大内存分页(LargePage)

[转帖]JVM优化之调整大内存分页(LargePage)

时间:2024-03-20 17:55:52浏览次数:26  
标签:分页 OS 转帖 TLB 内存 JVM proc LargePage

https://nowjava.com/article/31311

 

本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大内分页的副作用。OK,让我们开始吧!

内存分页大小对性能的提升原理

首先,我们需要回顾一小部分计算机组成原理,这对理解大内存分页至于JVM性能的提升是有好处的。

什么是内存分页?
我们知道,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能支持非连续性的内存分配。
在程序内存不够用时,还可以将不常用的物理内存页转移到其他存储设备上,比如磁盘,这就是大家耳熟能详的虚拟内存。

为什么要支持大内存分页?
TLB是有限的,这点毫无疑问。当超出TLB的存储极限时,就会发生 TLB miss,之后,OS就会命令CPU去访问内存上的页表。如果频繁的出现TLB miss,程序的性能会下降地很快。

为了让TLB可以存储更多的页地址映射关系,我们的做法是调大内存分页大小。

如果一个页4M,对比一个页4K,前者可以让TLB多存储1000个页地址映射关系,性能的提升是比较可观的。

调整OS和JVM内存分页

在Linux和windows下要启用大内存页,有一些限制和设置步骤。

Linux:
限制:需要2.6内核以上或2.4内核已打大内存页补丁。
确认是否支持,请在终端敲如下命令:

cat /proc/meminfo | grep Huge

HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB

如果有HugePage字样的输出内容,说明你的OS是支持大内存分页的。Hugepagesize就是默认的大内存页size。
接下来,为了让JVM可以调整大内存页size,需要设置下OS 共享内存段最大值 和 大内存页数量。

共享内存段最大值
建议这个值大于Java Heap size,这个例子里设置了4G内存。

echo 4294967295 > /proc/sys/kernel/shmmax

大内存页数量

echo 154 > /proc/sys/vm/nr_hugepages

这个值一般是 Java进程占用最大内存/单个页的大小 ,比如java设置 1.5G,单个页 10M,那么数量为 ?1536/10 = 154。
注意:因为proc是内存FS,为了不让你的设置在重启后被冲掉,建议写个脚本放到 init 阶段(rc.local)。

Windows:
限制:仅支持 windows server 2003 以上server版本
操作步骤:

  1. Control Panel -> Administrative Tools -> Local Security Policy
  2. Local Policies -> User Rights Assignment
  3. 双击 “Lock pages in memory”, 添加用户和组
  4. 重启电脑
    注意: 需要管理员操作。

单个页大小调整
JVM启用时加参数 -XX:LargePageSizeInBytes=10m
如果JDK是在1.5 update5以前的,还需要手动加 -XX:+UseLargePages,作用是启用大内存页支持。

大内存分页的副作用

因为每页size变大了,导致JVM在计算Heap内部分区(perm, new, old)内存占用比例时,会出现超出正常值的划分。最坏情况下是,某个区会多占用一个页的大小。不过后续jvm版本也在调整这个策略。

一般情况,不建议将页size调得太大,4-64M,是可以接受的(默认是4M)。为了合理设置这个值,你应该对你的系统做一下benchmark。
说实话,网上我见过调得最猛的,有调到256M,从benchmark报表上看,性能不是太坏。如果你有64位的大内存机器,不妨尝试一下。

另外,网上有很多GC调优的文章内容中都有提到 LargePageSizeInBytes,但未提任何OS限制。在OS不支持的情况下,设置这个参数,这个参数将仅仅是个摆设。

标签:分页,OS,转帖,TLB,内存,JVM,proc,LargePage
From: https://www.cnblogs.com/jinanxiaolaohu/p/18085769

相关文章

  • JVM调优实战
    今天我们运用jvm的命令,来观察一个模拟程序的GC情况,以及GC频繁的情况下,如何进行参数调整。模拟程序此程序起个5个线程任务,每个任务在不停的在创建对象。每个任务新建了1M的字节数组。我们设置java运行参数为xms60M,xms60M,后续观察下程序GC情况 运行java程序后,观察一下jv......
  • [转帖]关于mysql的时区(下):如何设置mysql的时区
    一、如何设置mysql时区1、命令1)查时区:showvariableslike'%time_zone%'返回有2行记录,要看time_zone变量的值,不需要看system_time_zone。若值为SYSTEM表示取值跟system_time_zone保持一致。system_time_zone的值是启动mysql服务的时候读取了操作系统的值,除非重新启......
  • JVM 实战 - JVM之类加载过程
    在Java虚拟机(JVM)中,类加载过程是将编译后的.class文件或其它格式的类定义数据加载到JVM内存的方法区,并为这些类型创建运行时的Class对象实例的过程。这个过程确保了Java代码能够在JVM上被正确执行。类加载主要包括以下几个步骤:加载(Loading)通过类的全限定名来查找和读取对......
  • JVM工作原理与实战(四十三):JVM常见面试题目
    专栏导航JVM工作原理与实战RabbitMQ入门指南从零开始了解大数据目录专栏导航前言一、JVM常见面试题目1.什么是类加载器,有哪些常见的类加载器?2.什么是双亲委派机制,以及如何打破双亲委派机制?3.如何判断堆上的对象没有被引用?4.JVM中都有哪些引用类型?5.ThreadLoca......
  • JVM内存结构
    JavaVirtualMachine(JVM)的内存结构通常被划分为以下几个部分:程序计数器(ProgramCounterRegister):程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在多线程环境下,每个线程都有自己的程序计数器,它们是线程私有的,互不干扰。Java虚......
  • JVM内存结构
    我们都知道,我们写的Java程序需要先经过编译,生成了.class文件(字节码文件)。然而,计算机并不能直接解释.class文件里面的内容,这时候就需要一个能加载、解释.class文件并且能按.class文件里的内容进行处理的一个东西--JVM。JVM,就是Java虚拟机。它是一种规范,有针对不同系统的特定实现(L......
  • JVM篇面试题 2024
    目录Java全技术栈面试题合集地址JVM篇1.描述一下JVM加载class文件的原理机制?2.Serial与ParallelGC之间的不同之处?3.Java中WeakReference与SoftReference的区别4.怎样通过Java程序来判断JVM是32位还是64位?5.32位JVM和64位JVM的最大堆内存分别是......
  • JVM原理(GC,内存),JAVA底层
    1.JVM内存模型线程独占:栈,本地方法栈,程序计数器线程共享:堆,方法区2.什么是栈又称方法栈,线程私有的,线程执行方法是都会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈.3.什么是本地方法栈与栈类似,......
  • java八股——JVM
    JVM是java面试八股中的一个重难点,本文仅是部分问题,后续遇到新的问题还会进行修改补充。上一篇传送门:点我谈谈什么是JVMJVM全称是JavaVirtualMachine,是java的虚拟机。它是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。它提供了一......
  • 【JVM】类加载子系统
    JVM(Java虚拟机)的类加载子系统是其重要组成部分之一,负责在运行时动态加载、验证、准备、解析和初始化Java类。这个过程从查找类文件到将其转换为可在JVM内部使用的运行时数据结构进行操作。以下是类加载子系统的几个关键点:类加载器:JVM定义了多种类加载器,包括引导类加载......