一文让你彻底明白JVM参数该怎么设置

1 篇文章 0 订阅
订阅专栏

目录

前言

本文主线

JVM运行时数据区分析

JDK1.7及以前

JDK1.8

JVM参数设置的注意点

GC 垃圾回收过程

JVM参数配置指南


前言

在网上查了很多如何配置JVM参数的讲解文章,但是生产环境里JVM参数的值到底配置为多少,却没能得到一个具体的规范;确实,生产环境受到各方面的影响,设置合适的JVM参数实在比较困难,但是本文将会给大家一个相对合理的参数设置指标。

本文主线

①、JVM运行时数据区分析

②、JVM参数设置时的注意点

③、简单的GC垃圾回收过程描述

④、最终JVM参数配置指南

本文为转载文章,原作者: 蓝山牧童, 原文地址: jdk1.8——jvm分析与调优

JVM运行时数据区分析

下面将主要分析下  1.7、1.8 两个不同的JDK版本下的JVM运行时数据区。

 

JDK1.7及以前

JDK 1.7及以前,Java 类信息、常量池、静态变量都存储在 Perm(永久代)里。类的元数据和静态变量在类加载的时候分配到 Perm,当类被卸载的时候垃圾收集器从 Perm 处理掉。

JDK1.8

JDK 1.8 的对 JVM 架构的改造将类元数据放到 本地内存中 ,另外,将 常量池和静态变量 放到 Java 堆里。HotSopt VM 将会为类的元数据明确分配和释放本地内存。

在这种架构下,类元信息就突破了原来 -XX:MaxPermSize 最大方法区大小参数的限制,所以PermSize的JVM配置参数也是无效的,现在可以使用更多的本地内存。

这样就从一定程度上解决了在运行时使用反射、代理等操作生成的大量 类实例 的问题,从而极大的降低了触发Full GC的问题,以及降低了出现 OutOfMemoryError: PermGen 方法区内存溢出的问题。

JDK1.7的JVM部分运行时数据区展示

干货内容:

可以发现最明显的一个变化是元空间从 虚拟机转移到本地内存 ;默认情况下,元空间的大小仅受本地内存的限制。这意味着以后几乎不再会因为永久代空间不够而抛出OOM异常了。

jdk1.8以前版本的class和jar包数据存储在permGen下面 ,permGen大小是固定的,而且项目之间无法共用公有的class,所以很容易碰到OOM异常。

改成metaSpaces后,各个项目会共享同样的class内存空间,比如多个项目都引用了apache-common包,在metaSpaces中只会存储一份apache-common的class,提高了内存的利用率,垃圾回收更有效率。

JVM参数设置的注意点

1、在jdk1.7及以前,生产环境一般有如下配置:

-XX:PermSize=512M -XX:MaxPermSize=1024M

表示在JVM里存储Java类信息,常量池和静态变量的 永久代(方法区) 区域初始大小为512M,最大为1024M。在项目启动后,这个值是固定的,如果项目 class(类实例) 过多,很可能会导致OutOfMemoryError: PermGen异常。

升级JDK1.8之后,上面的perm配置已经变成:

-XX:MetaspaceSize=512M XX:MaxMetaspaceSize=1024M

元空间MetaspaceSize如果不做配置,通过jinfo查看默认MetaspaceSize大小(约21M),MaxMetaspaceSize最大元空间则很大很大,前面说过MetaSpace只受本地内存大小限制

jinfo -flag MetaspaceSize 1234  #结果为:-XX:MetaspaceSize=21807104
jinfo -flag MaxMetaspaceSize 1234 #结果为:-XX:MaxMetaspaceSize=18446744073709547520

干货内容:

MetaspaceSize触发FullGC的阈值,默认约为21M,如做了配置,最小阈值为自定义配置大小。空间使用达到阈值,触发FullGC,同时对该值扩大。当然如果元空间实际使用小于阈值,在GC的时候也会对该值缩小。

MaxMetaspaceSize为元空间的最大值,如果设置太小,就会和上面提到的一样,可能会导致频繁FullGC,甚至OOM。

GC 垃圾回收过程

首先贴上一张摘抄自网上的大图,结合此大图可以更加清晰的说明GC的过程:

垃圾回收过程:

下面说的GC流程中,新生代中的对象晋升到年老代中的条件是  年龄阀值 ;除此之外还有很多其它的晋升条件,后面会再细说。

①、新new的对象都放在Eden区(伊甸园嘛,创造的地方)

②、记住新生代的GC算法是 复制算法 。Eden区满或者快满的时候触发GC时(Minor Gc);在GC刚开始的时候,对象只会存在于Eden区和名为 From 的Survivor区,Survivor区 To 是空的。紧接着进行GC,Eden区中所有存活的对象都会被复制到 To 区,而在 From 区中,仍存活的对象会根据他们的年龄值来决定去向。

③、年龄达到一定值(年龄阈值,可以通过 -XX:MaxTenuringThreshold 来设置,默认是 15 )的对象会被移动到年老代中,没有达到阈值的对象会被复制到Survivor To 区域。

④、经过这次GC后,Eden区和From区已经被清空。这个时候, From和To 会交换它们的角色,也就是新的 To 就是上次GC前的 From,新的 From 就是上次GC前的 To 。

⑤、不管怎样,都会保证名为 To 的Survivor区域是空的。Minor GC会一直重复这样的过程,直到 To 区被填满, To 区被填满之后,会将所有对象移动到年老代中。

⑥、注意:当在触发Minor GC时,发现堆新生代中还存活的年龄达到阀值的对象的容量,比目前年老代中剩余空间还大的话,说明年老代存放不下,就会直接触发一次Full GC,而不再去触发Minor GC 了。

清理新生代(Eden区和Survivor区)叫Minor GC;清理年老代(Old区)叫Major GC;清理整个堆空间(年轻代和老年代)以及永久代(方法区)叫Full GC。

再贴一张大图配合理解GC的过程:

新生代对象晋升到年老代的条件:

①、如果对象的大小大于Eden的二分之一会直接分配在old年老代,如果old也分配不下,会做一次major GC,如果小于Eden的一半但是没有足够的空间,就进行minor GC也就是新生代GC。

②、minor GC后,Survivor仍然放不下,则放到Old老年代。

③、动态年龄判断 ,大于等于某个年龄的对象超过了Survivor空间一半 ,大于等于某个年龄的对象直接进入老年代。

JVM参数配置指南

前面三个部分对JVM进行了整体的了解,接下来是本文的重点。

-XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M -Xms256m -Xmx256m

文章看下来上面这段配置的意思很简单,设置元空间的初始值和最大值,设置堆空间的初始值和最大值。

为什么MetaspaceSize要设置为128M?为什么堆内存初始值Xms设置为256M而不是512M?

按照Java官方的指导:

①、Java堆大小设置,Xms 和 Xmx设置为老年代存活对象的3-4倍,即Full GC之后的老年代内存占用的3-4倍。

②、永久代 PermSize和MaxPermSize(元空间)设置为老年代存活对象的1.2-1.5倍。

③、年轻代Xmn的设置为老年代存活对象的1-1.5倍。

④、老年代的内存大小设置为老年代存活对象的2-3倍。

使用一个模仿生成环境进行测试运行一段时间后,获取JVM参数数据。然后再进行设置实际的JVM参数;如下用jstat工具查看jvm的情况:

jstat -gc 12345
###
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT   
13824.0 22528.0 13377.0  0.0   548864.0 535257.2  113152.0   46189.3   73984.0 71119.8 9728.0 9196.2     14    0.259   3      0.287    0.546

OU表示老年代所占用的内存为 46189.3 K(大约45M);那么jvm相应的配置参数应该做如下修改:

-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -Xms180m -Xmx180m

 

JVM 参数汇总
mingchengtx的专栏
12-21 1496
1.-Xmx3550m:设置JVM最大可用内存为3550M -Xms3550m:设置JVM初使内存为3550m -Xmn2g:设置年轻代大小为2G ,年轻代包括Eden区,Survivor0区和Suvivor1区 -Xss128k:设置每个线程的堆栈大小 -XX:SurvivorRatio 用于设置Eden和其中一个Survivor的比值 -XX:MaxTenuringThreshold=0:设置垃圾最大年龄 -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效 -XX:.
JVMjava 虚拟机)内存设置
m0_67402914的博客
04-20 1万+
个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 一、设置JVM内存设置 1. 设置JVM内存的参数有四个: -XmxJava Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定; -XmsJava Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值; -XmnJava Heap Young区大小,不熟悉最好保留默认值; -Xss每个线程的Stack大小,不熟悉最好保留默认值; 2. 如何设.
JVM内存配置参数
m0_67392931的博客
04-19 5057
题目 对于JVM内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 ,其最小内存值和Survivor区总大小分别是() A 5120m,1024m B 5120m,2048m C 10240m,1024m D 10240m,2048m 答案解析 正确答案是:D -Xmx:最大堆大小 -Xms:初始堆大小 -Xmn: 年轻代大小 -XXSurvivorRatio=3:代表Eden:Survivor = 3 根据Generation-Coll.
jvm参数配置
m0_67402235的博客
09-07 1373
XX:InitiatingHeapOccupancyPercent=n 启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45.-XX:SurvivorRatio=8       Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10。
tomcat如何添jvm参数
Mr lebron的博客
11-16 3037
tomcat配置jvm参数不建议直接在bin/catalina.sh里面配置,而是写在bin/setenv.sh里,没有就新建一个,文件读权限自行配置. 例如: export CATALINA_OPTS="$CATALINA_OPTS -Xms1024m -Xmx4096m" export CATALINA_OPTS="$CATALINA_OPTS -XX:+PrintGCD...
jvm参数设置_JVM参数设置_
10-02
JVM参数设置,提供java虚拟机运行时的参数设置
IntelliJ IDEA设置JVM运行参数的操作方法
08-27
IntelliJ IDEA设置JVM运行参数的操作方法 IntelliJ IDEA是一款功能强大且流行的集成开发环境(IDE),它提供了丰富的功能来帮助开发者快速高效地开发和调试Java应用程序。其中,设置JVM运行参数是非常重要的一步,...
IDEA设置JVM运行参数的方法步骤
08-18
IDEA设置JVM运行参数的方法步骤 IDEA是JetBrains公司开发的一款功能强大且功能全面的集成开发环境(Integrated Development Environment),其提供了许多实用的功能和设置选项,其中包括设置JVM运行参数的功能。...
java代码中获取JVM参数的方法
08-31
这将打印出所有传递给JVM的命令行参数,包括-Xms、-Xmx等内存设置。 其次,`Runtime.getRuntime()`方法可以用来获取与当前Java应用相关的运行时信息,如总内存、空闲内存和最大内存: 4. 获取Java虚拟机中的内存...
tomcat6.0 修改启动内存设置 java jvm参数配置
10-10
在/usr/local/apache-tomcat-5.5.23/bin目录下的catalina.sh 添JAVA_OPTS='-Xms512m -Xmx1024m' 要“m”说明是MB,否则就是KB了,在启动tomcat时会报内存不足。 -Xms:初始值 ...重起tomcat服务,设置生效
正确配置JVM参数-附JVM参数详解
web18334137065的博客
04-29 2664
一、内存配置参数 1、参数详解 JVM参数类型 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容。 非标准参数(-X) 默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足,且不保证向后兼容。 非Stable参数(-XX) 此类参数各个jvm实现会有所不同,将来可能会随时取消,需要慎重使用 JVMc参数几种类型说明: 布尔型参数选项:-XX:+ 打开, -XX:- 关闭。 数字型参数选项通过-XX:=设定。 字符行参数选项通过-XX:=设定,通常用来指定一个文件,路径,
我的世界java参数优化,教程/提高帧率 - Minecraft Wiki,最详细的官方我的世界百科...
weixin_39672680的博客
03-11 9468
帧率(Frame rate,又称FPS)是视频设备产生叫作帧的独特连续图像的频率。帧是静态图像,当组合在一起的时候,就成为了流媒体,这是所有的移动媒体的基础。帧率通常表示每秒的帧数(FPS)。低FPS将会导致不稳定的游戏体验,在极端情况下,几秒才会显示一个画面。高难度的计算(像点燃许多数量的TNT或在Minecraft里生成一群生物)会使FPS暂时降低,甚至完全停止几秒。注意显示的FPS可能不准确...
jvm参数设置方法(win10)
...
03-25 1万+
jvm中常用的参数含义: 1: -Xmx 指定 jvm 的最大内存大小 , 如 :-Xmx=2048M(根据设备物理内存以及实际情况设定,建议为物理内存的80%)2: -Xms 指定 jvm 的初始内存大小 , 如 :-Xms=2048M, 高并发应用, 建议和-Xmx一样, 防止因为内存收缩/突然增大带来的性能影响. 3: -Xmn 指定 jvm 中 New Generation (堆空
IDEA中设置JVM参数
自律的西瓜L
10-01 1万+
IDEA中设置JVM参数的方式有两种,一种是针对某个应用配置JVM参数,另一种是设置全局的JVM参数
设置JVM参数
suchenbin的博客
10-28 231
eclipse中设置jvm参数 1)、Window → preferences,这么设置适用于eclipse中所有项目 2)、选中类(eg:Test.class)→ 右键Run As→ Run Configurations,(如果Java Application中没有Test,则先运行一下Test中的main方法)适用于单个类(eg:main方法测试使用) Tomcat设置JVM...
JVM--内存参数设置及常见错误总结
szzt_lingpeng的专栏
01-06 2万+
一、  JVM规范   JVM规范对Java运行时的内存划定了几块区域(详见这里),有:JVM栈(Java Virtual Machine Stacks)、堆(Heap)、方法区(Method Area)、常量池(Runtime Constant Pool)、本地方法栈(Native Method Stacks),但对各块区域的内存布局和地址空间却没有明确规定,而留给各JVM厂商发挥的空间。 ...
JVM常用内存参数配置
热门推荐
大鹏
11-08 6万+
一、    常用参数   -Xms    JVM启动时申请的初始Heap值,默认为操作系统物理内存的1/64但小于1G。默认当空余堆内存大于70%时,JVM会减小heap的大小到-Xms指定的大小,可通过-XX:MaxHeapFreeRation=来指定这个比列。Server端JVM最好将-Xms和-Xmx设为相同值,避免每次垃圾回收完成后JVM重新分配内存;开发测试机JVM可以保留默认值。
你说的JVM参数在哪里设置
最新发布
05-27
你可以在启动应用程序时使用JVM参数设置。在命令行中运行应用程序时,你可以使用以下命令来设置JVM参数: ``` java --illegal-access=permit -jar yourApplication.jar ``` 这将使应用程序在启动时启用非法反射访问警告。请注意,这种方式只在本次启动中有效。 如果你想永久性地解决这个问题,你需要在应用程序中设置JVM参数。具体来说,你可以在你的应用程序中使用以下代码来设置JVM参数: ```java System.setProperty("illegal.access", "permit"); ``` 将这行代码放在你的应用程序启动代码的前面,即可永久性地解决这个问题。

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

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

热门文章

  • java获取当前年份、月份和日期字符串等 37501
  • seata1.3.0中 can not register RM,err:can not connect to services-server. 27692
  • 解决com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection.问题 19469
  • Springboot配置excludePathPatterns不生效问题解决 17373
  • mysql报错 Communications link failure during rollback(). Transaction resolution unknown.解决方式 11833

分类专栏

  • docker 2篇
  • java 23篇
  • Scheduled 1篇
  • lunix 9篇
  • seata 2篇
  • ElasticSearch 2篇
  • mysql 4篇
  • jvm 1篇
  • JPA 1篇
  • SpringCloud 2篇
  • IDEA 2篇
  • maven 1篇
  • git 1篇
  • springboot 2篇
  • 前端 3篇
  • 面板监控 1篇

最新评论

  • java获取当前年份、月份和日期字符串等

    Joseph9499: 好的,感谢指正,已修改表情包

  • java获取当前年份、月份和日期字符串等

    阿 帆 达: 错误代码: //当前日 calenedar -> calendar

  • Hystrix超时时间设置

    leery_lr: 赞!javabean 配置方式管用。其他各种方式都试过..无效。折磨了我一天

  • 解决com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection.问题

    努力成为一只优秀的程序猿: 加一,老兄解决了没,博主的方法都用了还是不管用

  • 解决com.alibaba.druid.pool.DruidAbstractDataSource - discard long time none received connection.问题

    wdl_wdl: 1.1.23也报这个错

大家在看

  • codeArts Snap:辅助你的编程神器 1794
  • 打卡信奥刷题(139)用Scratch图形化工具信奥P10402 [普及组]「XSOI-R1」凑点 497
  • 基于FPGA的A律压缩解压缩verilog实现,包含testbench
  • 基于FPGA的MSK调制解调系统verilog开发,包含testbench,同步模块,高斯信道模拟模块,误码率统计模块 595

最新文章

  • Spring @Scheduled 星期几(周)定时任务没执行
  • 动态代理总结,你要知道的都在这里,无废话!
  • Java之IO流
2022年1篇
2021年7篇
2020年20篇
2019年33篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司塘坑网站搭建平湖企业网站建设龙华SEO按天扣费宝安建站塘坑网站优化推广福永关键词排名包年推广石岩百度竞价包年推广观澜外贸网站设计爱联关键词排名西乡高端网站设计大芬网站优化软件坪山外贸网站建设南澳标王同乐网站定制双龙网站优化按天收费南山网站建设设计西乡网络推广观澜企业网站设计坑梓网站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 网站制作 网站优化