自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 【JVM参数记录】

这些参数的组合旨在优化Tomcat服务器的性能,减少垃圾回收带来的停顿时间,并确保应用程序能够有效地使用内存。这些参数的组合旨在优化应用程序的性能,控制垃圾回收的频率和暂停时间,并确保JVM能够有效地使用内存。保持最小空闲线程数可以确保有足够的线程可用以处理请求,避免在高峰时段出现线程不足的情况。保持最小空闲线程数可以确保有足够的线程可用以处理请求,避免在高峰时段出现线程不足的情况。:设置网络地址缓存和InetAddress对象缓存的时间到LiveAddresses刷新的时间间隔,与之前的设置相同。

2024-02-21 11:24:19 817

原创 SLF4J与Log4J、Log4J2和LogBack

TOC。

2023-11-18 23:02:10 257

原创 ThreadLocal

作用于对象的锁:1、在方法上加锁,锁对象为当前类的实例化对象;不要使用非final的成员变量作为同步锁对象,因为非final成员变量可以被重新赋值,导致不同的线程使用不同的对象作为锁,达不到同步锁定的效果。Java 语言在遵循内存模型的基础上推出了 JMM 规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。2、每个线程都有一个私有的本地内存(Local Memory),本地内存中存储了该线程以读/写共享变量的拷贝副本。

2023-11-18 21:35:05 76

原创 java开发技巧

尽管软件开发一直致力于追求高效、可读性强、易于维护的特性,但这些特性却像是一个不可能三角,相互交织,此消彼长。就像底层语言(如汇编和C语言)能够保持高效的运行性能,但在可读性和维护性方面却存在短板和劣势;而高级语言(如Java和Python)在可读性和可维护性方面表现出色,但在执行效率方面却存在不足。构建语言生态的优势,弥补其存在短板,始终是编程语言的一个演进方向。不同编程语言,拥有不同的特性和规约,下面就以JAVA语言为例,细数那些开发过程中容易被人忽略,但必须掌握的知识点和实践技能。

2023-11-13 23:14:43 83

原创 CompletableFuture【简介+API】

思维导图简介1 创建异步任务2 异步回调处理2.1 thenApply和thenApplyAsync2.2 thenAccept和thenAcceptAsync2.3 thenRun和thenRunAsync2.4 whenComplete和whenCompleteAsync2.5 handle和handleAsync3 多任务# 3.1 thenCombine、thenAcceptBoth 和runAfterBoth。

2023-11-13 23:12:21 52

原创 并发[线程及线程池]

我们来看第二个问题,为什么 wait/notify/notifyAll 方法被定义在 Object 类中?而 sleep 方法定义在 Thread 类中?主要有两点原因:1、因为 Java 中每个对象都有一把称之为 monitor 监视器的锁,由于每个对象都可以上锁,这就要求在对象头中有一个用来保存锁信息的位置。

2023-11-13 20:05:15 27

原创 linux中的五大IO模型和java的三种IO模型

之前经常听到五种io模型和三种io模型的说法,经常容易弄混淆,这里详细讲解下。五大IO模型:Linux系统中的五种io模型,分别是:阻塞io、非阻塞io、多路复用io,信号驱动io和异步io。三种IO模型:JAVA种的三种io模型,分别是:同步阻塞(BIO),同步非阻塞(NIO)和异步非阻塞模型(AIO)。

2023-11-13 13:27:01 35

原创 手写rpc

手写rpc

2023-11-12 23:31:32 25

原创 Java类加载相关

Java类加载

2023-10-08 09:29:26 51

原创 常用加解密算法

在加密算法中,“加盐”(Salting)是指在加密过程中添加一个随机的值(盐值)到要加密的数据中,以增加密码的复杂性和安全性。盐值是一个随机生成的字符串或字节数组,它与要加密的数据结合使用。通过使用盐值,每次加密相同的数据都会产生不同的加密结果,即使原始数据相同。遵循良好的实践,应该为每个加密数据生成独特的盐值。将盐值与要加密的数据进行组合,创建一个更长的数据字符串。使用加密算法对组合后的数据进行加密,生成最终的加密结果。在解密过程中,也需要使用相同的盐值来还原正确的原始数据。

2023-09-12 14:51:11 45

原创 Java Agent原理浅析和实践

在平时的开发中,我们不可避免的会使用到Debug工具,JVM作为一个单独的进程,我们使用的Debug工具可以获取JVM运行时的相关的信息,查看变量值,甚至加入断点控制,还有我们平时使用JDK自带的JMAP、JSTACK等工具,可以在JVM运行时动态的dump内存、查询线程信息,甚至一些第三方的工具,比如说京东使用的JEX、pfinder,阿里巴巴的Arthas,优秀的开源的框架skywalking等等,也可以做到这些,那么这些工具究竟是通过什么技术手段来实现对JVM的监控和动态修改呢?

2023-09-11 14:34:38 204

原创 Mybatis-genetator使用

mybatis-geneator是一款mybatis自动代码生成工具,可以通过配置,快速生成mapper和xml文件。即可在Plugins下点击mybatis-generator运行,自动生成mapper和xml文件了。以上仅存在于顺利的情况下!下面我会讲一下我遇到的坑和相关的解决方法:)在generatorConfig.xml文件中添加完需要生成的表的配置后。解决:插件的mysql版本需和数据库中的mysql版本一致!配置文件中的内容如下,可根据需要自行修改。在项目的pom文件中添加插件配置。

2023-08-17 18:41:08 33

原创 【日志使用规范】

背景:梳理历史代码以及日志时,发现一个 NPE 异常,定位之后发现该方法长达 500 多行,且记录的异常日志关键信息极少,很难定位具体问题,因此记录此案例方便后续开发。通过上游方法的日志,本地复现之后定位到问题出在具体哪一行,最终解决了 问题并完善了日志。这会导致排查代码时很难定位问题。建议异常时使用以下方式记录。记录日志时需要注意 placeholder 占位符。

2023-06-26 18:57:48 30

原创 TransmittableThreadLocal总结

在使用线程池等会池化复用线程的执行组件情况下,提供ThreadLocal值的传递功能,解决异步执行时上下文传递的问题。ThreadLocal使用场景针对线程不安全的例如SimpleDateFormat使用时能够支持多线程状态下的安全使用。同时不需要实例化过多实例和使用锁。} };上下文调用中屏蔽过多的方法栈中的传参(例如用户信息,客户端信息等存入,那么当前线程在任何地方需要时,都可以使用)} /*** 此方法可以支持在当前线程内任意地方获取客户端信息。

2023-06-10 11:33:00 1364

原创 ThreadLocal

我们知道出现内存泄漏的原因是失去了对ThreadLocal对象的强引用,避免内存泄漏最简单的方法就是始终保持对ThreadLocal对象的强引用,为每个线程声明一个对ThreadLocal对象的强引用显然是不合适的(太麻烦且缺乏声明的时机),所以,我们可以将ThreadLocal对象声明为一个全局常量,所有的线程均使用这一常量即可。造成内存泄露的根本原因是因为当前线程引用着Entry对象,导致Entry对象不能被回收,从而导致value中的数据占用着内存空间。

2023-06-08 18:46:22 122

原创 【深拷贝和浅拷贝】

浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝。目前常用的属性拷贝工具,包括Apache的BeanUtils、Spring的BeanUtils、Cglib的BeanCopier、mapstruct都是浅拷贝。浅拷贝会创建一个新对象,新对象和原对象本身没有任何关系,新对象和原对象不等,但是新对象的属性和老对象相同。具体可以看如下区别:如果属性是基本类型(int,double,long,boolean等),拷贝的就是基本类型的值;

2023-06-08 11:45:13 943

原创 【分布式事务解决方案--Seata简介】

1.seata简介2.seata相关概念3.Seata 默认AT(Auto Transaction)模式4.总结分布式事务解决思路:分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴 CAP定理 和 BASE理论,有两种解决思路AP 模式(最终一致性思想):各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。CP 模式(强一致性思想):各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

2023-06-07 17:00:11 395

原创 【分布式事务及方案】

在微服务架构下,系统被拆分为很多很多的服务,所以在进行一个业务流程时,比如商品下单逻辑,不可避免的会出现,同时调用多个服务的现象,同时过多个服务之间存在依赖关系,并且还要保证最终的数据一致性。这种场景我们如果在一个单体应用中,其实很好解决,直接将该业务的相关操作放在一个事务中即可。但在分布式框架之下,我们就需要一个全新的概念去实现它,这里我们就引出了一个问题:为什么需要分布式事务?在单一数据节点中,事务仅限于对单一数据库资源的访问控制,称之为本地事务。

2023-06-07 16:33:04 30

原创 【mybatis原理】

mybatismybatis原理mybatis框架分层架构核心接口和对象mapper接口与xml的映射mybatis执行过程mybatis执行时序图一级缓存和二级缓存一级缓存二级缓存mybatis核心流程1、初始化阶段2、代理阶段3、数据读写阶段mybatis如何获取数据源mybatis如何获取执行SQLMyBatis 如何执行 sql 语句?mybatis原理mybatis框架分层架构核心接口和对象mapper接口与xml的映射mybatis执行过程mybatis执行时序图

2022-03-27 15:58:55 1741

原创 限流算法及实现

限流算法

2022-03-21 22:38:40 150

原创 Spring AOP

AOP概述通过AOP提出横切的概念后,在把模块功能正交化的同时,也在此基础上提供一系列横切的灵活实现,比如通过使用Proxy代理对象、拦截器字节码翻译技术等一系列AOP技术,来实现切面应用的各种编织实现和环绕增强。**面向切面编程(Aspect Oriented Programming,AOP)**其实就是一种关注点分离的技术,为了将业务功能的关注点和通用化功能(日志、缓存、事务等)的关注点分离.切面(Aspect):指的就是通用功能的代码实现,比如我们上面演示的时间记录切面,日志切面,它们都是普通

2022-03-20 19:02:11 44

原创 spring IOC原理

IOC初始化过程IOC容器初始化是由ApplicationContext中的refresh()方法启动的,这个方法标志着IOC容器正式启动。这个启动包括BeanDefinition的Resource定位、载入和注册三个基本过程。Resource定位指的是BeanDefinition资源定位,它由ResourceLoader通过统一的Resource接口来完成;载入过程就是将用户定义好的Bean表示成IOC容器内部的数据结构,这个数据结构就是BeanDefinition;将BeanDefinition向

2022-03-13 20:51:50 1188

原创 mysql索引及优化

mysql索引及优化1 索引简介1.1 索引定义1.2 索引的数据结构1.2.1 Hash表1.2.2 二叉查找树1.2.3 平衡二叉树1.2.4 B树1.2.5 B+树2 MySQL的索引实现2.1 MyISAM索引2.1.1 主键索引2.1.2 辅助索引2.2 InnoDB索引2.2.1 主键索引(聚簇索引)2.2.2 辅助索引3 对比4 索引失效4.1 单索引时效的情况4.2 联合索引失效的情况5 什么情况下不建议使用索引6 索引优化6.1 查询语句6.2 创建索引原则1 索引简介1.1 索引定义

2022-02-26 13:37:49 633

原创 JVM调优

JVM调优java调优命令:1、jps - 虚拟机进程状况工具2、jstat - 虚拟机统计信息监视工具3、jinfo - Java配置信息工具4、jmap - Java内存映射工具5、 jhat - 虚拟机堆转储快照分析工具6、jstack - Java堆栈跟踪工具java调优命令:1、jps - 虚拟机进程状况工具JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程。$ jps [options] [hostid]$ jps -l -m2、jsta

2021-06-24 20:24:09 83

原创 2021-06-15动态规划

动态规划求方案数70、爬楼梯 dp[i] = dp[i-1] + dp[i-2]198、盗窃抢劫 dp[i] = max(dp[i-2] + nums[i], dp[i-1])数组区间分割整数最长递增子序列最长公共子序列(双序列型)背包问题:股票交易字符串编辑数字素数进制转换阶乘字符串加法减法相遇问题多数投票问题使用场景:求方案总数(90%)求最值(90%)求可行性(80%)不适合的场景:找所有具体的方案(99%)输入数据无序(除背包问题外 60%)暴力算法

2021-06-15 21:31:55 179

原创 设计模式

设计模式观察者模式二级目录三级目录观察者模式要点:观察者模式定义了对象之间一对多的关系。主题(subject,可观察者)用一个共同的接口来实现observer(观察者)。主题subject和观察者observer之间用松耦合方式结合,subject不知道observer的细节,只知道观察者实现了观察者接口。使用观察者模式时,你可以被观察者推(push)或拉(pull)数据。有多个观察者时,不可以依赖特定的通知次序。Java有多种观察者模式的实现,包括了通用的java.util.Observ

2021-05-17 00:05:26 55

原创 锁底层实现及锁膨胀

Java锁底层实现及锁膨胀背景堆内存java内存模型缓存Synchronized原理Synchronized锁升级过程锁优化锁消除锁粗化二级目录三级目录背景堆内存jvm中,对象在内存中的布局分为三块:对象头:存储对象的哈市Code或锁信息,对象类型数据的指针和数组的长度等。实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐。

2021-05-13 20:43:09 69

原创 Java8 Stream

Java8 StreamStream中间操作符mapflatmaplimitdistintfilterpeekskipsorted终止操作符collectcountfindFirstallMatchminreduceforEachtoArrayStreamStream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。Stream流的操作符分为两类:中间操作符和终止操作符。Stream 的一系列操作必须要使用终止操作,

2021-05-07 20:19:05 114

原创 Head First 设计模式

Head First 设计模式设计原理二级目录三级目录设计原理找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化对代码混在一起。针对接口编程,而不是针对实现编程。多用组合,少用继承二级目录三级目录...

2021-04-16 12:39:58 75

原创 NIO编程

NIO编程1、流1.1、 java.io下的字符流和字节流1.1.1、字符流1.1.2、字节流1.2、装饰器模式2、Socket2.1、通过Socket发送数据2.2、通过Socket读取数据3、BIO模型4、NIO模型5、NIO多人聊天室1、流1.1、 java.io下的字符流和字节流1.1.1、字符流字符流更加的方便我们使用,一般字符都是由多个字节来形成的,若我们使用字节流传输,则还需要我们自己将其转换为字符,若我们直接使用字符流的话,这样就能直接读取与输出字符。1.1.2、字节流字节

2021-04-05 14:14:37 110 1

原创 智力题

智力题排序问题1、100G 数据,只有 100M 内存,怎么排序?大数据处理问题智力题排序问题1、100G 数据,只有 100M 内存,怎么排序?思路:使用多路归并排序100G 数据,按照 100M 内存拆分,然后排序有序的数据,然后写入到 file1,file2…file100。多路归并:每次取出当前所有文件中的最小值,存入最终的大文件中。第一回合:从 file1,file2,file3……file100.取出第一个数。及最小的。所有的初始指针都是第一行。 min1=min(min1=min

2021-03-29 18:46:48 515

原创 算法分类

算法分类双指针法167、两双相加 i=0, j=nums.length - 1633、两数平方和 i=0, j= (int)Math.sqrt(c)345 、反转字符串中的元音字符 i=0, j = s.length() -1680、回文字符串 i=0, j = s.length() - 188、归并两个有序数组 index1 = m-1, index2 = n-1141、判断链表是否存在环 l1 = head, l2 = head.next524、最长子序列排序快速排序堆排序

2021-03-24 22:22:38 137

原创 高频算法

高频算法215. 数组中的第K个最大元素思路:使用堆,建立一个K个元素的小顶堆,当元素比堆顶元素大时,入堆,否则不入堆。最后弹出堆顶元素即为第K个最大的元素。import java.util.PriorityQueue;public class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; // 使用一个含有 k 个元素的最小堆

2021-03-24 21:19:31 612

原创 AQS

AQSAQS的核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待已经被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。CLH队列是一个虚拟的双向队列,AQS是将每条请求共享资源的线程封装成一个CLH锁队列的一个结点来实现锁的分配。AQS使用一个int成员变量来表示同步状态,通过内置的FIFO队列来完成获取资源线程的排队工作。AQS使用CAS

2020-12-04 16:34:35 95

原创 线程池及参数调优

线程线程的生命周期新建,就绪,运行,阻塞,死亡创建线程的方式继承Thread实现Runnable实现Callable通过线程池的方式实现Runnalbe接口和Callable接口的区别Runnable接口不会返回结果或抛出检查异常,但是Callable接口会返回。线程池线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡

2020-12-04 15:05:03 554

原创 ThreadLocal

ThreadLocalThreadLocal简介ThreadLocal原理ThreadLocal特性ThreadLocal简介ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个TheadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本。他们可以使用get()和se()方法来获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程的安全问题。ThreadLoc

2020-12-04 11:14:22 70

原创 代码简洁之道

代码简洁之道clean code命名规范函数注释格式错误处理类并发编程clean code神在细节之处。命名规范函数函数应该做一件事。做好这件事,只做这一件事。注释别给糟糕的代码加注释----重新写吧。格式错误处理使用异常而非返回码先写Try-Catch-Finally语句依调用者需要定义异常类别返回null值类类应该短小并发编程对象是过程的抽象,线程是调度的抽象。基础定义:...

2020-10-10 11:28:28 108

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除