当前位置: 首页 > news >正文

石景山富阳网站建设建程网工程信息网

石景山富阳网站建设,建程网工程信息网,商城网站建设注意什么,自己做网站推广关键词本文转载自公众号 匠心零度问题现象 代码如下#xff0c;使用 ParNew Serial Old 回收器组合与使用 ParNew CMS 回收器组合时#xff0c;结果为什么差异如此之大 #xff1f;private static final int _1MB 1024 * 1024;public static void main(String[] args) throws …本文转载自公众号  匠心零度问题现象 代码如下使用 ParNew Serial Old 回收器组合与使用 ParNew CMS 回收器组合时结果为什么差异如此之大 private static final int _1MB 1024 * 1024;public static void main(String[] args) throws Exception {byte[] all1 new byte[2 * _1MB];byte[] all2 new byte[2 * _1MB];byte[] all3 new byte[2 * _1MB];byte[] all4 new byte[7 * _1MB];System.in.read();}jvm参数配置如下-Xmx20m-Xms20m-Xmn10m-XX:UseParNewGC-XX:UseConcMarkSweepGC-XX:UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction75 通过jstat命令查看结果如下 关于jstat命令详情可以参考https://docs.oracle.com/javase/8/docs/technotes/tools/unix/jstat.html jvm参数调整如下-Xmx20m-Xms20m-Xmn10m-XX:UseParNewGC 通过jstat命令查看结果如下说明 上面的题目仅仅是一个切入点而已希望通过一个切入点把jvm的一些基础知识刚刚好说明下顺便解答下上面的现象。 内存相关简单说明图中参数-Xms设置最小堆空间大小一般建议和-Xmx一样。-Xmx设置最大堆空间大小。-Xmn设置新生代大小。-XX:MetaspaceSize设置最小元数据空间大小。-XX:MaxMetaspaceSize设置最大元数据空间大小。-Xss设置每个线程的堆栈大小这里有个故事3年前用正则表达式后续有空正则表达式再说。 备注tenured空间就用减法操作即可明白堆空间大小减去年轻代大小就可以了。说到这里下面这个几个参数应该明白了。-Xmx20m-Xms20m-Xmn10m 备注参数-XX:SurvivorRatio用来表示s0、s1、eden之间的比例默认情况下-XX:SurvivorRatio8表示 s0:s1:eden1:1:8。得出结论eden8M,s01M,s11M,tenured10M。 JVM垃圾回收期组合 还有一个问题需要解决jvm垃圾回收器方面下面这个图我是我的JVM菜鸟进阶高手之路八一些细节里面的当时依稀记得这个图应该是飞哥发给我的。 由于那个时候jdk9还没有出来可以去看看我的JVM菜鸟进阶高手之路十二jdk9、JVM方面变化 蹭热度虽然有些有些稍微去掉了但是整体的组合还是影响不大。 由于上面的2个jvm参数都是基于分代收集算法的先不考虑G1 依据对象的存活周期进行分为新生代老年代。根据不同代的特点选取合适的收集算法新生代适合复制算法老年代适合标记清理或者标记压缩 复制算法 将原有的内存空间分为两块每次只使用其中一块在垃圾回收时将正在使用的内存中的存活对象复制到未使用的内存块中之后清除正在使用的内存块中的所有对象交换两个内存的角色完成垃圾回收。不适用于存活对象较多的场合 如老年代。年轻代对象基本都是朝生夕灭所以特别适合由于那样的话复制就少如果类似老年代有大量存活对象那么进行复制算法性能就不是特别好了 备注使用复制算法的优点每次都是对其中的一块进行内存回收内存分配时也就不用考虑内存碎片等复杂情况了使用复制算法的缺点对空间有一定浪费所以复制空间一般不会特别大。标记清除标记-清除算法将垃圾回收分为两个阶段标记阶段和清除阶段。在标记阶段首先先找出根对象标记所有从根节点开始的可达对象。因此未被标记的对象就是未被引用的垃圾对象。然后在清除阶段清除所有未被标记的对象。 备注java根对象虚拟机栈中引用的对象。方法区中类静态属性实体引用的对象。方法区中常量引用的对象。本地方法栈中JNI引用的对象。等等。标记清除算法缺点标记清除会产生不连续的内存碎片如果空间内存碎片过多会导致当程序在运行过程中需要分配空间时找不到足够的连续空间而不得不提前触发一次垃圾收集动作根据算法不一样效果也不一样。标记压缩标记-压缩算法适合用于存活对象较多的场合如老年代。它在标记-清除算法的基础上做了一些优化。和标记-清除算法一样标记-压缩算法也首先需要从根节点开始对所有可达对象做一次标记。但之后它并不简单的清理未标记的对象而是将所有的存活对象压缩到内存的一端。之后清理边界外所有的空间。 备注这样带来的好处就是不会参数内存碎片问题了。上面已经说明了这么多了我们可以继续说明上题中JVM的其他参数了。-XX:UseParNewGC-XX:UseConcMarkSweepGC -XX:UseParNewGC 表示新生代使用ParNew并行收集器-XX:UseConcMarkSweepGC 表示老年代使用CMS回收器CMS收集器是基于“标记-清除”算法实现的特别提醒由于CMS是标记清除算法实现的所以是存在碎片问题的。可以去看看我的JVM菜鸟进阶高手之路六JVM每隔一小时执行一次Full GC、以及JVM菜鸟进阶高手之路七tomcat调优以及tomcat7、8性能对比图片就取的这两篇里面的。 备注通过jstat -gcutil pid 查看的FGC这列的时候CMS gc通常都是2一次的由于CMS-initial-mark和CMS-remark会stop-the-world。所以看到这个图的FGC应该没有什么问题了吧。-XX:UseCMSInitiatingOccupancyOnly-XX:CMSInitiatingOccupancyFraction75 还有这2个参数关于cms的-XX:UseCMSInitiatingOccupancyOnly表示JVM不基于运行时收集的数据来启动CMS垃圾收集周期通过CMSInitiatingOccupancyFraction的值进行每一次CMS收集-XX:CMSInitiatingOccupancyFraction75 表示当老年代的使用率达到阈值75%时会触发CMS GC。 备注jstat -gcutil可以看出上图的老年代的使用率才60.02%还有最后一个参数解释:-XX:UseParNewGC -XX:UseParNewGC 表示新生代使用ParNew并行收集器那么老年代呢可以让同样参数修改代码执行一次old gc即可看日志有类似[Tenured:说明老年代使用的是Serial Old 备注Serial Old使用的是标记压缩算法。解题private static final int _1MB  1024 * 1024;   public static void main(String[] args) throws Exception {       byte[] all1  new byte[2 * _1MB];       byte[] all2  new byte[2 * _1MB];       byte[] all3  new byte[2 * _1MB];       byte[] all4  new byte[7 * _1MB];       System.in.read();   } 说明最后System.in.read();这句可以忽略只是为了让程序阻塞在那里不结束这样好看日志好看现象而已。 聪明如你一下子应该可以看到问题本质:同一份代码jvm参数堆设置啥的都一样年轻代gc参数也一样唯一不同的就在于老年代gc使用上面而jstat -gcutil图表中FGC没变的应该是正常结果变了的CMS那个就是意外结果所以关键点就在CMS上面了。 先来说说all1 、all12、all3、对象实例化开辟空间之后eden空间都够他们都在eden空间中当all4过来的时候eden空间不够了需要执行ygc了。下面有2个问题需要说明1、如果s0能存的下可以看看JVM菜鸟进阶高手之路三MaxTenuringThreshold新生代的对象正常情况下最多经过多少次YGC的过程会晋升到老生代CMS情况下默认为6说到这里可能还需要提一个参数-XX:TargetSurvivorRatio可以参考飞哥的JVM Survivor行为一探究竟http://www.jianshu.com/p/f91fde4628a5 2、如果s0存不下就是我们这里的情况由于我们这里s0就是1M而已所以直接进入到old空间了所以可以看出来jstat -gcutil 里面的老年代的比例都是60%几了吧。ygc执行完成之后all4就还可以在eden分配空间够所以可以看出来jstat -gcutil 里面的eden的比例都是89%几了吧 备注-XX:PretenureSizeThreshold参数来设置多大的对象直接进入老年代这个参数其实只对串行回收器和ParNew有效对ParallelGC无效。如果是-Xmx20m -Xms20m -Xmn10m -XX:UseParNewGC 这套参数那么结果就是如图可以解释了并且每个参数比例啥的都可以理解了。 下面来好好解释下这个现象聪明如你一下子应该可以看到一个问题那么就是时间间隔是每隔2s执行一次没错就是2s执行一次。需要说道-XX:CMSWaitDuration(Time in milliseconds that CMS thread waits for young GC)默认值是2s我们修改为-XX:CMSWaitDuration5000看看效果看到了吧修改为5s就是5s执行一次变化了。那么至于为什么会执行呢 本题就是当前新生代的对象是否能够全部顺利的晋升到老年代如果不能会触发CMS GC。—————END—————
http://www.zqtcl.cn/news/605000/

相关文章:

  • 男做基视频网站国家重点高新技术企业名单
  • 公司官方网站开发网站建设电子商务
  • seo网站优化系统搜索引擎优化排名案例
  • 郑州网站建设工作室网站建设全流程 知乎
  • 如何利用源码做网站外贸网站制作推广
  • 国内做网站哪家公司好免费查找资料的网站
  • 自己做的网站百度搜不到搭建网站seo
  • 奇墙网站建设高端网站建设公司联系电话
  • 宁波那家公司做网站好中企动力科技股份有限公司招聘
  • 水果网站推广网站首页静态好还是动态好
  • iis网站属性小程序源码无需服务器
  • 景区网站建设材料代运营有哪些套路坑
  • 六安电商网站建设哪家好有关做美食的网站
  • 卸载wordpress插件网店seo关键词
  • 金山网站制作赤城seo网站优化排名
  • 提供坪山网站建设深圳商城网站哪家做的好
  • 有什么网站可以帮人做模具吗热搜榜百度一下你就知道
  • 深圳网站优化技巧邹城住房城乡建设部网站
  • 小型企业网站建站桂林市中考信息网官网
  • 雏鸟app网站推广做网站用宋体有版权问题吗
  • 建立网站数据库开公司流程及费用2022最新
  • 外贸谷歌网站推广wordpress调用上传图片
  • 360提示危险网站原因威海 网站开发
  • 赣州本地网站网站怎么写
  • 物业公司网站设计湛江做网站软件
  • 做招聘求职网站wordpress启用插件出错
  • 珠海网站运营网站个人备案流程
  • 网站开发用什么图片格式最好网络营销名词解释是什么
  • 做柜子网站老电脑做网站服务器
  • 域名购买网站网店装修是什么