指定jdk8_面试官:怎么做JDK8的内存调优?

面试官:怎么做JDK8的内存调优?

602e9e5c1e1be072debe0535de6c6064.png

面试官

看着面试官真诚的眼神,心中暗想看起来年纪轻轻却提出如此直击灵魂的问题。擦了擦额头上汗,我稍微调整了一下紧张的情绪,对面试官说:

在内存调优之前,需要先了解JDK8的内存区域是怎么划分的:

JDK8内存结构

JDK8的内存结构主要包括程序计数器(Program Counter Register)、虚拟机栈(Java Virtual Machine Stacks)、本地方法栈(Native Method Stacks)、(Java Heap)、元空间(Metaspace)。

其中又被划分为老年代(Old Generation)、年轻代(Young Generation),其中年轻代又被划分为一个Eden区和两个Survivor区

一边说着,一边拿起笔在纸上画了起来:

3b04adadd2e23e9b71ec74d5871b28a3.png

画完以后,我又说:JDK8的内存调优主要针对的是堆和元空间。内存调优时常用到JVM参数有这些:

-server

JVM的server模式, 在多CPU服务器中性能可以得到更好地发挥。JDK的64位版本只支持server模式,因此在这种情况下,选项是隐式的。

-Xmx

指定堆所分配内存的最大值,等同于-XX:MaxHeapSize。不附加字母时,单位为byte,必须是1024的倍数,并且大于2MB;附加字母k或K时,表示单位为KB;附加字母m或M时,表示单位为MB;附加字母g或G时,表示单位为G。

下面的例子是使用不同的单位把堆所分配内存的最大值设置为1GB:

-Xmx1G-Xmx1024M-Xmx1048576K-Xmx1073741824

-Xms

指定堆所分配内存的初始值,不附加字母时,单位为byte,必须是1024的倍数,并且大于1MB;附加字母k或K时,表示单位为KB;附加字母m或M时,表示单位为MB;附加字母g或G时,表示单位为G。如果不设置这个初始值,那么初始值将被设置为老年代和年轻代分配内存的大小的总和。

下面的例子是使用不同的单位把堆所分配的初始值设置为4GB:

-Xms4G-Xms4096M-Xms4194304K-Xms4294967296

对于生产环境的部署,-Xms和-Xmx通常设置为相同的值。

-Xmn

指定堆的年轻代分配内存的初始值和最大值,不附加字母时,单位为byte;附加字母k或K时,表示单位为KB;附加字母m或M时,表示单位为MB;附加字母g或G时,表示单位为G。

堆的年轻代区域用于存放新生对象。与其他区域相比,在这个区域执行垃圾回收的频率更高。如果年轻代的内存太小,那么将执行许多次垃圾回收。如果年轻代的内存太大,那么执行完整的垃圾回收可能需要很长时间才能完成。一般建议把年轻代的大小保持在整个堆大小的1/2到1/4之间。

下面的例子是使用不同的单位把年轻代所分配内存的初始值和最大值设置为2GB:

-Xmn2G-Xmn2048M-Xmn2097152K-Xmn2147483648

除了使用-Xmn选项设置年轻代的初始值和最大值,还可以使用-XX:NewSize设置年轻代的初始值,使用-XX:MaxNewSize设置年轻代的最大值。

-XX:NewRatio

指定老年代和年轻代空间大小的比率。默认为2,即老年代和年轻代空间大小的比率为2:1,年轻代占整个堆内存空间大小的1/3。下面的例子是把老年代和年轻代空间大小的比率设置为1:

-XX:NewRatio=1

另外,年轻代分配内存设置的优先级如下:

  1. 高优先级: -XX:NewSize/-XX:MaxNewSize
  2. 中优先级: -Xmn
  3. 低优先级: -XX:NewRatio

-XX:SurvivorRatio

指定Eden区和一个Survivor区的空间大小的比率。默认为8,即Eden区和一个Survivor区的空间大小为8:1,因为一共有两个Survivor区,所以Eden区占年轻代内存大小的80%。下面的例子是把Eden区和一个Survivor区的空间大小的比率设置为4:

-XX:SurvivorRatio=4

-XX:MetaspaceSize

指定元空间第一次触发垃圾回收的内存大小的阈值。当元空间内存占用不断增大,直到达到这个阈值时,就会触发一次垃圾回收。所以,适当的增大这个阈值,会减少垃圾回收的次数。默认值根据平台而定,一般情况下大约20.8MB。下面的例子是把元空间第一次触发垃圾回收的内存大小设置为256MB:

-XX:MetaspaceSize=256M

有一些小伙伴对这个参数有误解,造成不必要的麻烦。重申一下:-XX:MetaspaceSize不是元空间内存大小的初始值,不是元空间内存大小的初始值,不是元空间内存大小的初始值,重要的事情说三遍。

-XX:MaxMetaspaceSize

指定元空间所分配内存的最大值,默认是没有限制,取决于系统的可用内存量,理论上可以占满整个系统的内存。为了避免这种惨剧,影响系统上的其他应用,需要适当设置它的大小。下面的例子是把元空间所分配内存的最大值设置为512MB:

-XX:MaxMetaspaceSize=512M

面试官微笑地说:这些常用的内存调优参数总结的不错,可以结合这些参数写一个内存调优实例吗?

被面试官夸奖一下,我按捺住心中的喜悦说:当然可以。

内存调优实例

尽可能把堆内存的空间设置大一些,以减少垃圾回收的次数。假设服务器上的可用内存还有12GB,那么先指定堆所分配内存的最大值和初始值为8GB。一般情况下,年轻代内存大小需在整个堆大小的1/2到1/4之间,那么就指定年轻代内存大小为3GB。再把Eden区和一个Survivor区的空间大小的比率设置为4。元空间第一次触发垃圾回收的内存大小的阈值设置为256MB,一般情况下足够用。元空间所分配内存的最大值设置为512MB,为了避免极端情况下占用大量内存。另外,还需要明确指定JVM以server模式启动。

内存调优的参数基本敲定,用它启动一个名为one-more-study-0.0.1-SNAPSHOT.jar的jar文件:

java -server -Xmx8G -Xms8G -Xmn3G -XX:SurvivorRatio=4 -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=512M -jar one-more-study-0.0.1-SNAPSHOT.jar

如果执行jmap -heap命令查看对应Java进程的内存配置和使用情况,应该是这样的:

Attaching to process ID 31828, please wait...Debugger attached successfully.Server compiler detected.JVM version is 25.251-b08using thread-local object allocation.Parallel GC with 8 thread(s)Heap Configuration:   #堆的内存配置   MinHeapFreeRatio         = 0   MaxHeapFreeRatio         = 100   # 堆内存的最大值   MaxHeapSize       = 8589934592 (8192.0MB)    # 年轻代内存的大小   NewSize           = 3221225472 (3072.0MB)    # 年轻代内存的最大值   MaxNewSize        = 3221225472 (3072.0MB)    # 老年代内存的大小   OldSize           = 5368709120 (5120.0MB)     # 老年代和年轻代空间大小的比率    # 因为设置Xmn参数,该设置未生效   NewRatio                 = 2   #Eden区和一个Survivor区的空间大小的比率   SurvivorRatio            = 4     # 元空间第一次触发垃圾回收的内存大小   MetaspaceSize       = 268435456 (256.0MB)    # 元空间内存的最大值   MaxMetaspaceSize    = 536870912 (512.0MB)   G1HeapRegionSize    = 0 (0.0MB)Heap Usage: # 堆的使用情况PS Young GenerationEden Space: # Eden区内存的使用情况   capacity = 2147483648 (2048.0MB)   used     = 901945720 (860.16MB)   free     = 1245537928 (1187.83MB)   42.000120505690575% usedFrom Space: # Survivor的From区内存的使用情况   capacity = 536870912 (512.0MB)   used     = 0 (0.0MB)   free     = 536870912 (512.0MB)   0.0% usedTo Space: # Survivor的To区内存的使用情况   capacity = 536870912 (512.0MB)   used     = 0 (0.0MB)   free     = 536870912 (512.0MB)   0.0% usedPS Old Generation # 老年代内存的使用情况   capacity = 5368709120 (5120.0MB)   used     = 0 (0.0MB)   free     = 5368709120 (5120.0MB)   0.0% used12047 interned Strings occupying 1045744 bytes.

听了我的回答后,面试官对我会心一笑,我仿佛还在她的眼神中看到了一丝敬仰。正所谓:万两黄金容易得,知心一个也难求,欲知后事如何,且听下回分解。

肝博士杨明博大夫
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kafka启动:Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memor
weixin_41070431的博客
07-02 1万+
错误信息如下:Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12) # # There is insufficient memory for the ...
JVM源码剖析之-Xms和-Xmx参数最小的设置值是多少
李哈zzz的博客
07-17 3393
JVM是一个运行在操作系统上的虚拟机。因为是一台虚拟的机器,所以对于内存肯定是可以控制的,恰好JVM提供了众多个参数控制内部运行时,而Xms和Xmx两个参数是用来控制Java堆内存的最小内存和最大内存。可能不少读者会好奇Xms和Xmx两个参数能够设置的最小值是多少,所以笔者借助源码来简单论述~答案先放在这里JDK8JDK12。
kafka启动报错failed to map 1073741824 bytes for committing reserved memory
JustTryIT
01-16 1201
kafka启动./bin/kafka-server-start.sh config/server.properties 报错:failed to map 1073741824 bytes for committing reserved memory 服务器内存不够,无法分配内存. 1. 查看服务器空闲内存多少 free -h 2. 修改kafka启动文件bin/kafka-server-s...
JVM内存分配(JDK8)
paopaodog的博客
10-04 1500
以一个Math类为列,从JVM运行时内存结构,到内存分配流程,最后内存分配参数的含义,串起整个流程。文章还待后续完善。
JDK8 合理设置JVM内存参数
jiey0407的博客
04-20 4002
总述 基本知识 JDK8内存模型 参数 GC基本要点 内存数据收集工具 JVM参数整过程 一阶段(设置堆区总内存) 二阶段(整New区内存) 三阶段(整Eden与Survivor) 总述 生产系统稳定性很重要,JVM内存越大,内存溢出的风险越低。只要主机内存允许,多浪费点内存在JVM上也无可厚非。不过,用更少的资源发挥更大的作用是条正道,所以应合理设置JVM内存。 不同java应用对内存要求不同,合适的JVM参数只能通过对每个应用实际运行过程中内存占用数据收集后才能确定。即先设置初值,然后在应用运行
面试:怎么JDK8的垃圾收集器的(面试常问)
08-18
"JDK8垃圾收集器的" JDK8中有多种垃圾收集器,包括Serial收集器、Parallel收集器、CMS收集器、G1收集器等,每种垃圾收集器都有其特点和适用场景。选择合适的垃圾收集器对系统的性能和稳定性具有重要影响。 ...
IBM MAT分析工具+JDK8_64位
09-09
IBM MAT(Memory Analysis Tools分析工具+JDK8_64位
jdk1.8.0_321方下载版本.zip
07-08
jdk1.8.0_321方下载版本.zip
Windows版本JDKjdk1.8.0_192_x64.zip
05-08
1. 直接解压,比如解压到:D:\Dev\Java 2. 配置环境变量:我的电脑 ->右键菜单 ->属性 ->高级系统设置 ->环境变量 ->用户变量中Path ->编辑 ->新增:D:\Dev\Java\jdk1.8.0_192\bin
jdk1.8.0_201 win 64位 免安装版本
02-16
解压后,配置环境变量就可以用 C:\Users\Administrator>java -version java version "1.8.0_201" Java(TM) SE Runtime Environment (build 1.8.0_201-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, ...
JDK8 JVM常用参数配置
记录成长,分享收获。
04-13 2701
本文主要了解下面内容:1、JVM常用的配置参数如、内存配置参数、GC策略配置参数、日志配置参数、异常信息参数。2、通过一些辅助指令可以帮助我们查找参数的指令,以及在运行期间查看和更改一些参数配置。3、常用的一些应用启动参数,在项目启动的时候我们需要配置哪些参数。4、各种部署场景下通过什么方式配置这些参数。一、堆内存相关配置复制代码设置堆初始值指令1:-Xms2g指令2:-XX:InitialHeapSize=2048m​​设置堆区最大值-Xmx2g。
Xms、Xmx、MaxMetaspaceSize含义
m0_50635229的博客
05-06 1万+
Xms:表示JVM Heap(堆内存)最小尺寸,初始分配空间; Xmx:表示JVM Heap(堆内存)最大允许的尺寸,过小可能会导致java.lang.OutOfMemory PermSize:永久代最小尺寸,初始分配 MaxPermSize:永久代最大的尺寸,过小会导致java.lang.OutOfMemoryError:PermGen space MetaspaceSize:元空间最小尺寸,初始分配 MaxMetaspaceSize:元空间最大的尺寸 注:Java8以后,永久代被元空间取代,
40.JVM方法区(元空间)大小设置(-XX:MetaspaceSize和-XX:MaxMetaspaceSize)
热门推荐
simpleGq的专栏
07-16 3万+
目录1.方法区内存大小设置2.如何解决OOM问题?(了解) 1.方法区内存大小设置 1.方法区的大小可以不是固定的,JVM可以根据应用需要自动整。 a)JDK7及以前(了解):-XX:PermSize设置永久代初始大小。-XX:MaxPermSize设置永久代最大可分配空间。(JDK7目前已经很少用了,这两个参数在JDK8及以后已经没有了,所以不必掌握,了解一下) b) JDK8及以后:可以使用-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置元空间初始大小以及最大可分配大
JVM参数配置 JDK1.8
m0_67402096的博客
09-07 879
XX:InitiatingHeapOccupancyPercent=n 启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45.-XX:SurvivorRatio=8       Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
ankuiba5737的博客
03-27 3369
一、JVM 内存模型   根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。   1、虚拟机栈:每个线程有一个私有的栈,随着线程的创建而创建。栈里面存着的是一种叫“栈帧”的东西,每个方法会创建一个栈帧,栈帧中存放了局部变量表(基本数据类型和对象引用)、操作数栈、方法出口等信息。栈的大小可以固定也可以动态扩展。当栈用深度大于JVM所允许的...
基于JDK8 配置通用的JVM参数
qq_22074333的博客
11-15 1728
JDK8 JVM 通用参数
java8 内存设置_JDK7与8内存参数解析与修改
weixin_29306011的博客
02-16 1073
JDK内存jdk内存实际是jvm内存,jvm有一个运行时数据区,其实就是对这一部分的大小分配。运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)Xss:每个线程的stack大小(栈)Xmx:JAVA HEAP的最大值、默...
jdk8内存参数解析与修改(新的参数)
Ezrealmore
06-27 3万+
JDK内存jdk内存实际是jvm内存,jvm有一个运行时数据区,其实就是对这一部分的大小分配。运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap) Xss:每个线程的stack大小(栈) Xmx:JAVA HEAP的最大值、
面试:怎么jdk8的垃圾收集器的(面试常问)
最新发布
09-01
面试:怎么jdk8的垃圾收集器的(面试常问)。 对于jdk8的垃圾收集器的,需要我们了解垃圾收集器的工作原理和相关的参数配置。下面我将介绍几个常见的方法。 首先,我们可以通过选择合适的垃圾收集器...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 华为电脑Linux进pe,华为笔记本(HuaWei)如何进入BIOS设置U盘启动? 15103
  • 如何给计算机硬盘解除密码忘了,如何解除电脑硬盘密码 7893
  • 某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?,某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?... 6598
  • C语言4位BCD码加法器,四位二进制8421BCD码加法器 4714
  • mysql中字段约束unique_mysql中关于Unique约束操作 3719

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • Dockerfile常用命令
  • win 10系统诊断服务器,Win10系统诊断数据查看器功能如何使用
  • tp5项目更换到nignx服务器404,tp5项目 Apache切换nginx环境
2024年1篇
2021年168篇
2020年10篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司宝安seo网站推广罗湖百度网站优化排名荷坳企业网站制作木棉湾关键词排名爱联营销型网站建设深圳网站改版布吉网站搭建盐田关键词按天计费观澜企业网站建设民治网站开发光明百搜标王大运企业网站制作南澳百度网站优化排名深圳网站建设设计爱联如何制作网站吉祥网站优化软件大鹏高端网站设计广州网站推广工具吉祥seo福田网络营销西乡网站推广方案福田seo排名福永优化永湖网站推广工具南澳企业网站制作南澳网络推广塘坑网站制作横岗营销型网站建设龙岗如何制作网站松岗网站优化推广歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化