聊聊你和Java的故事

34 阅读5分钟

Java是目前世界上最流行的计算机编程语言,是一种可以编写跨平台应用软件的面向对象的程序设计语言,也是当今使用率最高的编程语言。Java 作为一门“蓝领语言”,一直在工程中解决实际问题。欢迎大家参与本期话题,聊一聊你和Java的故事。

本期话题:

1、使用java过程中,在问题排查方面,你有哪些方法和经验可以分享?

2、你有遇到过哪些并发难题?是如何解决的?

image.png

前言

首先,来一波致敬!认真的学习了李三红老师的“Java大师课”,受益颇多。尽管在开发这行,已经走了这么多年。仍然是个小学生。不断地汲取像李三红老师这类大牛的分享的经验,才能继续成长。

聊到Java这个话题,其实真的有很多话可以讲。最重要的一点,其实观点和老师相同。那就是目前从业者可能都比较浮躁,没有好好地去学一下Java的本身。

了解Java的历史、发展、规划设想,从而就会发现,Java之父的真的牛。

技术的思维是对于技术人员来讲最重要的,远比掌握一门实际的开发套路更来的重要。

熟悉Java运行的环境,才能更了解Java本身的机制、性能

不管是对于新人还是老人,**熟悉一门语言,要真的深入的了解,才能更好的把控。**虽然我也在学习,但是意识到这点,再去努力,这个非常重要。

问题排查的我的碎碎念

image.png

前言中,讲了问题排查我的第一个经验。那就是,多看看应用的运行环境包括JVM和JRE

人生存在环境中,好坏,很容易受到环境影响。相同的,对于我们的Java应用来讲,生存的环境就是JVM。那么,很多异常、问题,JVM能够告诉我们的太多太多。

如果了解JVM的多一点,可能会得到很多很直观的展示。不用非得通过死板的日志、断点调试等人肉查错。

不同的JDK版本JVM都在尝试努力优化更好地环境。但是是否配置有问题,这是第一个使用过程中的要考虑的内容。

image.png

JVM的问题排查,JDK的工具包,提供了一系列的排查工具,帮助我们达成目的。

相关工具的功能,不再赘述。看了下评论“爱吃白菜的GGB”已经写得比较细了。在此,只为了大家真正经验。

每个工具,使用的学习文档,可能比较多。大家可以细细的学习。

因为自带的工具对于小白来讲还是有不小的学习成本。阿里开源的Arthas诊断工具,强烈推荐。

一款工具,达成了各类目的。后边,会举个实际生产示例,来说它的妙处。

image.png

传统的需求开发模型-瀑布模型如图所示, 对于我们的问题排查,仍然要采用此类的套路去进行。虽然,可能大多数人还是在日志中排错。但是希望大家还是从一个思维上转变排查思维。

一个不明显的错误问题,个人建议排查问题的思路是这样的:

**问题现象 -> 定位异常 -> 环境配置 -> 启动参数 -> 应用配置 -> 应用日志 **

整体化排查思维很重要,不要一上来就找日志。先思考。

image.png

到了确定的业务代码部分,问题排查很关键的不可否认的是日志的编写。

开发中,使用门面模式下的日志框架,兼容各类日志框架,通过日志,快速定位异常问题。

各类开发工具,也提供了详细的调试功能辅助排查。

并发的那些事

说句实话,开发中,真正用到多少并发的,确实可能对于大多数人场景不会很多。但是思维很关键。

目前应用都云原生化,那么在应用本身来讲,都是分布式应用。那么,对于并发的使用尤为关键。

并发带来几个问题:

  1. 应用性能问题
  2. 应用未知异常

性能问题,由于并发过高,应用难以承载。那么,采用多级缓存,应用限流等手段,去解决高并发的问题。

并发,引发一系列的未知。那么,应用的设计一初要考虑应用的鲁棒性。 同样的,限流、降级、熔断,等去降低并发的风险。以及从业务的设计上,也要考虑相关压力过大的情况。

缓存数据库、大数据等也都是为了解决系统压力诞生的工具。

Arthas 实例

使用JDK自带的工具,有一些局限,不大方便。采用Arthas会很舒服的解决各类问题排查。

本次示例发生在生产上,采用的SpringCloud Gateway作为微服务的网关。Nacos作为服务发现注册中心、配置中心。

线上经常会出现网关服务掉线的情况,排查看之后,发现会产生OOM的错误,生成对应的错误文件。

究其原因,发现,是在创建新的进程时,内存不足导致。

采用arthas 进行查看下内存占用、线程数量,发现有大量的线程产生

image.png

大量的nacos线程,压垮了系统的运行 优化后的线程图如下:

image.png

优化前,线程数达到几万个 一堆工具,开始找寻排查问题的那个

image.png 当知道thread激增之后,就要去看下,为啥出现这么多线程。追踪源码,能够产生线程的最终是NacosServiceManger

vmtool —action getInstances —className demo.MathGame —express ‘instances.length’

通过示例命令,构造自己命令,查询NacosServiceManger运行实例。结果发现出现了一堆。

好吧,一个这玩意,就能带来指数式增长,因为内部是通过线程池实现,NamingProxy

so,根源找到了。就看下NacosServiceManger是如何产生那么多的。究其原因,是自己脑袋瞅瞅,写的配置类出了异常。

优化好,就正常了。