
JAVA技术
文章平均质量分 83
仰望星空的尘埃
https://github.com/a422478514
我未曾见过一个早起、勤奋、谨慎、诚实的人抱怨命运不好;良好的品格,优良的习惯,坚强的意志,是不会被假设所谓的命运击败的。
展开
-
5 分钟搞懂布隆过滤器,亿级数据过滤算法你值得拥有!
在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题。布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。一、布隆过滤器简介当你往简单数组或列表中插入新数据时,将不会根据插入项的值来确转载 2021-07-18 17:58:27 · 679 阅读 · 0 评论 -
SpringBoot单元测试模板代码
一、依赖<dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version></dependency>二、新建测试基础类SpringBaseWithCustomizeRunnerTestimpo.原创 2021-07-12 21:07:43 · 459 阅读 · 0 评论 -
dcevm
什么是dcevm dcevm(DynamicCode Evolution Virtual Machine)是java hostspot的补丁(严格上来说是修改),允许(并非无限制)在运行环境下修改加载的类文件.当前虚拟机只允许修改方法体(method bodies),decvm,可以增加 删除类属性、方法,甚至改变一个类的父类。原理参见Dynamic Code Evolution for Java dcevm 原理 dcevm 是一个开源项目,遵从GPL 2.0。源文件及执行...转载 2020-09-21 21:45:58 · 2277 阅读 · 0 评论 -
HotSwap和JRebel原理
HotSwap和Instrumentation在2002年的时候,Sun在Java 1.4的JVM中引入了一种新的被称作HotSwap的实验性技术,这一技术被合成到了Debugger API内部,其允许调试者使用同一个类标识来更新类的字节码。这意味着所有对象都可以引用一个更新后的类,并在它们的方法被调用的时候执行新的代码,这就避免了无论何时只要有类的字节码被修改就要重载容器的这种要求。所有新式的IDE(包括Eclipse、IDEA和NetBeans)都支持这一技术,从Java 5开始,这一功能还通过In转载 2020-09-21 21:20:23 · 1056 阅读 · 0 评论 -
RootLogger Logger Appender配置的优先级问题
简单的说,Logger可以理解是RootLogger的子类重写。Case1:如果RootLogger的level是error,而Logger的level是debug且additivity是true,那么当Logger记录debug日志的时候,RootLogger也会记录debug日志,也就是说Logger的level把RootLogger里的level也覆盖了。Case2:如上一个Case,如果出现更精确的控制配置的Logger,则其level会覆盖作用域更大的Logger的配置。Cas原创 2020-09-13 17:50:53 · 993 阅读 · 0 评论 -
JVM 史上最最最完整知识总结!
Java运行时数据区:Java虚拟机在执行Java程序的过程中会将其管理的内存划分为若干个不同的数据区域,这些区域有各自的用途、创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁。Java虚拟机所管理的内存包括以下几个运行时数据区域,如图:1、程序计数器:指向当前线程正在执行的字节码指令。线程私有的。2、虚拟机栈:虚拟机栈是Java执行方法的内存模型。每个方法被执行的时候,都会创建一个栈帧,把栈帧压人栈,当方法正常返回或者抛出未捕转载 2020-08-11 15:44:20 · 377 阅读 · 0 评论 -
StampedLock类简介
一、StampedLock类简介在搞定ReentrantReadWriteLock 几道小小数学题就够了,我们详细的介绍了RWL,但 Doug Lea 觉得不够好。StampedLock类,在JDK1.8时引入,是对读写锁ReentrantReadWriteLock的增强,该类提供了一些功能,优化了读锁、写锁的访问,同时使读写锁之间可以互相转换,更细粒度控制并发。首先明确下,该类的设计初衷是作为一个内部工具类,用于辅助开发其它线程安全组件,用得好,该类可以提升系统性能,用不好,容易产生死锁和其它莫.转载 2020-08-11 15:36:42 · 306 阅读 · 1 评论 -
百亿关系链,架构如何设计?
文章较长,听我娓娓道来。粉丝与关注,社交好友,都是典型的“多对多关系”的业务,这类业务的核心服务是好友中心,当关系链达到百亿之后,好友中心架构设计要考虑哪些因素,是本文将要分享的内容。什么是“多对多”关系?所谓的“多对多”,来自数据库设计中的“实体-关系”ER模型,用来描述实体之间的关联关系,一个学生可以选修多个课程,一个课程可以被多个学生选修,这里学生与课程时间的关系,就是多对多关系。什么是好友关系?好友关系主要分为两类:(1)弱好友关系;(2)强好友关系;...转载 2020-08-09 11:30:42 · 430 阅读 · 0 评论 -
Java空指针居然还能这样玩
相信在座的各位都遇到过空指针异常,不甚其烦,本文不是教你避免空指针,而是一些对空指针其他方面的理解。本文可能有点另类,也可能会打破你对空指针的认知。1、null.method() 空指针?我们知道调用一个对象的方法,如果对象为null肯定会报空指针错误的,但你确定一定会吗?不一定!来看下面的示例:/***访问静态方法*@from 微信公众号:Java技术栈*/privatestaticvoidtest(){NullTestnullTest...转载 2020-08-09 11:24:33 · 280 阅读 · 0 评论 -
Java中的强软弱虚四种引用
Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主要目的有两个: 可以让程序员通过代码的方式来决定某个对象的生命周期; 有利用垃圾回收。 强引用强引用是最普遍的一种引用,我们写的代码,99.9999%都是强引用:Objecto.转载 2020-08-09 11:18:11 · 307 阅读 · 0 评论 -
Logback 还是 Log4j2
作者:何甜甜在吗链接:juejin.im/post/6844903926777511943前段时间写了一篇文章(Logback配置文件这么写,TPS提高10倍),反响还不错,有很多网友也发表了自己的意见: 意见1 意见2 意见三总结一下就是: logback性能测试同步和异步TPS相差不大 都9102年了还在用logback 看到网友的意见后又继续去做了一波测试和调研服务器硬件 CPU 六核 内存 8G 测试工具 JMeter J转载 2020-08-09 11:16:03 · 591 阅读 · 0 评论 -
如何防止表单重复提交
今天早上,新来的同事小王突然问我:“周哥,什么是幂等性啊?”。然后我就跟他解释了一番,幂等性就是说无论你执行几次请求,其结果是一样的。说到了幂等就不得不说重复提交了,你连续点击提交按钮,理论上来说这是同一条数据,数据库应该只能存入一条,而实际上存放了多条,这就违反了幂等性。因此我们就需要做一些处理,来保证连续点击提交按钮后,数据库只能存入一条数据。防止重复提交的方式很多,这里我就说一下我认为比较好用的一种。自定义注解+Aop实现我们通过获取用户ip及访问的接口来判断他是否重复提交,假如这个ip在转载 2020-08-05 10:21:40 · 446 阅读 · 2 评论 -
Java开发手册(嵩山版)
上一版的泰山版发布三个多月后,阿里巴巴《Java开发手册(嵩山版)》又发布了,这个版本都新增了什么内容呢,栈长来帮你解读下:1)新增前后端规约 14 条之前面试我经常问求职者,既然写了前后端分离开发,那对于前后端都有些什么规范呢,大多数人说不上来,现在阿里这个规范终于来了。面试内容可以关注公众号Java技术栈回复面试进行阅读。这一条迟早是要来的,因为现在大多都是前后端分离开发模式,规范不能只是纯 Java 开发规范,还得约束前后端共同遵守的规则。2)新增禁止任何歧视性用语的约定。转载 2020-08-05 10:17:56 · 1365 阅读 · 0 评论 -
为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?
在日常开发中,我们经常需要给对象进行赋值,通常会调用其set/get方法,有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行。如我们经常在代码中会对一个数据结构封装成DO、SDO、DTO、VO等,而这些Bean中的大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省大量的set和get操作。市面上有很多类似的工具类,比较常用的有1、Spring BeanUtils2、Cglib BeanCopier3、Apache BeanUtils4、Ap...转载 2020-08-05 10:16:03 · 136 阅读 · 0 评论 -
java程序启动时cpu和负载高探索
这两天协助运维定位1个监控程序CPU占用率达到150%的问题,过程曲折,结论简单,很有意思:)首先我们来看一下cpu高时候截图:可以看到红色框中的监控程序CPU占用率都很高,但其实这些监控程序的实现很简单:发送1个http请求,收到响应后简单判断一下响应码,然后打印监控结果,打印完成就退出了。每次监控都会重新由daemon程序拉起运行。这么简单的业务占用这么高的cpu,怎么感觉都不太可能,于是拿到监控程序的源码开始定位。第一个想到的是VisualVm、JConsole等工具,..转载 2020-08-03 18:44:56 · 1049 阅读 · 0 评论 -
Java集合中的堆
什么是堆?堆其实就是一种特殊的队列——优先队列。普通的队列游戏规则很简单:就是先进先出;但这种优先队列搞特殊,不是按照进队列的时间顺序,而是按照每个元素的优先级来比拼,优先级高的在堆顶。这也很容易理解吧,比如各种软件都有会员制度,某软件用了会员就能加速下载的,不同等级的会员速度还不一样,那就是优先级不同呀。还有其实每个人回复微信消息也是默默的把消息放进堆里排个序:先回男朋友女朋友的,然后再回其他人的。这里要区别于操作系统里的那个“堆”,这两个虽然都叫堆,但是没有半毛钱关系,都是借用了 H转载 2020-07-31 14:37:19 · 933 阅读 · 0 评论 -
Java线程的6种状态分析
想起来写一下Java线程状态,还是源起与最近的一次问题定位,当时碰到一个偶先超时的问题,使用jstack命令打印出堆栈信息之后,例如"transport-vert.x-eventloop-thread-11" #37 prio=5 os_prio=0 tid=0x00007f628d0f8800 nid=0x2a32 runnable [0x00007f62631f8000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.E.转载 2020-07-27 16:23:38 · 769 阅读 · 0 评论 -
ThreadLocal终极篇
开场白张三最近天气很热心情不是很好,所以他决定出去面试跟面试官聊聊天排解一下,结果刚投递简历就有人约了面试。我丢,什么情况怎么刚投递出去就有人约我面试了?诶。。。真烦啊,哥已经不在江湖这么久了,江湖还是有哥的传说,我还是这么抢手的么?太烦恼了,帅无罪。暗自窃喜的张三来到了某东现场面试的办公室,我丢,这面试官?不是吧,这满是划痕的Mac,这发量,难道就是传说中的架构师?张三的心态一下子就崩了,出来第一场面试就遇到一个顶级面试官,这谁顶得住啊。你好,我是你的面试官Tony,看我的发型转载 2020-07-27 10:35:13 · 242 阅读 · 1 评论 -
jdk8函数式接口
什么是函数式接口(Functional Interface)其实之前在讲Lambda表达式的时候提到过,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。这种类型的接口也称为SAM接口,即Single Abstract Method interfaces。函数式接口用途它们主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。如定义了一个函数式接口如下: @FunctionalInterface interfa转载 2020-07-22 13:37:51 · 197 阅读 · 0 评论 -
META-INF目录的作用
平时写的web项目打包成jar文件之后会发现里面不知道为啥多出了一个叫做META-INF的目录,点开之后发现里面还出现了一个manifest.mf文件。出于好奇我在网上找了找这个目录的用途,结果还是没有找到一个比较通俗的解释,我这种菜鸟对那种比较正规的解释还是理解有困难的。所以总结了一下,我感觉这样解释的话对于我们这些初学者来说还是比较容易理解的。jar文件开发中可以直接使用java class文件来运行程序,不过这样不太方便,所以出现了jar文件来提供发布和...转载 2020-07-15 17:14:00 · 935 阅读 · 0 评论 -
各大厂分布式链路跟踪系统架构对比
各大厂分布式链路跟踪系统架构对比 随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络,那现在的问题是一个请求经过了这些服务后其中出现了一个调用失败的问题,只知道有异常,但具体的异常在哪个服务引起的就需要进入每一个服务里面看日志,这样的处理效率是非常低的。 分布式调用链其实就是将一次分布式请求还原成调用链路。显式的在后端查看一次分布式请求的调用情况,比...转载 2020-07-14 19:53:12 · 519 阅读 · 0 评论 -
Sleuth+Zipkin
https://blog.youkuaiyun.com/pengjunlee/article/details/87797969转载 2020-07-13 23:24:52 · 124 阅读 · 0 评论 -
Java线程池异常处理
自定义线程池MyThreadPoolExecutor执行任务的时候,如果任务报错,也不会被导致线程池被销毁。因为底层实现会把任务抛出的异常catch住且不打印。转载 2020-07-09 16:45:31 · 1820 阅读 · 0 评论 -
Spring Aop详解
1. 什么是AOP?AOP是Aspect Oriented Programming的缩写,意思是:面向切面编程,它是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。可以认为AOP是对OOP(Object Oriented Programming 面向对象编程)的补充,主要使用在日志记录,性能统计,安全控制等场景,使用AOP可以使得业务逻辑各部分之间的耦合度降低,只专注于各自的业务逻辑实现,从而提高程序的可读性及维护性。比如,我们需要记录项目中所有对外接口的入参和出参,以便出现问题转载 2020-07-07 21:16:47 · 251 阅读 · 0 评论 -
深入理解 Java try-with-resource 语法糖
背景众所周知,所有被打开的系统资源,比如流、文件或者Socket连接等,都需要被开发者手动关闭,否则随着程序的不断运行,资源泄露将会累积成重大的生产事故。在Java的江湖中,存在着一种名为finally的功夫,它可以保证当你习武走火入魔之时,还可以做一些自救的操作。在远古时代,处理资源关闭的代码通常写在finally块中。然而,如果你同时打开了多个资源,那么将会出现噩梦般的场景:public class Demo { public static void main(String[] a原创 2020-07-07 19:52:02 · 346 阅读 · 0 评论 -
Srping配置文件属性注入
Spring中可以通过两种方式把资源文件中properties里的key-value注入到bean中。第一种:xml方式<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://w原创 2020-07-06 20:09:10 · 163 阅读 · 0 评论 -
Lombok天天用,却不知道它的原理是什么?
作者:不学无数的程序员来自:urlify.cn/y2UnAn相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省去我们手动创建这些代码的麻烦..转载 2020-07-06 14:35:09 · 418 阅读 · 0 评论 -
ContextClosedEvent和ContextStoppedEvent
这两个事件看起来都是等于容器要关闭,其实不然,close是spring容器真正销毁了才会触发,而stop事件只是容器把实现了Lifecycle的bean给stop了,还可以使用start将其重新启动。原创 2020-07-04 11:49:55 · 6346 阅读 · 0 评论 -
Spring使用MessageSource获取
Exception in thread "main" org.springframework.context.NoSuchMessageException: No message found under code 'welcome' for locale 'zh_CN'. at org.springframework.context.support.AbstractMessageSource.getMessage(AbstractMessageSource.java:161) at com....原创 2020-07-03 12:18:49 · 598 阅读 · 0 评论 -
Spring-Aware
Aware的作用我们在实际的开发中,我们却经常要用到Spring容器本身的功能资源,所以Spring容器中的Bean此时就要意识到Spring容器的存在才能调用Spring所提供的资源。Aware是一个具有标识作用的超级接口,实现该接口的bean是具有被spring 容器通知的能力的,而被通知的方式就是通过回调。也就是说:直接或间接实现了这个接口的类,都具有被spring容器通知的能力。Spring的依赖注入的最大亮点是所有的Bean对Spring容器的存在是没有意识的,我们可以将Spring容原创 2020-07-02 18:51:22 · 211 阅读 · 0 评论 -
Spring自定义事件发布-监听
一、监听器模式监听者通过向发布者注册自身(自身可以理解为监听者对象),如果有事件发生,发布者会调用注册列表里的监听者的某方法并把事件(事件内部持有事件源)作为参数传入。在Spring中需要我们自己定义事件监听器、事件。发布器不需要自定义,但需要设法通过上下文拿到发布器。(可以思考下为什么这么设计?)二、基于Spring实现的消息监听类图详解1、事件:EventObject:是JDK自带的事件,是个具体的类,本身持有一个Object事件源用来定义本次事件的具体描述。EventObjec原创 2020-07-01 17:04:44 · 598 阅读 · 0 评论 -
干掉restful:graphql真香!
背景REST作为一种现代网络应用非常流行的软件架构风格,自从Roy Fielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web开发者的喜爱。REST 的 API 配合JSON格式的数据交换,使得前后端分离、数据交互变得非常容易,而且也已经成为了目前Web领域最受欢迎的软件架构设计模式。但随着REST API的流行和发展,它的缺点也暴露了出来: 滥用REST接口,导致大量相似度很高(具有重复性)的API越来越..转载 2020-06-30 12:15:04 · 235 阅读 · 0 评论 -
消息队列之 RabbitMQ
关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时候把这块的知识整理记录一下了。市面上的消息队列产品有很多,比如老牌的 ActiveMQ、RabbitMQ ,目前我看最火的 Kafka ,还有 ZeroMQ ,去年底阿里巴巴捐赠给 Apache 的 RocketMQ ,连 redis 这样的 NoSQL 数据库也支持 MQ 功能。总之这块知名的产品就有十几种,就我自己的使用经验和兴趣只打算谈谈 RabbitMQ、Kafka 和 Active转载 2020-06-29 15:38:35 · 193 阅读 · 0 评论 -
idea下java无法加载主类
问题描述:在运行java文件的main函数时提示无法加载主类解决方式:删除project,重新创建java类解决问题原因:猜测是因为建包的时候使用了数字作为包名,或是从github上克隆项目后导致。推荐解决方案:重新导入(新建)下项目...原创 2020-06-29 12:24:18 · 331 阅读 · 0 评论 -
idea下使用java8语法报错
有没有同学发现,自己的idea里配置了高版本的jdk,项目模块也选择了高版本的jdk,代码中java语法还是报错。试下修改这个:在修改之前要确保下图的配置要选择高版本的jdk:问题原因可能是:默认项目导进去时候就是编译环境是jdk1.5版本的,虽然Project和Modules下配置了但是并没有影响到编译环境版本。...原创 2020-06-29 11:19:22 · 1210 阅读 · 0 评论 -
java中的包名不能以数字开头
java中的包名不能以数字开头,原因是jvm不能正常加载数字开头的包名。原创 2020-06-29 10:13:03 · 2454 阅读 · 0 评论 -
spring-rabbitmq优雅关机
1、添加一个jvm关闭状态标识status2、在rmq的消费者端代码创建aop切面,过滤onMessage方法,并添加判断status如果处于关闭状态则执行reject+requeue逻辑。(可以适当延时执行,防止消息循环通知)3、注册个JVM关闭的钩子...原创 2020-06-28 20:03:55 · 1775 阅读 · 0 评论 -
RabbitMQ镜像队列实现原理
一、镜像队列使用1.镜像队列作用 RabbitMQ默认集群模式,并不包管队列的高可用性,尽管队列信息,交换机、绑定这些可以复制到集群里的任何一个节点,然则队列内容不会复制,固然该模式解决一项目组节点压力,但队列节点宕机直接导致该队列无法应用,只能守候重启,所以要想在队列节点宕机或故障也能正常应用,就要复制队列内容到集群里的每个节点,须要创建镜像队列。2.策略设置镜像队列设置可以基于策略设置,策略设置可以通过如下两种方法:(1)RabbitMQ 管理后台(2)rabbitmqctl 设置转载 2020-06-28 17:53:59 · 1270 阅读 · 0 评论 -
Spring-RabbitMQ配置详解
一、virtual-hostvhost是rabbitmq分配权限的最小细粒度。比如我们可以为一个用户分配一个可以访问哪个或者哪一些vhost的权限。但是不能为用户分配一个可以访问哪一些exchange,或者queue的权限,因为rabbitmq的权限细粒度没有细化到交换器和队列,他的最小细粒度是vhost(vhost中包含许多的exchanges,queues,bingdings)。所以如果exchangeA 和queueA 只能让用户A访问,exchangeB 和queueB 只能让用户B访...原创 2020-06-28 17:05:49 · 2563 阅读 · 0 评论 -
nio分享
没能解决的问题:1、Java编程时,为啥一定要设置非阻塞的io2、redis是否是单进程单线程。答:是的,网络请求+事件处理都是一个线程 (rdp什么的,fork出子线程不算)3、epoll_wait触发返回的条件是什么一、用户态和核心态内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。为什么要有用户态和内核态原创 2020-06-17 18:54:06 · 350 阅读 · 0 评论