- 博客(40)
- 收藏
- 关注
原创 Spring5源码阅读环境构建原来这么简单
对于Java工程师来说,阅读源码是我们一项必备技能,尤其学习Spring源码。主要学习下源码中的相关技术的实现原理,以及代码的设计思想。1.Spring源码构建第一步源码构建技巧下载Spring源代码,这里我主要是把Spring的源代码fork到自己的github上,然后在clone到本地进行构建。这样的话,可以再源码的基础上进行注释和改进。gradle安装因为spring源代码是使用gradle进行构建的,所以你得提前下载gradle构建工具,我一直使用的是maven,对于gradle的使用.
2021-01-21 23:13:44 242
原创 高逼格可视化在线内存分析工具(Java Memory Head Dump Analyzer Tool)
在这里要先夸一夸这个在线Java内存分析工具,这个工具简直太友好了,而且对于dump文件,对于stack文件都有非常nice的可视化分析。大可不必下载什么MAT,JProfiler等,非常值得推荐。你是否会头疼一下问题线上CPU突然飙升,领导让你排查,心慌怎么办?线上发布之后内存升高,出现了FGC怎么分析?出现了死锁,死循环该怎么排查?线上问题排查示例导出堆栈文件通过jmap命令或者jstack命令导出相关堆栈或者内存dump文件,这里以导出线程堆栈文件进行分析演示。jstack 2.
2021-01-16 11:45:26 9205
翻译 一张表格知道HashMap与HashTable的区别
在业务开发当中,HashMap与HashTable都是用key-value的形式来存储数据,并且都是使用hashing技术来存储key,但是也有许多的同步之处。HashMapHashTable1.HashMap是非同步的,并且不是线程安全的HashTable是同步的,并且是线程安全的2.HashMap允许一个null作为key,允许多个null作为valueHashTable不允许有null键或者null值3.HashMap是在JDK1.2被引入的HashTabl.
2021-01-10 17:12:35 184
原创 深入理解JVM:晚期(运行期)优化
Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”(Hot Spot Code)。即时编译器(JIT编译器)解释器与编译器编译对象与触发条件查看及分析即时编译结果编译优化技术公共子表达式消除数组范围检查消除方法内联逃逸分析...
2020-12-04 22:55:39 236
原创 数据结构:从“数组”开始
数组是程序中最常用的一种数据结构,而且是后续算法学习的基础。数组是学习算法最简单,最好入门的一类数据结构。这里先不介绍算法的度量:时间复杂度,空间复杂度等概念,笔者认为就是因为大部分人先学了这些枯燥的概念,才成功将其劝退了。所以先用“数组”来作为算法的入门知识。1.数组的概念1.1认识数组关于数组,先不进行定义,先看看数组长什么模样,感性的认识数组,现有体感,再进行定义,后面的数据结构都会按照这个节奏来把控。arr1 = [1,2,3,4,5] //整数数组arr2 = ['a','b','.
2020-11-30 23:03:04 141
原创 劝学篇:摆正心态,坐下冷板凳
算法对于大部分程序员来说,是一块比较难啃的骨头。为什么这么说,毕竟很多程序员从事的都是业务相关的开发,那么业务开发做什么呢,基本上都是一些CRUD,说实话,笔者也是这么过来的,不要小看CRUD,这是所有业务实现的基础,但是能不能让CRUD更优雅,更具有效率,更安全等,都是值的探讨的话题。在这里,笔者将与各位同学一起,讨论学习算法知识。笔者对于算法也是颇感兴趣,往往大部分情况下都是很难用到,所以很少系统性的研究深耕。学习算法最重要的是心态。是第一位的。心态之所以要强调,是因为大部分同学,都很难坚持下去.
2020-11-29 11:45:15 243 1
原创 深入理解JVM:早期(编译期)优化
什么是Java语言的编译,就是将我们写的.java文件转变成.class文件的过程。也叫前端编译器(或者编译器前端),其实Java语言的“编译期”是一段“不确定”的操作过程。1.编译器简介前端编译器:Sun的Javac,Eclipse JDT中增量式编译器(ECJ)。把*.java文件编译成*.class文件,这是最符合我们对于Java程序编译认知的一类编译器。JIT编译器:HotSpot VM的C1,C2编译器。虚拟机的后端运行期编译器,把字节码转变成机器码的过程,此类编译器对于程序的“优.
2020-11-28 23:24:09 260 1
原创 单元测试Mock框架调研
最近系统需要引进单元测试Mock框架,也就是在进行单元测试的时候,跳过RPC调用,直接通过Mock方式返回。然后就进行一个简单的调研,通应用到系统中。一.Mock框架调研1.1.系统诉求提高单元测试质量提高单测行覆盖率mock代替RPC调用1.2.调研分析通过调研和查阅文档,对于市面上几款单元测试框架进行了比对分析,其结果如下:框架优点缺点备注小黄瓜自动化测试佼佼者,可直接编写解析纯文本上手难度大,系统额外侵入文件。Junit单元测试利器,使用方.
2020-11-28 18:51:19 280
原创 数据分析:NumPy基础与实战(上篇)
本文主要介绍数据分析基础,采用Numpy的核心方法与实战训练,旨在理解数据分析常用函数,训练提升数据思维能力。Numpy目前是Python数值计算中最为重要的基础包,大多数计算包都提供了基于Numpy的科学函数功能,将Numpy的数组对象作为数据交换的通用语言。1数据分析基础1.1数据分析关注内容在数据处理,清洗,构造子集,过滤,变换以及其他计算中进行快速向量化计算。常见的数组算法,比如:sort,unique以及set操作等。高效的描述性统计与聚合/概述数据。数据排列和相关数据操作,例.
2020-11-22 21:04:25 343
原创 快学Python:如何测试函数与类
编写代码离不开写测试,只有通过测试才知道代码的逻辑有没有问题,健壮性好不好等,测试让你深信,即便有越来越多的人使用你的程序,它也能一如既往正确地工作。1.测试函数Python标准库中的模块unittest提供了代码测试工具。要进行相关测试,必须要有待测试的函数,创建文件name_function.py,其内容如下:def get_formatted_name(first,last,middle = ''): """生成整洁的姓名""" if middle: full_name = f"{.
2020-11-11 23:06:12 1183
原创 快学Python:文件与异常
学习如何处理文件,能让我们快速的分析大量数据,数据分析离不开文件的处理。同时,我们也将学习异常处理,没有不出错误的程序,但是能否优雅的处理这些错误,是考验我们程序健壮性的好还是不好。1.从文件中读取数据要读取文件,我们得先有一个文件,这里我们在当前目录下创建一个文件,随便你在那里创建,只要指定正确的路径就行。来看个例子。1)创建文件pi_digits.txt,内容如下:3.1415926535 8979988787 93847345442)创建file_reader.py,读取文件.
2020-11-10 23:08:57 909 1
原创 快学Python:类与实例的使用
在面向对象的世界中,一切皆对象。而对象的描述是由类来完成的,前面感觉学的都是编程的可口小菜,类中将包含前面学习的所有知识,逐步深入,越来越有意思。1.创建和使用类1.1看个例子先创建一个Dog类,并根据Dog类创建的每个实例都将存储名字和年龄,然后赋予其蹲下sit()和打滚roll_over()的能力:class Dog: """简单模拟小狗""" def __init__(self, name, age): """初始化属性name 和 age""" self.name = na.
2020-11-08 19:09:04 244
原创 快学Python:函数的使用
终于要开始学函数了,以前学到的所有相关知识都可以在函数中得到应用,要执行函数定义的特定任务,那么只需调用函数即可。1.从例子开始学起1.1定义函数在Python中,函数如何定义呢?通过def关键字定义函数。例如:# define a functiondef desc_info(): """函数的文档注释""" print('This is a function')#调用函数desc_info()上面这个例子定义了一个desc_info函数,这个函数的主要功能是打印一句话。这.
2020-11-08 11:36:34 298
原创 快学Python:用户输入与while循环
这里主要学习input获取用户输入,同时学习利用while循环来处理数据。1.函数input工作原理1)input函数作用函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,Python将其赋值给一个变量,以便使用。message = input("Please input something:")print(message)2)使用int()获取数值输入message = input("Please input something:")message = int.
2020-11-07 17:54:50 103
原创 快学Python:字典的概念与使用
字典是一种非常重要的数据结构,可存储的信息两几乎不受限制,理解字典,就能更为准确的为各种真实物体建模。1.一个简单的例子字典是由大括号{},并且里面是键值对的形式,有编程经验的话,则比较容易理解。# 定义一个字典alien_0 = {'color':'green','points':5}print(alien_0['color'])print(alien_0['points'])这个例子定义了一个字典,里面有两个key-value,通过print()打印key对应的value。2.使.
2020-11-07 17:30:58 136
原创 快学Python:if条件语句使用
编程的时候经常需要检查一系列条件,根据这些条件是否满足,来作出进一步的操作。if语句能够检查程序的当前状态,并采取相应的措施。一个小例子cars = ['audi','bmw','byd','toyota']for car in cars: if car == 'byd': print(f"{car.upper()} is good car") else: print(car.title())这个例子是在遍历列表的时候,根据特殊情况进行处理。如果是’byd’就转大写并打印出一句话.
2020-11-07 17:00:14 369 1
原创 快学Python:列表及其使用
列表是由一系列按特定顺序排列的元素组成。也是Python中使用频繁,且非常强大的一种数据结构。在这里主要学习列表的概念及使用,同时还会介绍元组这种数据结构。1.认识列表列表是用方括号[]组织元素的,其中元素之间用逗号隔开。colors = ['red','blue','yellow','black']numbers = [1,2,3,4,5,6,7]类似上面的这种定义都是列表。1.1访问列表元素访问列表元素很简单,就是通过索引进行访问。>>> colors = ['.
2020-11-06 23:40:31 231
原创 快学Python:变量与简单数据类型
这里先从简单的变量,字符串,数来认识python编程。从而引起对python的兴趣,相比其他语言来说,python语言的简洁性毋庸置疑,从打印print函数就可以知道。1.变量1.1什么是变量?有语言基础的同学对这个一定非常熟悉,对于刚入门的人来说,变量其实很非常的好理解,举个例子就会明白。# 这个msg就是变量,而这个变量的值就是Hello Worldmsg = "Hello World"可以通过print函数打印这个变量,得到Hello World这个名字。1.2变量的作用说白了.
2020-11-06 08:04:38 273 1
原创 快学Python:Python环境搭建
工欲善其事,必先利其器。要学好Python语言的第一步,不是说这是什么类型的语言,学习这个的目的是什么,也不是讨论简单或者复杂的问题,我想在学习之前的我们肯定已经心中有数了。第一步就是安装环境。本章大纲...
2020-10-30 21:06:29 196
原创 一张线上JVM参数配置清单
对虚拟机的调优离不开JVM参数的配置,很多开发者对于生产环境JVM参数的配置少之又少,其原因是都是提前由运维或者架构师结合硬件指标以及应用本身配置好了,所以很多开发者都很难接触到线上JVM参数的配置。但是可以通过查看线上的配置,了解这些JVM参数的配置及其含义非常重要。常见JVM参数配置清单硬件参考:4核CPU,8G内存虚拟机参数描述线上设值参考-Xss每个线程的堆栈大小,每个版本的默认值都不同一般采用默认值-Xms最小堆内存-Xms5g-Xmx最大堆内.
2020-10-30 08:10:08 687
原创 程序员快乐之GC日志分析实战
阅读GC日志是处理Java虚拟机内存问题的基础技能,然而GC日志仅仅是认为确定的规则,倒是没有什么技术含量,和分析排查自己系统线上错误日志基本类似。1.如何打印GC日志打印GC日志非常简单,只要配置一下GC打印参数即可,接下来通过一个程序来看看如何查看GC日志。1.1编写测试程序/** * @Description:GC日志打印与OOM测试 */public class GcLogDemo { public static void main(String[] args) .
2020-10-24 11:24:36 232
原创 深入理解synchronized与volatile关键字
在多线程并发编程中synchronized和volatile都扮演着重要的角色,synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。而volatile是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。初识synchronized关键字我们知道当多个线程对共享变量或者资源进行同时访问操作时,会引起线程不安全问题,在JDK1.5以前是通过synch.
2020-10-20 00:15:12 559
原创 深入理解JVM:常见垃圾收集算法
在C,C++语言中,程序的内存使用空间都是靠程序员手动进行分配和回收的。但是在Java语言中,垃圾回收都是交给虚拟机自动完成。1.理解垃圾收集对于垃圾收集(Garbage Collection,GC),我们必须要提出灵魂三问:哪些内存需要回收?什么时候回收?如何回收?虽然说内存的动态分配与内存回收技术已经相当成熟,一切看起来都进入了“自动化”时代,那么为什么还要去了解GC和内存分配呢?答案是:当需要排查各种内存溢出,内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这.
2020-10-12 23:53:36 2151
原创 深入理解JVM:字节码指令详解
字节码指令集是一种具有鲜明特点,优劣势都很突出的指令集架构,这些都是优秀人才的思想结晶,正式因为如此,Java语言才能得以广泛流行和快速发展。在各行各业的软件发展中占据了举足轻重的作用。1.前言当前学习的知识是字节码指令相关的知识,和上一篇的class文件格式一脉相承。学好字节码指令对于深入理解JVM有更好的帮助,能够清除的了解各种字节码指令的含义与作用。Java虚拟机你的指令由一个字节长度的,代表着某种特定操作含义的数字(成为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(成为操.
2020-10-11 23:19:43 553
原创 深入理解JVM:class文件结构分析
代码编译的结果就是将我们写的语言代码变为字节码,这是存储格式发展的一小步,确实编译语言的一大步。“字节码文件”是平台无关性的基石。一.语言无关性概述实现语言无关性的基础仍然是虚拟机和字节码存储格式。作为一个通用的,和机器无关的执行平台,Java虚拟机不与任何语言绑定,只与“Class文件”这种特定的二进制文件格式关联,也就是不关心Class的来源是何种语言,不管是用Java编译的Class文件,还是用JRuby编译的Class文件,JVM都可以做到执行处理。二.Class类文件结构1.Clas.
2020-10-11 18:26:21 311 2
原创 深入理解JVM:类加载机制解析
我们写的Java程序不会无故运行起来,需要底层的软硬件支持,java程序运行所需的内存等资源都需要通过jvm来申请,可以说JVM是Java程序运行的母体,那么程序是如何在Java虚拟机中运行起来的,接下来就来分析一下类加载机制。1.类加载机制概述虚拟机把描述类的数据class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。2.类的生命周期class文件从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括:加载(L.
2020-10-08 22:42:15 183
原创 深入理解JVM:Java语言与JVM关系
在那个电闪雷鸣,群鸟环绕的夜晚,一个不为人知的语言Oak诞生了,此时正值1991年4月份,气温舒适,百花齐放。然而Oak的诞生并没有得到人们的关注,直到1995年5月23号,Oak决定正是更名为Java,并喊出了 “Write Once,Run Anywhere”(一次编写,随处运行)的口号,真是一语惊天雷,从此震乾坤。Java语言作为世界上最为流行且用户使用量最多的语言,由当时的懵懂少年,已然成为了现在的稳重青年。他怀揣梦想,肩负使命,不断在信息化的时代披荆斩棘,破浪前行。一幅图足以说明其成长历史。.
2020-10-08 12:05:23 809
原创 责任链模式:“仁”以为己任
一个人不经过责任链模式的定义官方定义:使多个对象都有机会请求处理,从而避免了请求发送者与接受者之间的耦合关系。将这些对象连成一条链,并沿着该条链传递请求,直到有对象处理它为止。通俗释义:简单点说,就是通过一条链来传递请求。当第一个请求发送到链上之后,链上的节点会依次处理。Handler(抽象处理者):提供一个抽象处理接口,便于子类进行引用扩展。ConcreteHandler(具体处理者):继承或者实现抽象类,用于具体业务逻辑处理,可以转发请求到下一个节点处理。责任链模式的重点是在“链”上,.
2020-09-20 15:45:42 105
原创 代理模式:请问需要代驾吗?
代理,不言而喻就是委托或者替代,而代理者就是委托者或者替代者的意思。代理无处不在,如果说将人的意志和肉体概念上分开,肉体就是意志的代理者,代理意志执行某些事情。为什么会有代理?个人理解,之所以有代理其一是被代理者无法或不想直接完成某些事情,其二,用最低成本获取最高收益。其三,物质世界的必然规律。今天介绍的这个代理对象,与其说非常重要,倒不如说使用频率极其的高。因为它太重要了。真的无法想象,如果没有代理的存在,我们的代码,甚或软件是否能到现在这样的一种发展程度,未曾可知。不过也无需臆测,因为物质世界的规.
2020-09-13 23:06:49 329
原创 高质量代码的若干个建议总结
作为一名软件开发人员,在进行软件开发工作时,不乏会出现一些代码的坏味道,但是呢,我们一边再追求可用软件的同时,还需要保证软件的可靠性,可读性,可扩展性。文章目录1Java开发中通用的方法和准则2基本类型3类,对象及方法4字符串5数组和集合6枚举和注解7范型和反射8异常9多线程和并发10开源世界11思想为源1Java开发中通用的方法和准则1.1字母与数字混淆数字1和字母l:尤其在long类型初始化时候,用大写L可替代,以消除不必要的混淆。1.2常量就是常量,变量就是变量常量就是常.
2020-09-11 10:31:29 336
原创 原型模式:我就是另一个你
这里写目录标题原型模式的定义原型模式的通用代码原型模式的应用场景原型模式的优缺点原型模式的注意事项克隆(clone)一词想必都不陌生,是一种利用体细胞进行无性繁殖的一种技术。本质上来说,就是一种原样复制,但是站在伦理的角度,此类技术还有比较大的争议,暂且不论。接下来,介绍的这种原型模式,你可以叫它克隆模式,也可以叫它复制模式,其本质上就是一种对象拷贝。是一种不通过new关键字产生对象,而是通过对象复制来实现的一种模式。原型模式的定义官方定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建
2020-09-09 08:42:21 164
原创 建造者模式:你想要的我都有
在生活中,似乎有些过程方法都可以单独拿出来去创造不一样的事物,这种过程方法就是一种建造过程,就像瓷器窑利用相同的加工流程,可以创造出不同的精美工艺品。今天介绍的这种建造者设计模式就是一种抽离出创建对象的过程,从而根据相同的创建过程来创建不同形式和类型的对象,也被称为:生成器模式。在设计过程中,利用这种模式将对象的构造代码从产品类中抽离出去,放在一个独立的生成器或者构建器中来生成对象。接下来展开学习一下这种模式。建造者模式定义官方定义:将一个复杂对象的构建与其表示分离,使得相同的构建过程可以创建不同.
2020-09-08 08:49:36 110
原创 模板方法模式:照着抄是不会有错滴!
生命甚或生活都源于模板,从我们出生到人生的各个阶段,都会不断的继承各种模板,父母的循循善诱,老师的谆谆教诲,社会上的鞭策砥砺。以上这些似乎都教会我们要遵循某种模板。也许正是有了这些模板我们才会少走弯路,少犯错误,才会让我们一步一步走的更踏实。还是少说鸡汤多干正事儿。学习这事儿可马虎不得,需要细心坚持。今天介绍的这个模板方法模式可以说是众多设计模式中最简单最常用的一种设计模式,但是要用好它的确需要认真研究一下的。模板方法模式定义官方定义:定义一个算法操作骨架,将一些步骤延迟到子类中去,使得子类可以在.
2020-09-07 08:56:53 177
原创 抽象工厂模式:站在上帝的视角看问题
目录抽象工厂模式的定义抽象工厂模式的通用代码抽象工厂模式的应用场景抽象工厂模式的优缺点抽象工厂模式的经典应用工厂模式的比较工厂构建方法静态构建方法简单工厂模式工厂方法模式抽象工厂模式抽象的科学含义是从众多事物中抽取出公共的本质的特征,而舍弃其非本质的特征的过程。从哲学的角度来说就是分析,综合,运用概念在人脑中再现对象本质的方法。似乎一个强调过程,一个强调方法;这些我们都不需要关心,我们的唯一视角就是:透过现象看本质。今天介绍的抽象工厂模式和工厂方法模式有异曲同工之妙,可以说抽象工厂模式是工厂方法模式
2020-09-06 10:51:42 392
原创 工厂方法模式:框架解耦的优选策略
似乎世界运行的规律就是越是更高级越是更简单,越是更简单更容易标准化,一旦标准化模式形成,按照这个标准可以衍生出无数个符合此标准的产品或者服务。在这里我介绍一种工厂方法模式,这种模式的使用频率可能是最高的,在平时的生活和工作中也颇为常见。工厂方法模式,咋一听就好像这种模式的产生是从工业时代的工厂里面总结出来的,不过也不必追究溯源,掌握其精髓才是重中之重。工厂方法模式的定义不管三七二十一,先来领略一下工厂方法模式的概念,由浅入深,深入浅出的了解更能便于理解和掌握。官方定义:是这么说的,定义一个用于创.
2020-09-04 23:27:34 316
原创 单例模式:她真的很简单吗?
在23中设计模式中,单例模式可能是大家最认为比较简单的一种设计模式,然后我觉得单例模式非常的不简单,而且是独一无二,就像我们在数学中对于ex求导,无论求多少次导数,它都还是ex,多么的坚定和唯一。似乎我们的爱情也应该像单例模式一样,永远都是纯粹且专一的。愿得一人心,白首不相离。接下来就详细介绍一下这神秘而又专情的单例模式。单例模式的通俗定义官方定义:确保一个单例类有且仅有一个实例,并且提供一个全局的公共访问点。通俗释义:也就是说这个单例类只能有一个自己的实例,简单点来说就是只能new出一个对象,.
2020-09-01 08:56:37 301
原创 并发编程-Thread源码解读
庖丁解牛-Thread源码解读Thread构造函数重要的初始化方法几个重要的变量几个重要的API几个重要概念守护线程线程组之所以解读Thread源码是因为这个是创建启动线程最重要的类之一,而且在多线程编程中会经常用到的一个类,对Thread类的深入了解有助于以后在多线程Code方面得心应手,也是对自己的一个提升。Thread构造函数//空构造函数public Thread();//通过传...
2019-01-14 21:16:48 212
原创 并发编程-快速理解线程
快速理解线程进程与线程区别先启动一个线程创建线程的方式线程的生命周期进程与线程区别进程:我们以前在学习操作系统的时候给出进程的定义是:程序的一次执行。简单理解就是操作系统中对于数据集的一次指令运行(资源分配和调度的基本单位),是一个动态的概念,也是一个活动实体,两者并不矛盾。详情学习可参考:《现代操作系统》。线程:是进程中执行的持有资源且被CPU调度的最小单位,一个进程可以包含一个或多个线程...
2019-01-12 00:41:35 120
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人