- 博客(130)
- 资源 (23)
- 收藏
- 关注
原创 垃圾回收算法与JVM内存管理
因为之前公司有人分享过G1回收器的内容,很多人听的云里雾里(包括我)。甚至有人问学GC有什么用,对写代码有帮助吗。我想这个问题不可置否。《深入理解Java虚拟机》一书中有这么一句话:Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来。这篇文章的目的就是为了突破这座藩篱,尽量让更多的人理解JVM的垃圾回收机制。1、GC之前早在1960...
2018-12-06 17:47:08 789 3
原创 ThreadPoolExecutor最佳实践--如何选择队列
前一篇文章《如何选择线程数》讲了如何决定线程池中线程个数,这篇文章讨论“如何选择工作队列”。再次强调一下,ThreadPoolExecutor最核心的四点:1、当有任务提交的时候,会创建核心线程去执行任务(即使有核心线程空闲);2、当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;3、当BlockingQueue满了(offer失败),就...
2018-08-12 20:55:45 5981
原创 ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。总结一下,主要有以下四点:当有任务提交的时候,会创建核心线程去执行任务;当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队;当BlockingQueue满了(offer失败),就回创建临时线程;当线程总数达到maximumPoo...
2018-07-29 15:47:05 16065 4
原创 解决CentOS7种yum源版本过低的问题
最近准备在自己服务器上玩玩docker,把网站都用docker部署下,用ELK技术栈分析一下服务器上的日志。服务器是大学里搭的,版本是CentOS6,这次重装了系统升级到CentOS7,遇到的最头疼的问题就是装软件。因为自己在Mac上有homebrew,装啥软件都很爽,基本上软件都是最新的,但是CentOS非常保守,官方的软件库里软件版本都非常低,yum装了发现很多东西都用不了。比如tmux,官方仓库版本仍然是1.8,已经不支持tmux-plugin的功能了。所以这篇文章记录一下自己解决这个问题的过程。
2021-03-03 15:46:22 4959 1
原创 ssl证书申请以及nginx证书的配置
准备知识SSL/TLS:这两个分别是Secure Socket Layer(安全套接字层),Transport Layer Security(传输层安全)的缩写。TLS是SSL的继承者,如果不是搞安全的专业人员,完全可以认为他们是一样的东西。 关于这两者的差异可以参考https://kb.cnblogs.com/page/197396/key:因为SSL/TLS使用非对称加密算法
2020-06-03 11:11:07 6673
原创 从notify和metaq初窥消息队列的前世今生
上一家公司并没有用消息队列中间件,大学里对ActiveMQ有所了解但并未深入研究,RocketMQ、Kafka也一直囿于听闻。不过在原来的项目中经常会用Redis的list实现一个分布式的阻塞队列。在短信服务调用中,会将服务的同步调用改为异步任务存入队列表批量调度以提高吞吐量,并降低大促期间大批量短信同步调用带来的压力。我觉得后面这一点也非常接近消息队列所要实现的需求。然后受益于隆基前辈的阿里消息...
2020-04-27 21:50:46 725
原创 分库分表的一些思考
分库分表这个技术在之前一家公司其实也有接触。上一家公司在业务上按照用户水平分库的,所以避免了很多业务上的问题,但也只是基于Spring的AbstractRoutingDataSource,根据userId做了简单的路由。之前也在网上听说过sharding-jdbc等中间件,也仅限于了解。所以结合我从内网看到的关于TDDL中间件的文章和外网看到的一些文章,在这篇文章中整理一下我这个新人对分库分表的认...
2020-04-27 21:47:55 902 2
原创 K-D树、K-D-B树、B-K-D树
K-D树在维基百科上定义是将K维空间中的点进行分割的数据结构,D是dimensional(维度)的缩写,K-D树是BSP(Binary Space Partitioning)的一种。维基百科的解释很正式(看的迷迷糊糊)。简单的说,K-D树就是二分查找树在K维空间的泛化(更迷糊了????)。1、K维空间的二分查找树之前的一篇文章中有讲过二分查找树(BST)这样基础的数据结构,它是基于二分查找的思想实...
2020-03-07 22:36:13 3966
原创 Spring-IOC整体设计与源码分析
最近读完《Spring技术内幕》一书,虽然此书评价貌似不高,但边看书边读源码,感觉还是有点收获,至少为阅读Spring源码提供了思路。然后这篇文章就记录一下这几天看Spring IOC这块的源码以及整体思路。1、 BeanFactory与ApplicationContext在Spring的IOC容器设计中,主要由两个容器系列:实现BeanFactory接口的简单容器,提供了完整IoC容器服...
2020-03-07 18:15:49 550
原创 SpringDataRedis踩坑记录
这几天做的功能涉及到Redis缓存,踩了不少坑,这里记录下来。1、SpringBoot自动配置的RedisTemplate在SpringBoot中可以在``properties配置文件中配置[spring.redis.*`相关属性](https://docs.spring.io/spring-boot/docs/2.1.3.RELEASE/api/org/springframework/boo...
2019-02-21 01:15:56 885
原创 ssh连接服务被拒的问题
昨天在整理服务器的文件时,删了一些没用的空文件夹。并把自己新电脑的公钥配在服务器上。然后尝试ssh登录服务器的时候出问题了:ssh_exchange_identification: Connection closed by remote host我擦,登不上去了。我刚开始以为是我公钥配错了,但既没让我输入私钥密码,也没让我输入用户登录密码。这就有点奇怪了。还好云服务器控制台有VNC登录这棵救...
2019-01-20 13:35:17 2206
原创 一枚Javer对Ruby的吐槽
公司收购了个项目,技术都很老,Web用的Ruby on Rails,前端还在用jQuery,后台数据同步用Java(用的技术也都很老)。自己以前没有接触过Ruby,只是听有些朋友大学里玩过这玩意儿,所以对我来说Ruby就是一门全新的语言。我个人是非常抵触学一门新语言的,Java都还没吃透就并行学Ruby,只会分散深入学习Java的精力。但没办法谁让公司抽到我,还是好好学吧!1、安装Ruby...
2019-01-13 14:23:57 954
原创 ForkJoinPool入门篇
《线程池ThreadPoolExecutor详解》和《任务调度线程池ScheduledThreadPoolExecutor》两篇文章将ThreadPoolExecutor和ScheduledThreadPoolExecutor两个核心线程池已经详细介绍过了,它们整体的工作结构如下图所示。这篇文章将介绍最后一个线程池——Java7中最引人瞩目的ForkJoinPool线程池。1. 为...
2018-09-16 14:57:33 12318 2
原创 使用POI解析Excel
Excel作为一种常用的数据存储格式,在很多项目中都会有相应的导入导出的功能。这篇文章会介绍如何使用Java操作Excel,以及如何解决大文件读写时内存溢出的问题。1、OpenXML标准Word、Excel、PPT是Office办公套件中最常用的三个组件。早期的Office套件大都使用二进制格式,也就是最常见以.doc、.xls、.ppt为后缀的文件;直到07这个划时代的版本将基于XM...
2018-09-08 19:07:35 26999 1
原创 使用Certbot申请Let'sEncrypt免费证书
半年前在自己的网站上配了个SSL证书,当时是用ZeroSSL进行证书申请的。但是证书三个月就会过期,每次都去手动申请,着实让人头痛。后来到Let’s Encrypt官网看了下,在它提供的ACME协议客户端列表中,最推荐使用Certbot。Certbot是有个最大的好处是,能自动化部署Let’s Encrypt证书。到Certbot官网,你可以根据自己的服务器操作系统以及使用的WebSe...
2018-08-12 23:31:01 2602
原创 Tesseract与tess4j验证码识别
验证码,英文名CAPTCHA,全称叫做:全自动区分计算机和人类的图灵测试。验证码主要为了防一些不怀好意的人(程序猿),避免批量注册账户,暴力尝试多次登录失败等一些恶意行为。最经典的就是文字型的验证码:简单的文字型验证码容易被OCR识别,所以程序猿们让文字随机旋转、扭曲、黏连,在验证码上加干扰线、加噪点以降低自动化程序的识别率,但是很多扭曲变形的文字连人都识别不出来,比如中国移动这个验证...
2018-06-30 15:48:54 6104
原创 MySQL性能优化[理论篇]-聚簇索引和非聚簇索引,InnoDB和MyISAM
聚簇索引聚簇索引(Clustered Index)并不是一种新的数据结构,只是B树索引的一种存储方式。聚簇索引的特点是完整的数据行就放在B树的叶子结点中,Clustered(聚簇,集群)就表示数据行与对应的键紧凑的存储在一起。下图是《高性能MySQL》聚簇索引的截图,其中,叶子结点包含了数据行的完整数据,非叶子节点只包含索引列数据。数据行的逻辑顺序与聚簇索引的顺序一致。B+树中...
2018-05-27 01:49:45 1808
原创 MySQL性能优化[实践篇]-复合索引实例
上篇文章最后提了个问题假设某个表有一个复合索引(c1,c2,c3,c4),问以下查询中只能使用该复合索引的c1,c2,c3部分的有那些1. where c1=x and c2=x and c4>x and c3=x2. where c1=x and c2=x and c4=x order by c33. where c1=x and c4=x group by c3,c2...
2018-05-26 17:02:11 1407
原创 MySQL性能优化[实践篇]-索引合并与复合索引
从上一篇创建索引的实践中,我们看到了索引给我们带来的性能提升是非常可观的。我们上次创建的表结构非常简单,只有两三个字段,where子句查询条件只有一个字段。实际应用场景中我们的表结构会更复杂,查询条件也会非常多。在多条件查询的情况下又如何才能用到索引呢,我们可以测试一下。准备测试数据创建表结构create table tb_test(id int primary key...
2018-05-20 19:07:01 2981
原创 对单页面应用与Router的一些思考
昨晚鑫哥到我宿舍聊天,聊了很多,从各自公司用的技术到杭州和深圳的房价,从后端技术到前端技术,一直聊到凌晨一点多,直到鑫哥被室友“驱逐”出去。中间有一段聊到公司用到的React,提到了单页面应用和Router,觉得思路很好有必要写个笔记记下来。最开始的网页早期的网页都是一个个独立的html页面,通过a标签从这个页面跳转到另外一个页面。但是同一个网站中的两个页面很多内容都是相同的,比如页头...
2018-04-27 14:24:53 1672
原创 MySQL性能优化[实践篇]-使用B树索引
准备测试数据create table tb_user( id int auto_increment primary key, name varchar(10), birth date);使用存储过程创建测试数据,不过在这之前我们先创建两个工具函数。 mysql里面默认以;作为一条完整语句的终结符,为了不与函数和存储过程中的;冲突,我们要提前使用delimiter命...
2018-04-24 15:03:23 969
原创 MySQL性能优化[理论篇]-B树索引与hash索引
对索引的优化是数据库性能优化方面最重要的一项,也是性能提升最显著的。如果把数据库比作一本新华字典,那索引就是字典前面的目录了。如果不使用目录,想从字典中直接找某个字的解释,难度可想而知,但是有了目录,我们可以先从目录中找到这个字对应的页码,然后再翻到相应的页码,就能找到这个字的完整解释了。索引的工作原理和字典目录基本一致。接下来的几篇文章我会细致的分析MySQL数据库中索引的原理以...
2018-04-20 00:19:34 1499
原创 Win32开发小回忆
这两天阿瘦找我给他的一个程序写个界面,听说是要参加啥三创比赛(都大四老狗了,汗),然后问要用什么语言——C/C++,Windows平台的。他之前没怎么接触过C++方面的界面开发,然后我就开始了一波Windows教学,顺便自己也回忆回忆(大一大二玩了一年多,之后几乎就没碰过)。先看一下整体流程,后面会对关键点进行介绍。整体流程#include <windows.h>/...
2018-04-14 03:19:06 1036
原创 B树与B+树
从二叉搜索树说起其实上一篇文章已经对BST进行过讨论,并对AVL,红黑树这样的自平衡二叉查找树分别解决了什么问题进行了讨论。上面这些数据结构理论上能达到O(log2N)O(log2N)O(log_2N)的平均时间复杂度。这个时间复杂度是基于对内存的操作而计算出来的。倘若我们的数据量十分庞大,内存无法容纳,我们不得不存储在硬盘中。这个时候二叉搜索树还能达到预期的速度吗?在回答这个...
2018-04-06 02:47:24 1444
原创 二叉搜索树BST,AVL,红黑树,伸展树
从线性查找和二分查找说起线性查找是最基础(野蛮)的查找算法,最坏的情况从头遍历到位,最好的情况比较一次,平均时间复杂度为N2N2\frac{N}{2}。二分查找能达到O(log2N)O(log2N)O(log_2N)的时间复杂度,但是前提是列表中的数据必须是有序的。不管是基于数组实现的列表(ArrayList)还是基于链表实现的列表(LinkedList),想要在插入新元素的同时保...
2018-03-26 00:11:53 2189 6
原创 两种纯CSS的方式实现优惠券上的锯齿效果
昨天有个模块分到我手里了,有个优惠券的组件要封装,正好复习复习CSS。优惠券最主要就是这个锯齿的问题。其实用图片做也完全可以,反正最后那些小图片都会被webpack编码成Base64的DataURL 关于DataURL的内容可以参考RFC2397不过用图片方式就没有啥挑战性了,那我也没必要写这篇文章记录这个过程。我们的目的是用纯CSS实现锯齿一、使用before和afte...
2018-03-22 01:46:27 20210 6
原创 DX面经
马上大学毕业了,来HZ找实习生工作,一次电话面试问的问题比那些面对面的问问题更清楚,单刀直入,让我记忆深刻。面试官:先说一下Object类里面的方法。我:首先就是hashCode和equals方法吧,这两个方法主要用在HashMap里面,因为HashMap存数据的时候要根据key的哈希值计算数据放在哪个桶里,然后为了解决解决哈希冲突还需要使用equals方法进行比较。这个Has...
2018-03-18 20:19:38 491
原创 Struts2怎么使用OGNL的
这几天整理笔记,发现了以前的几篇文章没发出来在之前的一篇文章中我们看到了OGNL的强大功能。 OGNL并不是专门为Struts2框架而设计的,它是用于获取和设置Java对象属性的一种独立的表达式语言。 所以在看这篇文章之前建议先把之前的一篇文章看完。Struts2框架就是使用OGNL完成数据的设置与访问的:数据访问主要体现在JSP页面中我们可以使用OGNL表...
2018-03-17 18:12:48 811
原创 Javaer眼中的JS
把之前写的笔记整理了一下,重新拾起JS基本数据类型 JS Java number double boolean boolean string String null(Object类型的null引用) null undefined(未定义类型) null Symbol(ES6标准新增类型) en...
2018-03-16 23:17:30 505 1
原创 React入门学习笔记
React介绍谷歌大法,一搜一大把React环境安装安装react,react-dom模块:cnpm install react react-dom --save因为react中使用了JSX语法,所以需要babel进行转换:cnpm install babel-preset-react babel-core --save-dev如果项目使用ES6语法,还需要...
2018-03-16 19:18:09 356
原创 Babel入门教程
babel有什么用ES6标准从ES2015制定开始已经有几个年头了,虽然各大浏览器最新版都在极力地实现标准,但并不是所有人都会用最新版本的浏览器,特别是天朝像某狗某游这样的二次包装的浏览器,使用别人的内核而且版本更新又比较慢,导致新标准不能及时地在浏览器端使用。Babel就是用来解决这个问题的:将ES6的代码转换成ES5的代码,从而在现有的环境中运行,让我们能用下一代JS编写前端代码。...
2018-03-16 01:24:35 1639
原创 ES6学习笔记-OOP面向对象编程
ES5中使用构造函数定义类ES6之前定义一个类,都是通过定义构造函数实现:function Rectangle(x,y){ this.x = x; this.y = y;}Rectangle.prototype.area = function(){ return x * y;}console.log(new Rectangle(1, 2));// Rectangl...
2018-03-15 17:58:33 829
原创 ES6语法学习-JS中的lambda:箭头函数
1. 最基本的写法使用=>操作符,简化匿名函数的定义(param1,param2,...,paramN) => { // 函数体}// 参数列表与箭头符号不能换行var func = () => 1;// SyntaxError: expected expression, got '=>'// 注意解析的优先级let c...
2018-03-14 14:50:33 3430
原创 ES6学习笔记-解构赋值
解构赋值解构赋值可以将数组中的元素或对象中的属性赋值给指定的变量。1. 数组解构1.1 基本用法var a, b, rest;// 数组解构[a, b] = [10, 20];console.log(a); // 10console.log(b); // 20// 变参解构[a, b, ...rest] = [10, 20, 30, 40, 50];co...
2018-03-14 13:30:08 440
原创 ES6学习笔记-var,let,const
var,let和constES6新增了let关键字用于声明变量,用法上和var类似,这里列举一些两者的区别。let与var区别let声明的变量只在它所在的代码块内有效:因为上面的特性,所以let很适合在for循环中做计数器:var声明的变量会被挂在到全局的window上,而let并不会:let不允许在同一个作用域内对同一个变量重复声明:let不存在变量提...
2018-03-14 10:09:49 436
原创 MySQL性能优化[准备篇]-单条SQL性能剖析
上面一篇文章已经将慢查询语句记录到日志中,接着我们就要对单条SQL查询进行性能分析,了解它慢在何处,才能对症下药进行性能优化。show profileshow profile命令是MySQL5.1之后引入的,由开源社区的Jeremy Cole贡献。1. 开启profilingprofiling系统变量是用来支持访问剖析信息的,profiling默认是关闭的,我们可以用set...
2018-03-10 00:22:15 451
原创 MySQL性能优化[准备篇]-慢查询日志
在MySQL5.0及之前的版本中,慢查询日志的响应时间单位是秒。显然对于互联网与电子商务如此发达的现在,“秒”级别的查询实在太慢了。在MySQL5.1及更新的版本中,慢查询日志的功能得到了增强,甚至可以通过设置long_query_time为0来捕获所有的查询。在MySQL的当前版本中,慢查询日志是开销最低、精度最高的测量查询时间的工具。我们完全不用担心开启慢查询日志会带来额外的I/O开销,这...
2018-03-10 00:15:52 1493
翻译 A Java Fork/Join Framework
原文链接:A Java Fork/Join Framework(PDF) - Doug Lea 基于并发编程网 – ifeve.com上 Alex/萧欢 翻译、方腾飞 校对的译文稿:Java Fork Join 框架 译文发在并发编程网 – ifeve.com:Java Fork/Join框架, 2017-11-02Java Fork/Join框架...
2018-02-24 14:06:34 702
翻译 位运算的奇技淫巧:Bit Twiddling Hacks
原文名:Bit Twiddling Hacks 原文地址:http://graphics.stanford.edu/~seander/bithacks.html 作者:Sean Eron Anderson, seander@cs.stanford.edu本文所包含的代码片段不受著作权法的限制(除非有特别注明),任何人可以自由使用。本文的收集整理工作由Sean Ero...
2018-02-24 13:31:36 6388 2
原创 Java多线程复习与巩固(七)--任务调度线程池ScheduledThreadPoolExecutor
强烈建议看本文之前,先把《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》看完。首先因为ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,不了解ThreadPoolExecutor的原理看本文可能会有些吃力;另外本文的行文思路会按照《Java多线程复习与巩固(六)–线程池ThreadPoolExecutor》的顺序进...
2018-02-22 00:07:34 1516
Android 音乐播放器简单实现源码实例下载
2017-05-05
快速排序的六种实现,单轴快排,双轴快排JAVA实现
2017-05-04
前端 运维 安卓客户端 等工具集, angrytools.com网的神器
2017-03-11
View滑动效果常用属性详解2-使用scrollX|scrollY和Scroller实现自定义ViewPager
2017-01-02
使用scroll,translation,margin三种滑动效果的对比
2017-01-01
AndroidStudio黑色主题以及AndroidStudio下的Eclipse快捷键
2016-10-27
前端API合集HTML5,CSS3,JavaScript,jQuery,Bootstrap的API,都是个人认为质量最好的API文档
2016-09-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人