一次常规拓展学习

前言

Java程序员,刚入行的时候一般都抱着一本《Java核心技术》爆啃,对知识有苛求的,会选择把卷二读一遍。两本4、5百页的书,看完之后,自我觉得知识已经满了。从此开始投身在不停的写service,dao,controller的阶段。

过了两年,等换工作的时候,除了能把公司业务聊的一清二楚,发现真没有什么亮点,虚拟机,多线程多半都是面试前,突击的恶补一遍,勉勉强强能够应付各类面试提问。

但是,如果你不甘心只做一名码农,整日无休止的粘贴复制。建议你看完这篇文章。

起因

在一次测试过程中,发现mysql报MySQL: ERROR 1040: Too many connections。很明显,连接数已达到最大值,手动增加了mysql的连接数,并重启完成服务重启。

但修改连接池数量,并不能从根本上解决问题。从mysql的连接列表里,发现隔一段时间会有新的应用连接进来,并很快就进入休眠状态,活跃的连接很少。但是因为连接的断开过程是很慢的,所以当大量新建连接占满连接数的时候,mysql就拒绝了其它新的连接请求。

过程

经过分析,发现一个同学在写的springboot应用里,并没有设置应用端连接池,开始进行连接池的添加,springboot默认内置了hikariCP,当然,你可以选择druid,c3p0。

添加完连接池,问题就已经解决掉了。于是开始对比,为什么springboot把hikariCP作为默认连接池。开始比对hikariCP和其它连接池的对比。

数据库连接池性能比对(hikari druid c3p0 dbcp jdbc)

发现此作者,不但有连接池,还有一个json包,hikariJSON,比jackson快数倍。源码数量很小,于是,直接把源码拉下来看了下。
https://github.com/brettwooldridge/HikariJSON

代码写的很规整,包含测试用例,跟着测试用例的示例一步步看下去,发现FieldBasedJsonMapper类中引用到了Unsafe,提供了java以类c指针的方式分配内存,增加了java对堆外内存的控制。于是,把unsafe看了一遍。
Java魔法类:Unsafe应用解析

既然是堆外内存操作,很自然的要对比堆内的区别。再细分,就是堆内内存分配,类加载,动态字节码,热修复,垃圾回收等等。

方法

Java程序员队伍的初中高,取决于对该语言的理解,熟悉基础语法,运行环境;懂一些基本开发模式,会一些常用框架;熟悉框架设计,懂得各模块实现原理;熟悉虚拟机,熟悉解释层与物理层之间的交互;理解编译层和执行层作用在不同硬件上的差异(比如什么状态下cpu使用高,哪些内存用的多,又比如哪些会造成内存泄露,逃逸,溢出);最后就是,你已经不满足JVM提供的各类便利性,你认为它的各种优化过于复杂,执行周期漫长。你要自己来搞。

大部分人,停留在初、中。写了一辈子代码,做了很多业务方向,但都未曾尝试过优化改变JVM底层设计。很显然,在多数场景下,无需做额外工作,足够让业务跑起来。但是,一旦出了问题,就完全束手无策。

Java相关衍生太多,类别分类也太多,穷尽一生,也无法面面俱到。除了对主要模块的深入理解,更多的是从一个小事情,不断延伸发散,顺着一条主线深挖,一定会碰到意想不到的兴奋点。而这些,就是成长体现。

随着问题线的数量越来越多,逐渐会对整个体系有一个全面理解,这时候,才能真正进阶到高级阶段。

后记

从高级上升到架构,不但要有过硬的技术能力,还需要对业务场景、解决方案有更为通透的理解。

贴近业务,提升通过技术手段解决各类问题的能力。推动技术变革的,永远是不断变化的业务发展。

希望这一次常规的小记,对刚入行的同学们有些帮助。

你可能感兴趣的:(一次常规拓展学习)