
Java 中阶
文章平均质量分 88
Java 中阶
小道仙97
一个不务正业的程序员,梦想成为家庭煮夫。【五十岁退休】
展开
-
JVM内存区域详解,一文弄懂JVM内存【内存分布、回收算法、垃圾回收器】
堆其实就是一大块内存区域,是用来存放对象的,对于一个应用来说最耗费内存的就是“对象”。因为在运行的过程中会创建无数个对象,所以内存回收(垃圾回收)的时候主要就是针对堆的垃圾进行回收。回收算法是理论,回收器是实践,不同回收器都是基于理论进行真正的实践,在讨论回收器之前需要先了解下面几个点。上面我们谈到内存空间,内存是有限的,想要健康持续的运行下去,就一定要回收“垃圾”。已经知道了哪些对象是可以回收的,那就需要按照某种回收算法,去回收它们。那怎么判定一个对象是不是垃圾呢,就成了新的问题。原创 2024-01-14 15:51:47 · 1074 阅读 · 0 评论 -
Java进阶之Dump文件初体验
最近线上频繁的内存告警,同事A通过分析dump文件解决了这个问题,我当然是不会放过这种学习的机会。原创 2023-07-30 19:29:50 · 5042 阅读 · 0 评论 -
Spring事务源码解析【一次一篇文章弄懂】
上一篇文章我们已经知道了Java中Spring的事务,尤其是声明事务,这篇文章我们来深入探讨一下Spring的声明事务是如何实现的。首先Spring的声明事务是基于AOP实现的,说到AOP我们就要搞清楚两点:1. 何时何地基于什么规则生成的代理对象2. 生成了代理对象后,拦截器做了什么原创 2023-07-23 12:26:51 · 671 阅读 · 1 评论 -
Java线程池运行原理,线程池源码解读【Java线程池学习二】
但随着时间的推移在闲下来的时候我突然想,当任务进入了队列之后是怎么取出来的呢?然后列举了几个问题毫无疑问想要解决上面的问题,那只有研究源码,下面我们就来看下 ThreadPoolExecutor 的源码,此次目的就是解决上面的问题,先对线程池的核心工作原理进行理解,后面我们再来对线程池来一个全面的解读。1. 添加的一个任务是怎么运行的?2. 任务丢到了队列,怎么取出来呢?3. 过了时间怎么销毁线程?4. 怎么拒绝的?5. 线程池,这个池是什么? 线程怎么放进去?原创 2023-02-19 13:08:37 · 475 阅读 · 0 评论 -
Java锁之ReentrantLock(源码详解)
ReentrantLock 这个Java中重要的锁,我想可能很多人只是听过,并没有使用过,我在看RocketMQ客户端源码的时候发现大量的使用了这个ReentrantLock,从而引起了我的兴趣,下面我们一起从源码的角度来学习ReentrantLock。我们先来看一下ReentrantLock的继承关系。原创 2023-01-12 21:46:27 · 1059 阅读 · 0 评论 -
java线上问题排查工具——Arthas
Arthas 支持修改每个类的日志级别,这里只演示修改整个系统的日志级别 https://arthas.aliyun.com/doc/logger.html。上面的监控虽然很好,但在实际的项目中,我们的访问量很大,我们想要监控某个请求这时候通过参数过滤将会是完美的方案。新的class 加载到JVM 里面去。打印整个栈的信息,太长了感觉没啥用。方法一就没什么好说了,来看方式二。查看当前堆和非堆的内存使用情况。,生成 class的方式有2种。原创 2022-12-28 21:12:43 · 736 阅读 · 0 评论 -
记一次服务宕机、优化全流程(以后也可以装X了)
服务宕机可能很多人第一反应就是限流,我们也做了,如果不限流一个 pod都起不来,以前对于限流也没有什么思考,现在觉得:限流的第一步是要考虑你的系统最大并发量,不然限流就是个借口。exhibition 服务在1.5w/min 的时候就开始挂机,顶峰4.5w, 或许我们的服务达不到4.5w,但绝对不会是1.5w。原创 2022-11-19 17:03:26 · 1244 阅读 · 0 评论 -
深入理解MyBatis一级缓存和二级缓存【超详细源码解析】
深入理解MyBatis一级缓存和二级缓存【超详细源码解析】一级缓存的作用域为何是 sqlSession、二级缓存的作用域为何是 mapper怎么理解 一、二级缓存都是基于 PerpetualCache 的HashMap的本地缓存为什么一级缓存无法被关闭怎么才能使用二级缓存?如果使用了二级缓存一级缓存还有用么如果一级缓存不可以关闭,那在分布式的系统中,如何解决数据一致性问题如果开启了二级缓存,那缓存的命中顺序将是如何呢原创 2022-11-04 16:55:48 · 1412 阅读 · 1 评论 -
Maven插件初体验【附源码】
学过Java的小伙伴对Maven一定很熟悉了,但对于Maven除了用来进行版本管理之外,你还用它做过什么呢?或许很多人和我一样,用了几年的Maven压根就没想过Maven除了版本管理还可以做其它事情。原创 2022-10-19 17:09:56 · 1201 阅读 · 0 评论 -
HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程【超详细解答】
HTTP执行流程,SpringMVC执行流程,Java一次HTTP请求容器做了哪些事情,过滤器、拦截器、AOP执行流程原创 2022-07-24 21:36:43 · 914 阅读 · 0 评论 -
手把手教你如何自定义spring-boot-starter,附视频讲解
我们在进行Java开发的时候要引入各种依赖,比如JDBC、MySQL、Redis、MyBatis 等等,但各种依赖包本身又各自依赖了自己的依赖,在很久以前没有各种starter的时候,我们要频繁的解决各种依赖包冲突的问题,这是件很头疼的事。注:spring-boot-starter-xxxx 这是官方提供的命名规则,xxxx-spring-boot-starter这是非官方提供的。原创 2022-02-13 15:57:03 · 989 阅读 · 0 评论 -
使用Java处理大数据避坑指南
一般处理数据,可能会单独的去创建一些零时表,然后对这个表去进行增删改查操作,这时候我们经常会忘记给这个零时表`加索引`操作数据库能`批量`就批量,当然要注意数据量 500-1000条/次 还是ok的能在本地就在本地跑,一般我们自己的电脑都是16G+,服务器除非是线上,测试环境都很小,我在测试环境开50个线程就挂机了,在本地就不会。原创 2022-01-06 09:23:04 · 808 阅读 · 0 评论 -
幂等性实践操作,基于业务讲解幂等性
之前面试也提到过关于幂等的问题,自己百度查了关于它的概念倒是很简单,但就一直不是很理解,今天和人讨论一下,然后再自己结合实际理解了一下。幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的副作用(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与原创 2021-07-16 16:47:09 · 335 阅读 · 0 评论 -
ConcurrentHashMap之put源码阅读
ConcurrentHashMap之所以是安全的map就是因为它在put的时候进行了锁处理,下面是整个put的过程,基本上都写了注释,看完之后可以帮助你更好的理解它的原理。关于ConcurrentHashMap的其它源码,比如扩容、计数器等,看看以后是否有时间吧。 final V putVal(K key, V value, boolean onlyIfAbsent) { // 不允许null值和nullkey if (key == null || value == null原创 2021-07-14 23:00:27 · 227 阅读 · 0 评论 -
月薪10k-20k都无法回答的事务问题,你会吗?
今天朋友扔来一个“简单”的事务代码,初看无味,再看惊奇。也问了身边的一些朋友无一人回答正确,你也试试?@Servicepublic class TestService { @Autowired private TestMapper testMapper; @Autowired private TestServiceTwo testServiceTwo; @Transactional(rollbackFor = Exception.class) pu原创 2021-07-14 21:46:41 · 241 阅读 · 1 评论 -
Java线程池详解
文章目录一、创建一个线程池并使用1-1、new 的方式创建1-2、Executors 创建1-3、线程池的使用二、构造方法参数详解2-1、corePoolSize2-2、maximumPoolSize2-3、keepAliveTime2-4、unit2-5、workQueue2-6、threadFactory2-7、handler三、队列详解四、线程锁我们知道频繁的创建和销毁线程是需要消耗大量的资源,所以如果我们的程序需要频繁使用多线程的话,线程池将是不二选择。一、创建一个线程池并使用1-1、new原创 2021-05-24 16:49:42 · 275 阅读 · 1 评论 -
Java进阶之单点登录详解
之前对单点系统这几个字还挺敬畏的,也有点害怕,来公司很久了系统也一直使用单点登录,但是一直没有时间和机会研究,近来研究一下发现不过尔尔。文章目录一、前言1-1、何为单点1-2、架构图1-3、其它二、单点详解2-1、用户请求2-2、前端跳转登录页面2-3、页面登录2-4、业务系统login接口三、其它一、前言1-1、何为单点我们知道每个系统都应该有登录操作,如果你们有10个系统,并且这十个系统的用户都在一个集合里面的(常见的比如集团用户),那么你让用户注册10次记录10个密码,也对用户不友好也对代原创 2021-04-23 13:30:05 · 1538 阅读 · 0 评论 -
MySql分表设计,Java分表设计
文章目录一、前言1-1、什么时候需要分表呢?1-2、分表的规则是什么呢?1-2-1、分表前后1-2-2、其它二、举例场景三、实现分表功能3-1、数据的增删改3-2、数据的查询3-3、自动创建表3-4、其它一、前言1-1、什么时候需要分表呢?这个其实就很简单了,就是当表数据太大的时候,一个表里面存储不下,或者存储后影响使用(比如数据多的时候就影响查询效率)1-2、分表的规则是什么呢?一般来说我们都是根据数据量来分表的,数据存储是为了后面使用,所以我们表名也应该清楚明了。我们可以根据数据量分为、天原创 2021-03-09 19:51:53 · 1055 阅读 · 1 评论 -
你真的懂hashCode和equals吗???
前言今天还在感概说,可能三年后我的简历和刚毕业那会没啥区别,因为现在已经毕业快一年了,上次重写简历除了多了两个项目经验外没啥区别,而简历上面的技术我还需要好久才能掌握。一、关于hashCode和equals我们知道下面几点hashCode相同的两个对象不一定相同equals相同的两个对象,hashCode一定相同重写equals一定要重写hashCode其它的== 比较的是两个对象的内存地址值equals比较的是两个对象里面的值是否相同,没有重写的equals和==一样二、ha原创 2021-03-03 17:28:37 · 243 阅读 · 0 评论 -
Java全局异常处理
为了避免错误直接抛出去给用户,我们一般都是try catch 处理。但是存在这样一个问题,我们try catch 捕获了,这时候系统就不会回滚了,我们需要手动回滚。如果我们一个新增方法出现了异常,我们想给用户提示一个系统异常,但是这之前我们知道某个异常是要给用户明确提示的,比如该用户缺少手机号。一、使用try catch的方式解决上面的问题@RestControllerpublic class TestController { private Logger log = Logger.原创 2020-12-30 20:01:56 · 1685 阅读 · 0 评论 -
SpringBoot实现SpringAop,AOP实现日志
关于什么是AOP,AOP用来做什么,AOP里面的两种代理这里都不做讨论。本文只是在应用的层面去讲解AOP一、关于AOP里面的一些概念Joinpoint(连接点): 类里面可以被增强的方法,这些方法称为连接点Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义Advice(通知):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)Aspect(切面): 是切入点和通知(引.原创 2020-12-20 19:01:00 · 331 阅读 · 0 评论 -
SpringBoot多线程,线程池讲解
一、默认线程当我们开启一个SpringBoot的项目,我们并未设置任何和线程相关的操作,但是我们的程序还是可以执行多个请求。甚至说绝大多数的项目,我们不需要对线程这块做任何操作。但是如果是单线程的话,它显然满足不了我们系统的需求,所有我们有必要了解一下,它默认的线程情况。1-1、测试默认线程池import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotati原创 2020-12-05 18:38:55 · 2690 阅读 · 0 评论 -
SpringBoot定时任务,@Async多线程异步执行
一、使用SpringBoot实现定时任务这个不是重点,就简单的实现一下,至于cron表达式怎么写也不是重点,自行百度即可。1-1、基于 @Scheduled 注解的方式import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Co原创 2020-10-28 14:38:50 · 4085 阅读 · 2 评论 -
为什么Java只有值传递
文章优先发布在个人博客,后续如果修改忘记同步到优快云给你带来不便,抱歉。个人博客本文地址:https://www.xdx97.com/article?bamId=671021641165176832其实我在学Java的时候对值传递和地址值传递这两个概念没啥感觉也可能是我自己没太注意,但是在学习c语言的时候对这两个概念倒是印象深刻下面就我对这两个概念的理解来阐述一下:为什么Java...原创 2020-01-26 16:35:21 · 257 阅读 · 0 评论 -
HashMap扩容机制源码分析
前几天写了一篇,ArrayList扩容源码分析。好像源码也没有我们想象的那么可怕?(当然了,只是简单的分析,后面等我知识充足了,将进一步的分析)今天本来想打游戏的,但是网速太差了,真是的是让人火爆。努力写代码,将来租一个网速好的房子1、具体看源码之前,我们先简单的说一下HashMap的底层数据结构 1、HashMap底层的数据结构是 数组 ...原创 2019-12-23 13:55:52 · 1459 阅读 · 1 评论 -
ArrayList扩容机制源码分析
1、先看一下ArrayList的构造方法1-1:空参构造方法:private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}可以看到默认的空参构造方法...原创 2019-12-19 16:35:08 · 2499 阅读 · 2 评论 -
HashMap 和 Hashtable 的 6个区别
文章转自公众号 《Java技术栈》 点击查看原文转载 2018-12-06 15:14:31 · 163 阅读 · 0 评论 -
static 、final、static final 的区别
目的:解释static 、final、static final 的区别1、加了 final 修饰符,表示这个是最终结果不可被更改的(你尝试改变它的值,编译器就会报错)2、加了 static 修饰符,表示这是独一无二的,只有这一个。3、加了 static final 修饰符(static final 位置可以互换),整个程序只有一份并且结果不可以被更改。...原创 2018-12-01 16:58:24 · 483 阅读 · 0 评论 -
java 组合与继承
目的:简述 java 中组合与继承场景:当我们在现在类中需要调用原来类的方法。组合的方式:在你现在类中创建一个原来类的对象。public class Test2 { private String aa; private String bb; private Test1 test1;}继承的方式:public class Test2 extends ...原创 2018-12-01 11:12:06 · 260 阅读 · 0 评论 -
java初始化
1、成员变量的初始化如果你在方法中定义一个变量而不去初始化就使用它就会报错,如下int i;System.out.println(i);但是你在对象中定义了一些变量,然后你new这个对象,就会被自动初始化。如果变量是基本数据类型,那么就会初始化为默认值,如果是包装类型或引用就会初始化为 nullpublic class Test1 { private int a...原创 2018-11-29 10:46:02 · 177 阅读 · 0 评论