
java
文章平均质量分 82
iloveoverfly
年轻人不讲code德
展开
-
RocketMQ与innoDB使用页缓存(PageCache)提升查询效率
什么是页缓存(PageCache)?页缓存(PageCache)是OS对文件的缓存,用于加速对文件的读写。一般来说,程序对文件进行顺序读写的速度几乎接近于内存的读写速度,主要原因就是由于OS使用PageCache机制对读写访问操作进行了性能优化,将一部分的内存用作PageCache。对于数据的写入,OS会先写入至Cache内,随后通过异步的方式由pdflush内核线程将Cache内的数据刷盘至物理磁盘上。对于数据的读取,如果一次读取文件时出现未命中PageCache的情况,OS从物理磁盘上访问读取文件的原创 2022-04-08 00:42:39 · 939 阅读 · 0 评论 -
CPU使用飙升,内存暴涨,jvm如何快速定位?
通常,操作线上服务器的权限是很受限制的。并且,线上服务器很少安装jvm可视化工具。甚至,连jdk的环境变量都不会配置(如果真的没有jdk环境变量,你是如何定位安装目录的?which java/where java)。如果,突然线上服务器告警,如何能过在几分钟之内快速定位问题呢?接下来使用jdk自带的jmap,jstack,jstat等命令,教你如何快速定位问题一、内存使用率升高内存的使用率在不断升高,垃圾回收以后也没有降低。这时,有可能出现了内存泄漏,即一个不会失效的对象的集合在不断的创建对象,原创 2021-12-26 22:12:30 · 1738 阅读 · 0 评论 -
为什么要写单元测试?基于junit如何写单元测试?
为什么要写单元测试一聊起测试用例,很多人第一反应就是,我们公司的测试会写单元测试用例的。我们研发到底要不要写单元测试用例呢?参考阿里巴巴开发手册,第8条规则(单元测试的基本目标:语句覆盖率达到 70%;核心模块的语句覆盖率和分支覆盖率都要达到 100%),大厂的要求就是必须喽。我个人感觉,写单元测试用例也是很有必要的,好处很多,例如:保证代码质量!!!无论初级,中级,高级开发工程的代码,功能是必要要保证是正确的;交付测试以后,bug锐减,联调飞快。 代码逻辑“文档化”!!!新人接手维护模块代码时,原创 2021-04-24 19:14:24 · 1449 阅读 · 6 评论 -
如何使用validation类似于AOP切面的形式抽象参数的校验逻辑?
开发中,通常操作逻辑都是先进性数据校验,校验完毕以后才进行真正的逻辑处理。通常情况下,可以使用javax.validation校验注解,类似于AOP面向切面的实现数据的校验。在springboot中引入spring-boot-starter-web依赖,就会自动引入hibernate-validator。如图:内置注解使用javax.validation校验参数,一般在controller层,对方法参数进行校验。常用的注解包括:@NotNull,值不能为空,@Positive,数字为..原创 2020-11-30 17:03:28 · 4036 阅读 · 1 评论 -
如何写好Java业务代码?这也是有很多规范的
在自己的工作过程中,对于代码的规范总结出以下几点,如果有不足的希望大家指出。枚举类的使用在业务中特别是状态的值,在对外发布api的vo对象中,加上状态枚举值的注释,可以让调用方一目了然。示例: public class ProductVo implements Serializable { /** * 审核状态 * {@link ProductStatus} */ @ApiModelProperty("状态") private Integer s原创 2020-09-04 12:49:46 · 6824 阅读 · 2 评论 -
为什么要使用线程池?dubbo是如何扩展的?
为什么要使用线程池多线程能够提高系统的并发性,充分利用服务的资源。但是,如果无限制的创建线程,反而会拖垮服务器的性能。一是创建线程是一个耗资源的操作,二是过多的线程会加剧线程上下文切换,竞争CPU。所以,会对线程使用池化的方案,重复的利用已经创建的线程。在Java中使用ThreadPoolExecutor定义线程池,其部分的源码如下: /** * ThreadPoolExecutor 初始化方法 */ // ThreadPoolExecutor.class原创 2020-06-03 23:23:51 · 3756 阅读 · 0 评论 -
Netty如何实现常见的两种线程模式?dubbo基于Netty发布服务时如何选择线程模式?
在基于Netty的网络编程中,Channel定义了网络通信的两端,例如,客户端SocketChannel与服务端SeverSocketChannel。EventLoop定义了通信Channel触发的各类事件的监听,例如,客户端连接请求。EventLoopGroup定义了一组EventLoop。通常,EventLoop与一个Thread绑定,EventLoop与Channel绑定后,两者关联关系就不会改变。以服务端接收监听客户端的为例,执行流程如下:Netty实现的线程模式可以参考为什么要使用NIO.原创 2020-05-31 22:44:36 · 3627 阅读 · 0 评论 -
为什么要使用NIO?Tomcat是如何解决服务器端高并发的请求
为什么要使用NIO在Java中使用Socket(套接字)实现了基于TCP/IP协议的网络编程。以HTTP协议为例,在HTTP服务器端的开发中,如果不使用NIO该如何实现呢?单个线程定义客户端连接使用ServerSocket绑定某个端口号,监听客户端的请求,如果有客户端向服务端发送请求,就会建立TCP连接,生成Socket客户端,与服务器基于i/o流实现信息交互。示例代码如下:public static void main(String[] args) { ServerSoc原创 2020-05-19 23:06:00 · 4421 阅读 · 0 评论 -
什么是双亲委派?Tomcat是如何扩展ClassLoader的?
在JVM中,首次使用某个类时,JVM会把.class文件的二进制子节流加载到内存的方法区,创建对应的Class对象。虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作交由ClassLoader类来实现。而判断一个Class对象是否相等,需要根据Class对象和ClassLoader类加载器同时判断,在创建Class对象时,会设置对应的ClassLoader类加载...原创 2020-04-07 23:38:55 · 6719 阅读 · 0 评论 -
为什么JVM老年代要使用CMS垃圾回收器?
CMS(concurrent mark sweep)并发标记清理收集器以获取最短回收停顿时间为目标的收集器,特别适用于互联网网站或者B/S系统的服务端上,这类重视服务响应速度的,给用户良好的体验的情况。运行流程CMS收集器使用多线程技术,基于标记-清理算法,实现了老年代并发地标记和清理。其运行地步骤如下:初始标记(CMS initial mark),停止所有用户线程(stop the ...原创 2020-04-06 00:15:29 · 6984 阅读 · 1 评论 -
深入理解volatile和使用场景
volatile特性和实现原理volatile 实现了共享变量的线程安全,在多线程操作单个volatile变量时,保证了线程间的可见性。根据happens-before规则,对一个volatile共享变量的写操作,总是happens-before对该volatile共享变量的读操作。当线程对volatile共享变量进行写操作时JMM会把线程对volatile共享变量写操作后,修改的值刷新...原创 2020-03-25 21:55:11 · 659 阅读 · 0 评论 -
HashMap-Java8源码教会你正确的使用方式
HashMap在Java中,基于散列表(hash table)实现的。其特性如下:HashMap使用分离链接法存储节点hash冲突的元素,使用基于单链表Node和基于红黑树的TreeNode存两种方式储冲突的对象。 填充因子默认为0.75,当添加元素使填充因子大于loadFactor设置的值,则就HashMap就需要扩容,并且再散列。 被加载的对象在java中必须实现int hashCod...原创 2020-02-23 20:11:22 · 323 阅读 · 0 评论 -
TreeMap-Java8源码教会你正确的使用方式
TreeMap在java中,是基于红黑树的原理实现的(红黑树的原理请参考红黑树(red black tree)-分分钟钟被安排地明明白白),其原理是一棵有条件的平衡二叉查询树。节点定义包含了左右儿子节点,父节点,颜色标识。源码如下: /** * 红黑树节点 */ static final class Entry<K,V> implements M...原创 2020-02-23 14:32:14 · 224 阅读 · 0 评论 -
List列表集合,Iterator迭代器-Java8源码教会你正确的使用方式
ArrayList集合在java中,基于数组实现,get(i)查询操作时间复杂度为O(1)。add新增和remove操作存在潜在的昂贵时间花销。因为,对数组中某个位置的元素(非尾元素)进行add和remove操作,该元素后的所有元素会进行整体移动复制操作。当add操作时,添加元素的个数大于集合容量,arraylist会进行扩容处理,重新创建原始容量2倍大小的数组,然后进行数据复制操作。ar...原创 2020-02-18 23:10:36 · 452 阅读 · 0 评论 -
什么是分布式锁?Zookeeper和Redis是如何实现的?
为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现这个分布式锁。具体定义,实现和使用场景,请参详什么是分布式锁,该篇文章强力推荐,写得很透彻。着重强调下,分布式锁具体的条件和重要的实现逻辑。在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行常见的情景,例如定时任务在多个服务运行。同一个用户对同一...原创 2020-01-19 22:02:56 · 5562 阅读 · 0 评论 -
Springboot基于AbstractRoutingDataSource实现多数据源的动态切换
为了提高数据库的查询效率,利用数据库主从机制,写走主库,查询走从库。如果只是实现一主一从类似简单的主从模式,可以继承AbstractRoutingDataSource实现读写分离。而不需使用mycat,sharedingJDBC等数据库插件。分析AbstractRoutingDataSource可知,defaultTargetDataSource,表示默认的数据源;targetDataSour...原创 2020-01-17 20:48:11 · 5103 阅读 · 0 评论 -
基于mybatis 类型处理器typeHandlers实现数据库数据到业务对象的转换
在开发中,遇到需要把数据库中存储的json格式的数据转换为java对象中map集合或者list集合你是怎么处理?把数据库中的电话号码,身份证被对称加密的数据解密出来你是怎么处理的?在前后端的时间戳转换为数据库的date日期格式时,你是怎么处理的?在开发中,主流使用mybatis作为orm框架。从数据库数据库到项目业务对象的数据获取,mybatis提供了typeHandlers插件做转换。在修改...原创 2020-01-10 15:39:16 · 405 阅读 · 0 评论 -
CAS+失败重试方式实现数据库的原子性更新
在数据库修改单条数据时,常用的方式是select for update的悲观锁机制,如果锁竞争比较大,没有获得锁的操作会阻塞。使用CAS乐观锁的方式,可以大大提高并发性。例如,在分布式服务中,多个用户并发下单操作前会先扣减库存时,网上盗图,服务1,服务2和服务3为不同机器上的库存服务。库存扣减操作流程如下:使用cas方式的乐观锁,当库存还剩3个,3个用户同时下单,服务同时扣减库存,可以并发...原创 2020-01-04 17:00:15 · 4341 阅读 · 0 评论 -
深入理解synchronized锁和使用场景
synchronized使用场景在java中,提供了synchronized实现共享对象的并发访问。当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。通常有三种使用方式,如下:对于普通同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。线程安全类在java8源码中,提供...原创 2020-02-28 17:42:14 · 1172 阅读 · 0 评论