Java是目前世界上最流行的计算机编程语言,是一种可以编写跨平台应用软件的面向对象的程序设计语言,也是当今使用率最高的编程语言。Java 作为一门“蓝领语言”,一直在工程中解决实际问题。欢迎大家参与本期话题,聊一聊你和Java的故事。
本期话题:
1、使用java过程中,在问题排查方面,你有哪些方法和经验可以分享?
2、你有遇到过哪些并发难题?是如何解决的?
前言
首先,来一波致敬!认真的学习了李三红老师的“Java大师课”,受益颇多。尽管在开发这行,已经走了这么多年。仍然是个小学生。不断地汲取像李三红老师这类大牛的分享的经验,才能继续成长。
聊到Java这个话题,其实真的有很多话可以讲。最重要的一点,其实观点和老师相同。那就是目前从业者可能都比较浮躁,没有好好地去学一下Java的本身。
了解Java的历史、发展、规划设想,从而就会发现,Java之父的真的牛。
技术的思维是对于技术人员来讲最重要的,远比掌握一门实际的开发套路更来的重要。
熟悉Java运行的环境,才能更了解Java本身的机制、性能。
不管是对于新人还是老人,**熟悉一门语言,要真的深入的了解,才能更好的把控。**虽然我也在学习,但是意识到这点,再去努力,这个非常重要。
问题排查的我的碎碎念
前言中,讲了问题排查我的第一个经验。那就是,多看看应用的运行环境包括JVM和JRE。
人生存在环境中,好坏,很容易受到环境影响。相同的,对于我们的Java应用来讲,生存的环境就是JVM。那么,很多异常、问题,JVM能够告诉我们的太多太多。
如果了解JVM的多一点,可能会得到很多很直观的展示。不用非得通过死板的日志、断点调试等人肉查错。
不同的JDK版本,JVM都在尝试努力优化更好地环境。但是是否配置有问题,这是第一个使用过程中的要考虑的内容。
JVM的问题排查,JDK的工具包,提供了一系列的排查工具,帮助我们达成目的。
相关工具的功能,不再赘述。看了下评论“爱吃白菜的GGB”已经写得比较细了。在此,只为了大家真正经验。
每个工具,使用的学习文档,可能比较多。大家可以细细的学习。
因为自带的工具对于小白来讲还是有不小的学习成本。阿里开源的Arthas诊断工具,强烈推荐。
一款工具,达成了各类目的。后边,会举个实际生产示例,来说它的妙处。
传统的需求开发模型-瀑布模型如图所示, 对于我们的问题排查,仍然要采用此类的套路去进行。虽然,可能大多数人还是在日志中排错。但是希望大家还是从一个思维上转变排查思维。
一个不明显的错误问题,个人建议排查问题的思路是这样的:
**问题现象 -> 定位异常 -> 环境配置 -> 启动参数 -> 应用配置 -> 应用日志 **
整体化排查思维很重要,不要一上来就找日志。先思考。
到了确定的业务代码部分,问题排查很关键的不可否认的是日志的编写。
开发中,使用门面模式下的日志框架,兼容各类日志框架,通过日志,快速定位异常问题。
各类开发工具,也提供了详细的调试功能辅助排查。
并发的那些事
说句实话,开发中,真正用到多少并发的,确实可能对于大多数人场景不会很多。但是思维很关键。
目前应用都云原生化,那么在应用本身来讲,都是分布式应用。那么,对于并发的使用尤为关键。
并发带来几个问题:
- 应用性能问题
- 应用未知异常
性能问题,由于并发过高,应用难以承载。那么,采用多级缓存,应用限流等手段,去解决高并发的问题。
并发,引发一系列的未知。那么,应用的设计一初要考虑应用的鲁棒性。 同样的,限流、降级、熔断,等去降低并发的风险。以及从业务的设计上,也要考虑相关压力过大的情况。
缓存数据库、大数据等也都是为了解决系统压力诞生的工具。
Arthas 实例
使用JDK自带的工具,有一些局限,不大方便。采用Arthas会很舒服的解决各类问题排查。
本次示例发生在生产上,采用的SpringCloud Gateway作为微服务的网关。Nacos作为服务发现注册中心、配置中心。
线上经常会出现网关服务掉线的情况,排查看之后,发现会产生OOM的错误,生成对应的错误文件。
究其原因,发现,是在创建新的进程时,内存不足导致。
采用arthas 进行查看下内存占用、线程数量,发现有大量的线程产生
大量的nacos线程,压垮了系统的运行 优化后的线程图如下:
优化前,线程数达到几万个 一堆工具,开始找寻排查问题的那个
当知道thread激增之后,就要去看下,为啥出现这么多线程。追踪源码,能够产生线程的最终是NacosServiceManger
vmtool —action getInstances —className demo.MathGame —express ‘instances.length’
通过示例命令,构造自己命令,查询NacosServiceManger运行实例。结果发现出现了一堆。
好吧,一个这玩意,就能带来指数式增长,因为内部是通过线程池实现,NamingProxy
so,根源找到了。就看下NacosServiceManger是如何产生那么多的。究其原因,是自己脑袋瞅瞅,写的配置类出了异常。
优化好,就正常了。