当Java程序性能达不到既定目标,并对于程序优化技巧已用尽,应如何通过JVM知识对GC优化?
对于众多参数各自优点增加了调优的难度,GC优化过程应如何结合现有业务进行适合的参数优化呢?
JVM数据运行区,哪些会造成OOM的情况?
JVM在性能调优中使用非常广泛,无论什么级别的Java从业者,JVM是进阶时必须迈的坎。如果不懂JVM的话,薪酬会非常吃亏。除了面试,学习JVM有利于更深入地理解 Java 这门语言,学好JVM,为未来排查线上问题打下坚实的基础。
因为我也是一名 Java 从业者,虽然近些年来,无论是使用规模、开发者人数,还是技术生态成熟度、相关工具的丰富程度,Java 都当之无愧是后端开发语言中不可撼动的王者,也是开发各类业务系统的首选语言。
而且薪资也不菲
但我总有种坐不动的感觉。项目还好说,让我用 Java 写系统代码都没有问题,但是如果有人问我 Java 程序运行起来以后内部发生了什么,可以怎么让它运行得更好的话,我就真的有点答不上来。
如果答不好,真的会影响薪酬的多少。
所以了解 JVM 则是深入学习 Java 必不可少的一环,也是 Java 开发人员迈向更高水平的一个阶梯。
之前面试因为jvm被毙掉,所以在那段时间疯狂的恶补JVM的面试题及资料,有需要的朋友可以点赞+收藏后私信“JVM”得到获取方式
随着互联网的发展,高并发高可用、快速响应成为软件的必须,而JVM与这些有着密切关联。之前JVM系列好多都是一些由于STW影响到快速响应问题,忽然网站慢一下(抖动下)等问题,下面谈谈最近通过JVM排查到的高并发高可用问题。(在高可用高并发下面问题原因可能会很多,比如cpu异常高、磁盘IO高、SWAP空间等,有可能很多问题都是综合性的问题)
以前在我的认知里面,如果服务运行有问题,最简单有效快速的办法就是重启,最近遇到了问题打破了我对该方法的认知。
很能很多人认为线上出现问题可以排查继续解决问题的人牛逼,其实错了,真正牛逼的人都是在问题产生前就解决了(需要意识里面转变和学习思考提高的地方)。
下面看个例子就明白了,我觉得放在这里特别合适:
春秋战国时期,有位神医被尊为“医祖”,他就是“扁鹊”。一次,魏文王问扁鹊说:“你们家兄弟三人,都精于医术,到底哪一位最好呢?”扁鹊答:“长兄最好,中兄次之,我最差。”文王又问:“那么为什么你最出名呢?”扁鹊答:“长兄治病,是治病于病情发作之前,由于一般人不知道他事先能铲除病因,所以他的名气无法传出去;中兄治病,是治病于病情初起时,一般人以为他只能治轻微的小病,所以他的名气只及本乡里;而我是治病于病情严重之时,一般人都看到我在经脉上穿针管放血,在皮肤上敷药等大手术,所以因为我的医术高明,名气因此响遍全国。”
如果能在编码时候就考虑到JVM,做到面向JVM编程那就更牛逼了,如果能在上线前查阅到此类JVM问题或者是OOM问题以及一些其他问题那也就好了。
综述:因此这些成为必不可少的技能,所以面试需要了解,因为公司可能会面临该问题。
现在不像以前了,以前会点html都好找工作,现在由于学习软件的人越来越多,而且每年大学生都在毕业(而老一辈的也很少换工作)人只会越来越多,有个笑话,随便在大街上扔硬币砸到的那个可能就是搞软件的,现在人员太多,公司为了区分,会多添加维度,每多一个维度可能就会刷掉一批人,核心供大于求,所以我们也必须朝着这些大的方向努力,使得自己的竞争力比别人强。
如果是这样,我觉得我们大家先想清楚“自己想要什么”最为重要
我的建议就是一定要有规划的去学习,这是腾讯T4专家整理的一份JVM的学习路线,我觉得这么学下来很顺畅,分享给大家,需要高清大图以及路线图上附带的学习视频的朋友点赞+收藏然后私信“JVM”得到获取方式。
第一面:
第一面主要考察项目,通过项目提出基础问题。
之前有微服务经验,面试官就详细问到微服务的架构、框架的实现、服务治理、分布式一致性等问题。
之前有玩过日志监控系统,首先还是考察架构,ELK的相关知识,重点描述Elasticsearch的一些架构原理,比如倒排索引的原理。
问消息队列的相关知识,接触过Kafka,问了Kafka中消息可以被多个消费者消费吗?;以及选举机制和HW机制。
开放性问题,讲一个之前遇到的问题,并如何解决的。这个描述生产过程中运行的问题,并描述排查问题。
数据库和Redis相关问题,数据库考察索引的原理以及几种事务的区别。Redis问数据结构,延时队列如何实现,分布式锁原理。
时间30分钟。
第二面:
第二面是组长和总监面试,聊解题思路和项目,这面的特点是根据项目经验问相关的问题,要求广度,尤其考察架构广度,会将目前的项目量级扩大几十倍,重新设计架构,同时涉及到一些压力面试。
感觉如果不紧张,熟悉项目的话,问题不大。
会有很多开放性题目,包括平时遇到问题的解题思路、同事之间的协作等。
被问到的知识点有负载均衡算法,ngnix如何做限流,四层LVS和七层Ngnix的区别,JVM性能调优,以及微服务架构的设计思路。
一些问到的面试题
1.JVM运行时数据区包含哪些?
程序计数器:行号指示器,通过改变该值,以选取下一步的指令
Java虚拟机栈:局部变量、方法出口等,为JVM服务
本地方法栈:局部变量、方法出口等,为本地Native方法服务
堆区:内存最大的一块,所有的对象实例都在这里分配内存
方法区:常量、静态变量等
2.JVM垃圾回收机制,何时触发MinorGC等操作
分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。
JVM中共划分为三个代:年轻代、年老代和持久代,
年轻代:存放所有新生成的对象;
年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;
持久代:用于存放静态文件,如Java类、方法等。
新生代的垃圾收集器命名为“minor gc”,老生代的GC命名为”Full Gc 或者Major GC”.其中用System.gc()强制执行的是Full Gc.
判断对象是否需要回收的方法有两种:
1.引用计数
当某对象的引用数为0时,便可以进行垃圾收集。
2.对象引用遍历
果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
触发GC(Garbage Collector)的条件:
1)GC在优先级最低的线程中运行,一般在应用程序空闲即没有应用线程在运行时被调用。
2)Java堆内存不足时,GC会被调用。
3.GC的三种收集方法:标记清除、标记整理、复制算法的原理与特点,分别用在什么地方,如果让你优化收集方法,有什么思路?
4.java类加载过程?
5.什么是类加载器,类加载器有哪些?
6.Eden和Survivor的比例分配等
7.volatile的语义,它修饰的变量一定线程安全吗
8.JVM 对象创建步骤流程是什么?
9.什么是 Class 文件? Class 文件主要的信息结构有哪些?
10.什么是内存溢出,内存泄漏
面试时间在20-30分钟。
第三面技术委员会面试
第三面是面委,技术面试,难度非常大。
1.考察系统设计和架构设计。要求知识的深度理解
主要是系统设计,问了秒杀系统的如何设计,分接入层、接口层、消息队列层、逻辑层四个方面讲解,接入层可以做服务治理相关事情,接口层做抢购开关、黑白名单、随机拒绝等处理,逻辑层具体抢购逻辑实现,涉及到redis分布式锁以及DB和Redis的一致性问题。
从秒杀系统还引申出分布式事务的几种实现,二段式、三段式、补偿型(TCC)、基于可靠消息服务的消息队列实现。重点讨论了这几种的实现和区别,要求画出基于可靠消息服务的消息队列实现分布式事务的架构图,以及上游服务和下游服务如何保证消息可靠性和一致性。
2.考察微服务架构,服务拆分的原则、RPC框架原理、配置管理(etcd)的一致性协议raft选举原理。
3.考察服务治理,服务限流算法,服务降级的指标和恢复指标,服务熔断。
开放性问题,遇到印象最深的问题,以及如何解决的。
第四面HR面,主要就是问问你的人生规划
需要的朋友可以点赞+收藏后私信“JVM”得到获取方式
相关的电子书,项目资料
总的来说,自己如果有想要去的大公司,一定要提升好自己,让自己的能力和素质与公司匹配的上,我也一直相信,机会永远是留给有准备的人。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。
以上学习资料均免费放送,最后祝愿各位身体健康,顺利拿到心仪的offer!