5分钟掌握JVM常用选项及相关知识,工作面试够用了,java银行面试的问题

前言

今天来带大家研究一下Linux内存管理。对于精通 CURD 的业务同学,内存管理好像离我们很远,但这个知识点虽然冷门(估计很多人学完根本就没机会用上)但绝对是基础中的基础,这就像武侠中的内功修炼,学完之后看不到立竿见影的效果,但对你日后的开发工作是大有裨益的,因为你站的更高了。

再功利点的说,面试的时候不经意间透露你懂这方面知识,并且能说出个一二三来,也许能让面试官对你更有兴趣,离升职加薪,走上人生巅峰又近了一步。

前面说过,随着java程序运行,堆会从初始值开始稳步增长,当达到最大值以后就不再增长,以后主要靠GC来回收内存。所以,堆最大值的设置要比最小值谨慎,配置小了,程序内存不够用,频繁GC;配置得太大,每次GC时间比较长,程序有停顿现象(也跟垃圾回收器的选择有关)。对后端服务而言,堆最大值一般与堆最小值配置成一样的即可。

实际工作中,-Xmx的值怎么选?按照前面-Xms的配置方法操作即可。如果每次GC时间较长,说明堆配置值的大了,适当减小堆最大值。

3) -Xmn1G解释

这项配置对应的jvm选项是-Xmn,即把young generation(新生代)设置为1G。

5分钟掌握JVM常用选项及相关知识,工作面试够用了

-Xmn中,m代表memory(如前所述),字母n代表什么呢?它代表nursery(托儿所,存放新出生的婴儿,即新创建的对象)。-Xmn1G就是把新生代固定设置成1G。另外,新生代也可以像前面一样,最大、最小值分开设置,用-XX:NewSize来设置新生代的初始大小(最小值),用-XX:MaxNewSize设置新生代的最大值,这里-Xmn相当于同时指定-XX:NewSize和-XX:MaxNewSize。

jvm运行一段时间以后,新生代的初始大小,即-XX:NewSize其实没什么作用了,起作用的仅仅是-XX:MaxNewSize,所以我们往往把两者设置成一样的值,而且用-Xmn这种合并的写法,这样比较方便。

JVM内存知识:我们知道,java中新创建的对象都是放在新生代(young generation)中的,尤其是刚创建出来的对象,更是放在了新生代中的eden区。经历过少数几次GC的新对象往往都是放在survivor区。对于java这样的"一切都是对象"的语言来说,程序运行一旦运行起来,就不断有大量的对象被新建和释放(java一开始甚至因为运行得太慢,差点被淘汰)。因此,新生代的GC非常活跃,如果你们公司有实时监控新生代内存的系统,就可以看到,新生代几乎一直在GC。新生代的GC虽然频繁,但是所产生的停顿非常非常小,几乎可以忽略不计,不会产生多少服务延迟。新生代GC也就是我们所说的Young GC。

那么,-Xmn怎么设置呢?假如设置得太小,那么Yong GC就会发生得更加频繁,所产生的的效果就是,它会比较多的消耗CPU资源;而如果设置的太大,那么新对象存活的时间就会比较长,导致它们被不恰当的放入老年代(old generation),从而导致产生太多full gc,而full gc就对服务有明显影响了。Oracle官方文档建议我们把新生代的大小设置为堆的总大小的1/2到1/4之间。但是,Oracle不了解我们的业务特点,我们还是需要根据业务监控,来看新生代具体要设置为多大。

那具体要怎么调整?就是前面说的,如果Yong GC太多了或GC导致的CPU计算量太高,就调大新生代;而如果业务服务出现了full gc,那考虑调大新生代。不过,据我多年经验总结,full gc很少是由JVM参数配置不当造成的,它往往是业务代码写得不合理导致的。如果你的某一个业务服务平时运行得很好,突然有一天full gc,就看看最近上线改了什么。另外,如果full gc是因为服务连续、长时间运行导致,那就看你代码里面有没有不当使用内存,有没有内存泄漏,长期引用不需要的对象。

到这里才发现,还有这些JVM参数没有讲呢。下一篇文章继续分析,感兴趣的朋友请关注哦。

-XX:+AlwaysPreTouch -XX:PermSize=256M -XX:MaxPermSize=256M

-XX:+UseConcMarkSweepGC -XX:+UseCMSInitiatingOccupancyOnly

-XX:CMSInitiatingOccupancyFraction=80

-Dlog4j.configurationFile=/data/webapps/dealservice_bizer/current/conf/log4j2.xml

希望本文对您有帮助,如果您对互联网、前/后/客户端、架构/分布式/高可用/高并发/高实时、电商、Redis、MySQL、Zookeeper、Spring、Android、浏览器插件、Java、Java虚拟机、C/C++、Linux、个性化推荐、社区发现、机器学习、数据挖掘等感兴趣,欢迎关注。

《一线大厂Java面试真题解析+Java核心总结学习笔记+最新全套讲解视频+实战项目源码》开源

Java优秀开源项目:

  • ali1024.coding.net/public/P7/Java/git

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

Mybatis源码解析

Gprt-1649481835200)]

[外链图片转存中…(img-Lb25RhXY-1649481835200)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值