![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 84
dearfulan
这个作者很懒,什么都没留下…
展开
-
单机环境下定时任务的基本原理和常见解决方案(二)之时间轮原理分析
Timer实现方式最小堆最小堆基于时间轮写入效率O(logN)O(logN)类HashMap,近似O(1)查询效率O(1)O(1)近似O(1)优点实现简单 O(1)可以对大量定时任务进行统一调度线程池执行,有异常捕获机制写入性能高缺点对于大量定时任务不便于管理单线程执行;没有异常捕获机制写入效率较低,在需要大量添加定时任务的场景下会影响性能单线程执行;没有异常捕捉机制。原创 2023-07-28 20:13:11 · 733 阅读 · 0 评论 -
Java8从入门到精通 笔记
java8新特性 lambda表达式,stream用Lambda表达式就可以用更简洁的代码实现这一功能使用 Lambda 表达式结合 Stream API, 只要给出相应的集合, 我们就可以完成对集合的各种过滤并输出结果信息。Lambda 表达式在 Java 语言中引入了 “->” 操作符, “->” 操作符被称为 Lambda 表达式的操作符或者箭头操作符, 它将 Lambda 表达式分为两部分:只包含一个抽象方法的原创 2022-12-03 23:14:13 · 631 阅读 · 0 评论 -
执行maven clean package 时报OutOfMemoryError的解决办法
最近在使用maven clean package打包一个项目的时候遇到OutOfMemoryError的报错,如下查看了下具体的文件报错说明https://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError,可能是以下三个原因:你构建的是一个非常大的多模块项目,每个模块都需要一定量的内存,导致内存不够你正在使用一些执行内存密集型操作的插件,例如分析所有项目的依赖项你正在使用带有 fork=false 选项(默认)的 Maven 编原创 2021-08-01 21:54:48 · 1692 阅读 · 0 评论 -
HashedWheelTimer时间轮原理分析
HashedWheelTimer时间轮是一个高性能,低消耗的数据结构,它适合用非准实时,延迟的短平快任务,例如心跳检测。概要时间轮是一种非常惊艳的数据结构。其在Linux内核中使用广泛,是Linux内核定时器的实现方法和基础之一。Netty内部基于时间轮实现了一个HashedWheelTimer来优化I/O超时的检测,本文将详细分析HashedWheelTimer的使用及原理。背景由于Netty动辄管理100w+的连接,每一个连接都会有很多超时任务。比如发送超时、心跳检测间隔等,如果每一个定时任务都转载 2021-05-18 18:25:36 · 1221 阅读 · 0 评论 -
一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
线程池常见问题了解JDK Executors线程池吗?知道JDK提供了哪些默认的实现吗?看过阿里巴巴java开发手册吗?知道为啥不允许使用默认的实现吗?你们没有用默认的吧?那来介绍一下你们自定义线程池的几个常用参数呗?你这个几个参数的值是怎么得来的呀?算出来的?怎么算出来的?线程池里面的任务是IO密集型的还是计算密集型的呢?好,现在我们有一个自定义线程池了,来说一下你这个线程池的工作流程呗?那你这个线程池满了怎么办呀?拒绝?咋拒绝?有哪些拒绝策略呢?别紧张,随便说两个就行。…回到开始说转载 2021-03-07 21:47:53 · 1064 阅读 · 0 评论 -
tomcat 启动异常 The web application [ROOT] registered the JDBC driver [xxx] but failed to unregister it
tomcat启动的时候出现如下异常:22-Feb-2021 20:25:30.697 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.startInternal One or more listeners failed to start. Full details will be found in the appropriate container log file22-Feb-2021 20:2原创 2021-02-28 17:21:23 · 1687 阅读 · 0 评论 -
如何多次读取request请求里的数据
问题场景 :我们一般直接获取request请求里的参数进行数据处理,现在想在过滤器里将获取请求数据并打印,方便做日志排查。但是POST请求中的参数是存储在流中的,只能读一次,无法多次读取。解决办法使用ThreadLocal存储请求数据最简单的办法就是获取到请求数据之后存储在一个地方,这样下次再使用的时候就直接从存储处获取,而不再从request请求流里获取拦截的filter@Componentpublic class MyFilter implements Filter { pub原创 2021-02-06 21:48:42 · 2349 阅读 · 2 评论 -
@RequestBody的使用
基础知识介绍:@RequestBody主要用来接收前端传递给后端的请求体中的数据; GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而需要用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。注意:一个请求,只有一个RequestBody,但是可以有多个RequestParam。这很好理解,请求体只有一个,转载 2021-02-06 20:38:23 · 12325 阅读 · 3 评论 -
maven打包的各种方式和如何在使用maven-assembly-plugin打包时去掉assembly id
先简单介绍下maven打包的几种方式,如果你只是想知道如何使用assembly插件打包的时候去掉assembly id可以直接跳到下面Maven打包的几种方式1. 使用maven-jar-plugin打包使用默认的maven-jar-plugin 打包在使用idea的时候,如果不引入任何maven打包插件,在执行mvn clean package的时候会使用默认的maven-jar-plugin进行打包,得到一个artifactId-version.jar的包这个包里不包含我们引入的maven依原创 2020-12-26 15:21:46 · 2414 阅读 · 0 评论 -
记一次clickhouse查询问题Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = ‘deny‘)
最近在工作中使用到了clickhouse,在查询数据统计的时候遇到了一点问题,后来解决了,记录一下ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统–DBMS ( 来自不同列的值被单独存储,来自同一列的数据被存储在一起 )适用于大多数是读请求,数据较少更新或者没有更新的场景。clickhouse的一大优点是支持SQL, 在查询的学习成本上低于es.SQL格式如下:[WITH expr_list|(subquery)]SELECT [DISTINCT] expr_list[FR原创 2020-12-05 16:23:52 · 10250 阅读 · 0 评论 -
冷静对待你遇到的所有Java内存异常
被人说烂的Java内存模型Java内存模型的相关资料在网上实在是太多了,不管是过时的还是不过时的,网络上充斥的学习资料,比如各类研究Java内存模型的博文,也随着Java的发展,渐渐失去了其内容的准确性.要在那么多网络资料中找到对Java内存模型最新最全的说法,估计最好的方式只有翻阅Oracle的文档了!(字体大小太不舒服了!)我最近也不停的查阅和总结了不少网上的资料,不过由于类似资料实在太多,所以不打算重复的说明这个被人说烂的Java内存模型从各种OOM异常出发来零距离的理解Java内存模型对于转载 2020-11-18 23:56:23 · 239 阅读 · 0 评论 -
Caffeine缓存
在本文中,我们来看看 Caffeine — 一个高性能的 Java 缓存库。缓存和 Map 之间的一个根本区别在于缓存可以回收存储的 item。回收策略为在指定时间删除哪些对象。此策略直接影响缓存的命中率 — 缓存库的一个重要特征。Caffeine 因使用 Window TinyLfu 回收策略,提供了一个近乎最佳的命中率。填充策略(Population)Caffeine 为我们提供了三种填充策略:手动、同步和异步手动加载(Manual) Cache<String, Object>转载 2020-11-08 12:59:29 · 8344 阅读 · 0 评论 -
缓存更新的套路
看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。我不知道为什么这么多人用的都是这个逻辑,当我在微博上发了这个贴以后,我发现好些人给了好多非常复杂和诡异的方案,所以,我想写这篇文章说一下几个缓存更新的转载 2020-11-07 13:47:27 · 207 阅读 · 0 评论 -
记一次OpenJDK替换java JDK
因为公司要求线上都使用open jdk, 所以最近我们把本地的java jdk都替换成了open jdk。中间遇到了一点小问题,记录一下。我记得我之前收到过Oracle的更新消息,还以为自己当时已经替换成open jdk了,一看环境发现使用的还是java的jdk,哈哈。二者的区别:简单来说,OpenJDK是开源的,Java JDK是官方的,也就是Oracle JDKlinux下open jdk的安装教程: http://openjdk.java.net/install/windows下下载ope原创 2020-10-30 22:07:49 · 8096 阅读 · 0 评论 -
浅谈权限管理的设计与实现
一、权限管理的意义保证安全:避免误操作、人为破坏、数据泄露等。数据隔离:不同的权限能看到及操作不同的数据,互不干扰。职责明确:不同角色处理不同事务,细化职责,规范并简化流程。二、权限管理系统的通用设计思路某个主体(subject也就是用户) 对某个 客体(object也就是资源) 需要实施某种操作(operation),系统对这种操作的管理控制就是权限控制。1. 权限分类操作权限API 权限菜单权限按钮权限数据权限所谓操作权限就是用户是否有执行某项操作的权限,比方说是否可以审批你原创 2020-10-25 21:22:18 · 2268 阅读 · 0 评论 -
Lombok注解-@SneakyThrows
@SneakyThrows注解的用途得从java的异常设计体系说起。java中我们常见的2类异常。1.普通Exception类,也就是我们常说的受检异常或者Checked Exception。2.RuntimeException类,既运行时异常。前者会强制要求抛出它的方法声明throws,调用者必须显示的去处理这个异常。设计的目的是为了提醒开发者处理一些场景中必然可能存在的异常情况。比如网络异常造成IOException。但是现实,往往事与愿违。大部分情况下的异常,我们都是一路往外抛了事。(强制处转载 2020-10-23 19:48:32 · 8810 阅读 · 0 评论 -
面试官让我说出2种@Transactional注解的失效场景,我一口气给他说了六种
引言@Transactional 注解相信大家并不陌生,平时开发中很常用的一个注解,它能保证方法内多个数据库操作要么同时成功、要么同时失败。使用**@Transactional注解时需要注意许多的细节,不然你会发现@Transactional**总是莫名其妙的就失效了。下面我们从what ,where,when,四个方面彻底弄明白如何回答面试官的问题。一、什么是事务(WHAT)事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行转载 2020-09-23 21:47:10 · 876 阅读 · 0 评论 -
Java8 日期/时间(Date Time)API指南
Java 8日期/时间( Date/Time)API是开发人员最受追捧的变化之一,Java从一开始就没有对日期时间处理的一致性方法,因此日期/时间API也是除Java核心API以外另一项倍受欢迎的内容。为什么我们需要新的Java日期/时间API?在开始研究Java 8日期/时间API之前,让我们先来看一下为什么我们需要这样一个新的API。在Java中,现有的与日期和时间相关的类存在诸多问题,其中有:Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于转载 2020-08-24 19:47:11 · 148 阅读 · 0 评论 -
注意System.currentTimeMillis()潜在的性能问题
System.currentTimeMillis()是极其常用的基础Java API,广泛地用来获取时间戳或测量代码执行时长等,在我们的印象中应该快如闪电。但实际上在并发调用或者特别频繁调用它的情况下(比如一个业务繁忙的接口,或者吞吐量大的需要取得时间戳的流式程序),其性能表现会令人大跌眼镜。直接看下面的Demo。public class CurrentTimeMillisPerfDemo { private static final int COUNT = 100; public st转载 2020-08-21 11:34:23 · 787 阅读 · 0 评论 -
java 泛型详解-绝对是对泛型方法讲解最详细的,没有之一
1. 概述泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用。什么是泛型?为什么要使用泛型?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的转载 2020-08-18 11:48:44 · 104 阅读 · 0 评论 -
fastjson到底做错了什么?为什么会被频繁爆出漏洞?
fastjson大家一定都不陌生,这是阿里巴巴的开源一个JSON解析库,通常被用于将Java Bean和JSON 字符串之间进行转换。前段时间,fastjson被爆出过多次存在漏洞,很多文章报道了这件事儿,并且给出了升级建议。但是作为一个开发者,我更关注的是他为什么会频繁被爆漏洞?于是我带着疑惑,去看了下fastjson的releaseNote以及部分源代码。最终发现,这其实和fastjson中的一个AutoType特性有关。从2019年7月份发布的v1.2.59一直到2020年6月份发布的 v1.转载 2020-07-07 12:08:03 · 278 阅读 · 0 评论 -
Java 14 发布了,终于可以扔掉Lombok了?
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载。在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records官方吐槽最为致命早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章(http://cr.openjdk.java.net/~briangoetz/amber/datu...转载 2020-03-20 10:12:07 · 1672 阅读 · 0 评论 -
看完这篇文章,我奶奶都懂了https的原理
Http存在的问题上过网的朋友都知道,网络是非常不安全的。尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵。还有大家平时喜欢用的万能钥匙,等等。那我们平时上网可能会存在哪些风险呢?1、泄密,个人隐私、账户密码等信息可能会被盗取。2、篡改,收到的数据可能被第三方修改过,或被植入广告等。3、假冒,访问的站点非目标服务器站点。如域名欺骗、域名劫持、钓鱼网站等。可能住你隔壁穿...转载 2020-03-16 10:58:30 · 118 阅读 · 0 评论 -
理解I/O:随机和顺序
翻译自:http://www.violin-memory.com/blog/understanding-io-random-vs-sequential/Storage for DBAs: Ever been to one of those sushi restaurants where the food comes round in dishes on a conveyor belt? As...转载 2020-02-04 09:37:18 · 1182 阅读 · 0 评论 -
idea下git log乱码问题
问题:在windows系统中,使用idea,操作terminal控制台时,通过命令git log查看日志时,出现如下乱码:一开始参考网上的教程,在git bash下输入:git config --global core.quotepath falsegit config --global gui.encoding utf-8git config --global i18n.co...原创 2019-12-10 10:59:09 · 1265 阅读 · 1 评论 -
ProtoBuf的使用以及原理分析
Protocal Buffers(简称protobuf)是Google的一项技术,用于结构化的数据序列化、反序列化。Protobuf的使用比较广泛,常用于RPC 系统(Remote Procedure Call Protocol System)和持续数据存储系统。其主要优点是空间开销小和性能比较好,类似于XML生成和解析,但protobuf的效率高于XML,不过protobuf生成的是字节码,...原创 2019-08-14 15:52:45 · 2856 阅读 · 2 评论 -
tomcat源码运行
tomcat各版本下载地址:https://archive.apache.org/dist/tomcat/下载8.0.11的tomcat src包并解压,一开始的我参照的tomcat源码里BUILDING.txt进行编译运行,安装了ant,在编译的时候遇到ssl的如下报错尝试了去修改tomcat的server.xml里的Connector,然而ant编译一直不成功。最后发现...原创 2020-01-04 22:39:37 · 792 阅读 · 0 评论 -
手写实现Spring(IOC、DI),SpringMVC基础功能
手写实现Spring(IOC、DI),SpringMVC功能spring和springMVC的用法相信大家都不陌生,我简单讲下我实现的思路spring启动阶段1.读取web.xml,加载spring配置文件2.定义ioc容器,声明一个Map<String,Object>集合3.获取配置文件里的扫包路径,得到相关的class集合4.实例化相关的实体类,注入到ioc容器中5....原创 2020-01-02 21:40:46 · 246 阅读 · 0 评论 -
JAVA通过反射获取方法真实参数名
默认情况下,我们是无法获取到方法中参数的名称,通过反射机制也只能获取到类似于arg0,arg1这样表示参数顺序的"参数名"这样当我们需要使用方法的实际参数时,比方说spring自动根据请求的参数给方法参数赋值时,或者创建接口的文档时,就会比较麻烦。因为java文件在编译时,不会将参数名称信息记入class文件中,自然也不能通过反射获取到。在JDK 8之后,我们可以通过在编译时指定“-para...原创 2020-01-03 09:50:54 · 4942 阅读 · 0 评论 -
【设计模式】组合模式
设计模式---组合模式什么是组合模式:Composite?使用场景代码示例组合模式模板什么是组合模式:Composite?计算机的文件系统中,一个文件夹中既可以放入文件也可以放入其他文件夹(子文件夹),所以文件夹和文件虽然是不同类型的对象,但它们都是可以被放入到文件夹中,可以统称为"目录条目"(directory entry)在目录条目中,我们把文件夹和文件当作同一对象看待。对于这种将容器...原创 2019-10-15 20:31:23 · 299 阅读 · 1 评论 -
Java中的序列化和反序列化
对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。目录一.jdk自带的序列化和反序列化方式Serializable实现序列化什么是serialVersionUID?Transient 关键字Externalizable实现序列化Serializable结合readObject...原创 2019-08-13 20:33:35 · 255 阅读 · 0 评论 -
Apollo分布式配置中心踩坑
最近学习了一下分布式配置中心,在本地使用Quick Start 进行了部署测试,在测试部署过程中也遇到了一些问题。apollo分布式配置中心主要可以分为四个模块1. apollo-portal 平台 可视化的配置界面,可以增删改查 各个配置环境的信息然后通过发布实时更新到服务器端2.apollo-adminservice 配置管理的接口服务,提供服务给portal平台进行配置的增删改...原创 2019-01-18 17:12:25 · 5044 阅读 · 0 评论