自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(110)
  • 资源 (5)
  • 收藏
  • 关注

原创 java线程池正确使用姿势

有哪些常见线程池类型以使用工具类 Executors 进行创建线程池为参照// FixedThreadPool 固定线程数池public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS,

2021-05-08 21:47:59 335

原创 java注解继承(来自源码的解答)

事情的经过是,某天突然对注解继承有点兴趣,于是面向搜索引擎准备解惑下,发现网上都是自己写的例子然后给出结论,而且例子也没有完全覆盖一些情况。于是翻找Java源码得出了以下的输出。Inherited 类是元注解类,只能修饰注解。英文说明的第一大段大致意思是:会沿着子类一直找到Object类,把标记为@Inherited的注解信息全部拿到。简单来说标记为@Inherited注解的父类,注解信息就会继承到子类。第二大段是说:该@Inherited只有标记类的时候才有效果。而且该注解只对父类上的注解有效果,对

2021-02-07 00:37:43 630 1

原创 怎么破除自己好像掌握知识的假象

看的书,写的代码不少,为什么会有自己感觉知道的很多知识点,但一深入思考,就没有半点思绪。例如在书上看到SPI的介绍通读了一遍,就感觉自己已经掌握了SPI了,但如果有人问什么是SPI、为什么有SPI、什么时候用SPI、怎么实现SPI,一定会哑口无言,因为当时读的时候没有带着这些问题去思考。那么阅读时,应该带着目标性去阅读。定制正确的目标【尽量避免自以为掌握了很多知识】,多少人认为读完一本书,就认为掌握了这本书所有的知识?人天生容易高估自己,切忌不要以读完一本书为目标,否则潜意识会自认为掌握了这本书的知识

2020-12-28 17:20:00 394

原创 maven常见构建源码命令

最近搞了些源码下来,基本都需要通过maven进行构建,常见几个问题。1.控制台输出中文乱码。2.第一次编译十分缓慢。3.jar下载度日如年,还时不时由于jar下载失败,导致整个编译失败。以下命令是我编译源码用的最多的命令了:mvn cleaninstall -Dmaven.test.skip=true -Dfile.encoding=UTF-8 -Dmaven.javadoc.skip=true -Drat.skip=true -Dcheckstyle.skip=true-Dmav.

2020-12-18 18:31:10 395 1

原创 win10配置mysql常见问题

环境本机已经安装了一个数据库,默认3306端口。本机为win10 64位,全程使用 windows powerShell命令窗口进行操作。问题:将本机的mysql停止,下载了解压缩版的mysql5.7.31版本,进行部署启动各种卡壳,现记录各种情况和解决方案。1.在D:\mysql\mysql-5.7.31-winx64 下配置my.init文件,路径按自己本机路径走。示例如下,不能缺少[mysqld][mysqld]basedir = D:/mysql/mysql-5.7.31-winx64

2020-12-02 10:12:56 331

原创 synchronized是公平锁还是非公平锁

synchronized是公平锁还是非公平锁

2020-06-09 14:30:58 8520

原创 tcc-transaction避坑指南

tcc-transaction避坑指南

2020-05-30 10:53:23 8377

原创 tcc-transaction深入理解

分析的项目为https://github.com/changmingxie/tcc-transaction在项目为dubbo搭配使用,因此全文是在dubbo服务环境进行分析。首先tcc如何实现分布式服务的事务一致性的,配置使用的指南中,主要通过Compensable注解开始,首先找到注解的切面,有两个切面,tcc-transaction-spring 的 tcc-transaction.xml配置如下: <!-- 初始化compensable事物切面 --> <bea.

2020-05-29 18:48:40 8687

原创 HashSet为什么要设置PRESENT

直接进入正题,HashSet是通过组合模式,使用HashMap的key是不重复的来实现HashSet中的元素是不重复的,遍历时为该map对象的keySet()即map的key集合。而HashMap通过hash函数和key实现,具体实现见HashMap,篇幅有限这里就不展开说明了。以下为HashSet的源码,HashSet有一个全局唯一的PRESENT指向的Object对象,add的时候使用其作为map的value。现在有疑问的地方就是,这里为什么不用null来代理PRESENT比直接使用new Ob

2020-05-29 09:49:27 2675

原创 为什么初始标记停顿时间与堆大小无关,只与GCROOTS的数量相关

为什么初始标记停顿时间与堆大小无关,只与GCROOTS的数量相关

2020-04-09 11:05:04 8108

原创 CMS并发清理阶段为什么是安全的

今天复习CMS收集器相关内容,已知收集过程如下:并发标记后有重新标记对并发标记过程,用户线程对引用关系产生的变化,能保证最终正确能标记出正确要被清理的对象。那并发清理是如何保证是安全的呢?由于初始标记、并发标记、重新标记的内容,网络上或书籍(深入理解java虚拟机第三版)等资料比较多,阐述的也比较清晰,这部分的内容就不再进行说明,感兴趣的朋友可以先去自行了解,再回过头看该文章。本人...

2020-04-08 15:16:26 11689 36

原创 lambda之命令者模式

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。详见菜鸟教程描述 以上是一段高度抽象的描述,不是特别熟悉的该模式的情况下,看完后就是云里雾里,要理解高度抽象这个段话,就得返璞归真,理解这段高度概括的话以前是...

2020-03-27 16:36:12 378

原创 linux git@ permission deny 问题

问题回顾,由于服务器配置变动,以前某个项目无法拉取代码,以前直接免密拉取,现在是需要输入密码,输入正确的密码一直弹出提示permission deny。最终未找出问题原因,但是通过更改配置协议,既能快速解决以上问题。每个项目下有,隐藏的.git目录,进入.git目录,其中包含config文件,该文件中配置该项目的配置,修改其中内容配置如下:#原来的配置通过git协议连接#url = g...

2019-12-18 11:14:49 8277

原创 垃圾收集器参数总结

用法为:-XX:+UseSerialGC,启用一下配置参数参数 描述 UseSerialGC 虚拟机运行在Client模式下的默认值,打开此开关后,使用Serial+SerialOld的收集器组合进行内存回收 UseParNewGC 打开此开关后,使用ParNew + Serial Old的收集器组合进行内存回收 UseConcMarkSweepGC 打开此...

2019-11-22 18:28:09 11389

原创 maven实现对js文件进行变量替换和文件压缩(2)

前情回顾:实现对js文件进行变量替换和文件压缩方式如下:现在实现方式有两种:1.对js文件进行压缩,再对其进行变量替换。 2.对js文件进行变量替换,再对其进行压缩。前文https://mp.csdn.net/postedit/103187480介绍了通过maven方式介绍了第一种方式,本文将介绍第二种方式,...

2019-11-22 10:27:02 12064

原创 maven实现对js文件进行变量替换和文件压缩

如果不存在变量替换问题,请跳转至该链接https://blog.csdn.net/lianggeblog/article/details/100047723进行快速配置。需求:发布线上正式版本时需要对js文件进行压缩,但项目中的js、html文件中有动态变量需要通过maven进行动态替换,核心配置如下<!--指定变量替换文件所在位置--> <filters&...

2019-11-21 18:12:30 12229

原创 10.24记Java分派

分派Java是一门面向对象的语言,因为Java具备面向对象的3个基本特征:继承、封装和多态。分派调用过程将会揭示多态性特征的一些最基本的体现,如”重载”和“重写”在Java虚拟机中是如何实现的,虚拟机如何确定正确的目标方法。1.静态分派public class Example { public void sayHello(Human human){ ...

2019-10-24 22:20:00 11284

原创 Git快速回滚merge操作

前言误将其他分支的代码merge到当前分支。1.git reflog查看merge操作的上一个提交记录的版本号。2.git reset --hard 版本号回滚到该版本号状态的代码。...

2019-10-24 21:23:16 12411

原创 Minor GC和Full GC区别

新生代GC(Minor GC):指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生夕灭的特性,所以Minor GC非常频繁,一般回收速度也比较快。老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scavenge收集器的收集策略里就有直接进行Major GC的策略选择过程...

2019-10-08 14:40:37 11521

转载 JVM调优总结

Xms 是指设定程序启动时占用内存大小。一般来讲,大点,程序会启动的快一点,但是也可能会导致机器暂时间变慢。Xmx 是指设定程序运行期间最大可占用的内存大小。如果程序运行需要占用更多的内存,超出了这个设置值,就会抛出OutOfMemory异常。Xss 是指设定每个线程的堆栈大小。这个就要依据你的程序,看一个线程大约需要占用多少内存,可能会有多少线程同时运行等。以上三个参数的设置都是默认...

2019-09-27 14:48:50 164

原创 内部类实现懒汉模式下的单例

双重检查(double-check)实现对象单例懒加载,虽然能够实现逻辑,由于使用了同步锁、volatile关键字,代码和理解过程较为复杂,因此还写了一篇梳理其相关逻辑的文章,从评论能看出来大家对代码的用法见解各不同,链接如下https://blog.csdn.net/FU250/article/details/79721197,由此可见其理解复杂度,那能不能有更简洁的方式实现单例懒汉模式加载呢...

2019-09-25 10:09:15 11417

原创 linux下快速更改jenkins已忘记密码的账户(无须删除配置文件)

当时google的时候前篇一律的叫你删除配置文件。其实不用那么麻烦,可以精确到修改每个账户的密码。要修改jenkins的账户信息,首先当然得先找到jenkins的位置,一般jenkins是通过web部署的。1.快速定位jenkins的位置ps -ef | grep jenkins找到jenkins进程就能定位到jenkins的位置了,例如:/data/www/apache-tom...

2019-08-23 11:23:43 20620

原创 html2pdf使用总结

起源:项目中用到使用html转pdf功能,将开发过程中,几个主要功能提炼出来,分享给大家并有github例子,clone下来配置好jdk就能直接跑例子,代码和逻辑也超简单,一看就能明白。环境配置:jdk1.8.0_77 idea win10htmlpdf版本如下<dependencies> <dependency&...

2019-08-12 15:19:03 25181 1

原创 oss直接下载文件到客户端

前提需求:支持用户将oss端的文件进行下载使用。1.最初分析,将oss端的文件下载到服务端 ==》再将服务端的文件提供用户下载 ==》用户下载完成后,删除服务端临时下载文件。这样做第一、步骤复杂,加大了程序出错的概率。第二、效率低下,做了两次文件传输。2.设想的最优方案,既然都是流的传输,如果能够实现 oss端的文件 ==》 用户端。这样做明显比最初的方案,步骤简洁,不易出错,只要...

2019-07-29 11:41:31 19824 5

原创 git+pylint实现python提交代码格式校验

快速搭建git+pylint;git+python代码控制

2019-07-12 17:42:56 18590

原创 python浅拷贝和深度拷贝

通过代码和结果来理解浅拷贝和深度拷贝,先来看看python中有那些常见的浅拷贝方法:1.使用数据类型本身的构造器:l1 = [1,2,3]l2 = list(l1)l1 == l2 #Truel1 is l2 #False#l2就是l1的浅拷贝,set、dict与上面的浅拷贝一致t1 = (1,2,3)t2 = tuple(t1)t1 == t2 #Truet1...

2019-07-05 09:36:21 17227

原创 python字符串拼接效率比较

直接看代码方式一:import timestart_time = time.perf_counter()s = ''for n in range(0,1000): s += str(n)end_time = time.perf_counter()print('Time elapse:{}'.format(end_time - start_time))方式二:...

2019-07-01 15:52:41 20295

原创 HTTP1.0与HTTP1.1区别

在HTTP/1,0时期,每次HTTP请求都会创建一个新的TCP连接,请求完成之后这个TCP连接就会关闭。这种通信模式的效率不高,所以在HTTP/1.1中,引用了HTTP长连接的概念,使用长连接的HTTP协议,会在响应头加入Connection:keep-alive。这样当浏览器完成一次请求后,浏览器和服务器之间的TCP连接不会关闭,再次访问这个服务器上的网页时,浏览器会继续使用这一条已经建立的连接...

2019-06-04 09:38:26 14084

原创 方法内联(下)

然而,对于需要动态绑定的虚方法调用来说,即时编译器则需要先对虚方法调用进行虚化(devirtualize),即转换为一个或多个直接调用,然后才能进行方法内联。即时编译器的去虚化方式可分为完全去虚化以及条件去虚化(guarded devirtualization)。完全去虚化是通过类型推导或者类层次分析(class hierachy analysis),识别虚方法调用的唯一目标方法,从而将其...

2019-05-29 13:50:45 10813

原创 方法内联(上)

它指的是:在编译过程中遇到方法调用时,将目标方法的方法体纳入编译范围之中,并取代原方法调用的优化手段。方法内联不仅可以消除调用本身带来的性能开销,还可以进一步触发更多的优化。因此,它可以算是编译优化里最为重要的一环。以getter/setter为例,如果没有方法内联,在调用getter/settter时,程序需要保存当前方法的执行位置,创建并压入用于getter/setter的栈桢、访问字...

2019-05-21 10:44:19 12001

原创 逃逸分析

Java中Iterable对象的foreach循环遍历是一个语法糖,Java编译器会将该语法糖编译为调用Iterable对象的iterator方法,并用返回的Iterator对象的hasNext以及next方法,来完成遍历。public void forEach(ArrayList<Object> list, Consumer<Object> f) { for...

2019-05-21 10:32:58 11376

原创 Java字节码(基础篇)

操作数栈Java字节码是Java虚拟机所使用的指令集。因此,它与Java虚拟机基于栈的计算模型是密不可分的。在解释执行过程中,每当为Java方法分配栈桢时,Java虚拟机往往需要开辟一块额外的空间作为操作数栈,来存放计算的操作数以及返回结果。具体来说便是:执行每一条指令之前,Java虚拟机要求该指令的操作数已被压入操作数栈中。在执行指令时,Java虚拟机会将该指令所需的操作数弹出,并且...

2019-05-16 17:21:52 14702 1

原创 JVM是如何实现反射的?

反射调用的实现每个Method实例的第一次反射调用都会生成一个委派实现,它所委派的具体实现便是一个本地实现。本地实现非常容易理解。当进入了Java虚拟机内部之后,我们便拥有了Method实例所指向方法的具体地址。这时候,反射调用无非就是将传入的参数准备好,然后调用进入目标方法。// v0 版本import java.lang.reflect.Method;public class ...

2019-05-15 11:11:14 10079

原创 Java虚拟机是怎么实现synchronized的?

在Java程序中,我们可以利用synchronized关键字来对程序进行加锁。它既可以用来声明一个synchronized代码块,也可以直接标记静态方法或者实例方法。当声明synchronized代码块时,编译而成的字节码将包含monitorenter和monitorexit指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是synchronized关键字括号 里的引用),作为所要加...

2019-05-15 10:59:57 9659

原创 JVM是如何执行方法调用的?(下)

1.虚方法的调用Java里所有非私有实例方法调用都会被编译成invokevirtual指令,而接口方法调用都会被编译成invokeinterface指令。这两种指令,均属于Java虚拟机中的虚方法调用。在绝大多数情况下,Java虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。那么,相对于静态绑定的非虚方法调用来说,虚方法调用更加耗时。在Java虚...

2019-05-10 11:03:01 10261

原创 JVM是如何执行方法调用的?(上)

重载与重写重载的方法在编译过程中即可完成识别。具体到每一个方法调用,Java编译器会根据所传入参数的声明类型(注意与实际类型区分)来选取重载方法。选取的过程共分为三个阶段:1.在不考虑对基本类型自动装拆箱(auto-boxing,auto-unboxing),以及可变长参数的情况下选取重载方法:2.如果在第1个阶段中没有找到适配的方法,那么在允许自动装拆箱,但不允许可变长参数的情况下选...

2019-05-10 10:59:29 10162

原创 Java虚拟机是如何加载Java类的?

Java语言的类型可以分为两大类:基本类型(primitive types)和引用类型(reference types)。基本类型是由Java虚拟机预先定义好的。另一个大类引用类型,Java将其细分为四种:类、接口、数组类和泛型参数。由于泛型参数会在编译过程中被擦除,因此Java虚拟机实际上只有前三种。在类、接口和数组类中,数组类是由Java虚拟机直接生成的,其他两种则有对应的字节流。说到...

2019-05-09 14:16:15 10186

原创 java代码是怎么运行的?

为什么Java要在虚拟机里运行?java程序抽象程度高,肯定不能直接在硬件上运行。运行之前肯定需要先转换程机器码。不同的机器转换出的机器码肯定不一样。1.使用虚拟机Java转换出的字节码是一致的,通过java虚拟机字节码转换为对应的机器码,因此java才有了跨平台的效果,由于字节码不变,java程序就可以在不同平台上的虚拟机运行。2.提供托管环境,自动内存管理与垃圾回收。托管环境还提供...

2019-05-08 16:27:50 10503

原创 redis进行set操作时异常总结

事情经过:项目中使用redis,环境进行过一次网络迁移,之后就无法拿到redis连接。                1、先通过ping命令排除网络原因,其实这里建议使用 telnet 命令:格式 telnet ip port,不仅能排查网络是否连通并且知道改端口号是否能脸上,以上的port指的是redis的端口号。                 以上结论是ping能ping通,但tel...

2019-01-03 09:37:28 22239

原创 ssh连接展示图形界面

环境描述:centos7服务器:已安装图形界面问题描述:使用ssh连接跑matplotlib制图时图形界面不出现提示:DISPLAY变量未定义但在服务端跑matplotlib能正常展示该图形,后面在ssh连接试过用eog 命令打开一个png图片,发现同样的问题。(eog:20617): Gtk-WARNING **: cannot open display:这个问题通过ssh...

2018-12-29 14:47:36 23940

Xshell+ftp个人班免费使用

在xshell官网通过申请,提供的免费版的软件进行使用,若有安装过可以直接覆盖以前已到期的软件。

2019-01-30

Java多线程编程核心技术

java多线程编程核心---详细说明并发编程核心技术。 在java并发编程基础上加深细节理解。

2019-01-08

java编译后的文件上传至linux服务端

帮助把git两个提交间的差异文件从本地编译后的项目中上传至linux系统服务端项目并生成统计的相关文件信息

2018-09-08

java开发手册

java开发手册,详细的介绍java开发各个方面需要注意的地方,值得一读。

2018-03-26

Spring攻略(第二版)高清版

Spring攻略(第二版)高清版,让你快速掌握spring核心知识。

2017-10-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除