Java
文章平均质量分 68
milo.qu
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
分布式消息队列技术 - 落地离线消息存储
本文介绍了基于RabbitMQ实现聊天消息异步存储的架构方案。主要内容包括:RabbitMQ的基本概念与工作模型、Docker环境部署配置、SpringBoot集成RabbitMQ实现消息的生产与消费、聊天消息的异步解耦处理流程等。通过定义交换机和队列,实现消息发送与持久化存储的解耦,提升系统性能。同时提供了完整的代码示例,涵盖消息发布、监听处理以及消息入库等关键环节。该方案有效解决了高并发场景下的消息处理问题,实现了系统的异步化和可扩展性。原创 2025-06-09 09:00:00 · 181 阅读 · 0 评论 -
Netty集群搭建
本文摘要: Netty集群实现方案探讨,采用Redis动态分配端口和Zookeeper服务注册机制。通过Jedis连接池与Redis交互,实现端口动态分配策略。使用Zookeeper进行服务注册与管理,采用临时节点记录Netty服务信息,并通过监听机制实现节点变化响应。结合RabbitMQ实现集群消息广播,采用发布订阅模式同步聊天消息。系统包含客户端负载均衡、分布式读写锁、在线人数统计等功能,并通过Spring Boot整合Curator框架管理Zookeeper连接。整体架构实现了高可用、动态扩展和消息同原创 2025-06-08 09:00:00 · 1225 阅读 · 0 评论 -
MQTT+SpringBoot2+Emqx实战
*** emqx的配置工具类*/@Slf4j@Resource/*** mqtt的连接*/@Bean//设置相关的属性//心跳//清空曾经连接的客户端信息//qosString playload ="设备断开连接";/*** paho factory ,把上面的mqtt的自定义连接放入factory工程中,便于连接需要*/@Bean/*** 开启连接通道*///// }/**原创 2025-02-25 00:29:33 · 1320 阅读 · 0 评论 -
七、高性能队列Disruptor原理剖析
解释 :1)EventFactory - 事件工厂,类似前面的MyEventFactory;2) ringBufferSize - RingBuffer有多长;3)ThradFactory - 线程工厂,参考前面讲过的线程工厂内容;4)ProductType - 生产者类型,枚举:SINGLE(一个)还是(MULTI)多个;5)WaitStrategy - 等待策略,Product和Handler的处理速度是不匹配的,所以这里设置的是Handler在等待时,执行什么策略。原创 2025-02-22 13:20:46 · 936 阅读 · 0 评论 -
六、线程间的协作原理场景剖析
解释:1.Future只提供了异步线程的结果返回,并没有提供回调机制;2.无法编排任务,处理有依赖关系的任务;3.无法处理有竞争的任务,比如实现最快的任务结束直接返回。/*** @Description:Future的不足*///生成订单的三个步骤//1 查询商品信息//2 查询用户信息//3 生成订单//查询商品信息try {});//查询用户信息try {return "小明";});//生成订单try {});try {原创 2025-02-19 22:02:49 · 725 阅读 · 0 评论 -
五、线程池原理剖析与实战
/自定义线程池(带返回值)// System.out.println("线程执行了");// });// return "CallAble返回值";// });如果没有传,使用默认拒绝策略演示示例:/***///演示默认拒绝策略TimeUnit.SECONDS,new ArrayBlockingQueue<>(1),new MyThreadFactory("订单业务"));原创 2025-02-18 01:05:43 · 873 阅读 · 0 评论 -
四、并发容器的线程安全性与实战
原理: 计算key的hash值,确定存放位置。参考:Java进阶:HashMap底层原理(通俗易懂篇)_java hashmap底层原理-优快云博客、数据覆盖问题:解释(红框内代码): 如果多线程同时保存数据(hashcode相同),都会走到628行,第一个线程会执行保存数据操作,第二个线程会执行覆盖操作。ConcurrentHashMap与HashMap数据结构都是数组+链表+红黑树,与HashMap不同的是, ConcurrentHashMap可以在并发环境下操作。读操作使用volati原创 2025-02-17 12:10:00 · 755 阅读 · 0 评论 -
三、Java中七大常用锁实战
***/try {System.out.println("拿到锁");}).start();try {System.out.println("拿到锁");}).start();运行结果:结论:两个线程一直没有停止。通过JVM命令查看:在真实的业务中死锁一般不容易察觉!/***///从member移除这个优惠券return id;/***///构建对象。原创 2025-02-16 22:41:41 · 1011 阅读 · 0 评论 -
二、深入剖析线程安全性问题与底层原理
/存钱的线程i < 3000;//消费的线程i < 3000;/*** 存钱*//*** 消费*/期望:最终还是1000运行结果:每次运行结果不一样。原创 2025-02-15 20:07:11 · 923 阅读 · 0 评论 -
一、并发编程基础知识
假设A和B使用了volatile,核心1修改缓存A,造成整个缓存行的数据都失效了,这个时候,核心2的缓存也失效了,需要从主存重新获取缓存行,这个时候造成了一个问题效率比较低。这里有一个非常要注意的点,futureTask.get(),如果在生产环境中这么使用,会无限制的等待线程返回数据,如果是个下单的场景,线程一直未执行完成,用户会永远卡在这里。核心1将缓存行加载到核心1、核心2的缓存中,这个时候缓存行既存在于核心1缓存中,也存在于核心2缓存中,这个状态叫做共享状态。原创 2025-02-15 20:06:27 · 696 阅读 · 0 评论 -
JVM-字节码应用
classReader.accept方法的第一个参数是classVisitor,即上面定义的classVisitor, 第二个ClassReader.SKIP_DEBUG,操作的时候,哪些信息不看,这里是跳过debug信息,一般来说设置忽略debug信息就可以了。用CoreAPI解析和TreeAPI都能做字节码解析,区别,TreeAPI必须读取完整字节码信息,才能做解析。八、反射之二反射管理类信息案例实战。九、反射之三反射修改类信息案例实战。十、反射之四通过反射调用类方法实战。原创 2024-01-26 17:13:49 · 1375 阅读 · 0 评论 -
JVM-透彻理解字节码以及指令
每个线程在执行的时候,先看能不能抢到锁,不能抢到锁等到,抢到锁,执行monitorenter指令,代码执行完后,再执行monitorexit指令退出,其他线程继续抢锁,抢到后继续执行这2个指令,如此往复。调用动态方法(如lamdba、动态语音编译的字节码),会有至少两步,第一步,先将语法糖还原成invokedynamic指令,第二步再根据具体方法类型,调用具体指令。0000 0031 - Java版本号,这里的31是16进制大版本号,转换后十进制49,前面4个字节 是小版本,后面是大版本。原创 2024-01-18 18:49:58 · 1480 阅读 · 1 评论 -
JVM-JVM支持高并发底层原理精讲
当线程即使处于阻塞的时候,线程不再收到信号,线程也是可以收到一个异常,可以这个异常理解为一个信号,就像闹钟一样就会响,强制这个线程做出一定的响应,而这个异常就是这个子线程的那种,当调用线程终止方法,就会触发这个异常。当t1线程的x=b,从a=1代码的下面,移动到a=1代码的上面,且t2线程的y=a,从b=1代码的下面移动到b=1代码的上面,就会计算出x==0&&y==0,这种问题就是。这里为什么没有停止呢,这是因为当阻塞的时候,父线程只能给子线程发停止的信号,要不要停止子线程说了算。原创 2024-01-12 17:00:55 · 1282 阅读 · 0 评论 -
JVM-Arthas高效的监控工具
一、arthas介绍3.选择监控哪个进程4.进入具体进程二、arthas的基础命令与基本操作1.查询包含Java的系统属性:命令:sysprop |grep java1.查询不含Java的系统属性:命令:sysprop | grep -v java3.打印历史命令命令:history4.查看当前工作目录命令:pwd三、如何使用arthas监控线上服务的内存状态1.dashboard - 当前系统的实时数据面板命令:dashboard -i 100 100毫秒刷新一次。原创 2024-01-11 10:39:43 · 2795 阅读 · 1 评论 -
JVM-JVM基本工具与必会调试方式
命令:jmap -dump:live,format=b,file=test.hprof 45094。FGCT 从应用程序启动到采样时的 Full GC 的消耗时间(秒)YGC 从应用程序启动到采样时 Young GC 的次数。FGC 从应用程序启动到采样时 Full GC 的次数。如果启动的是jar,则会将jar的完整类名信息展示出来。GCT 从应用程序启动到采样时 GC 的总时间。如果启动的时候带有参数,还会将启动时的参数打印出来。四、堆分析的基本功-jmap和jhat工具。原创 2024-01-08 16:47:54 · 698 阅读 · 0 评论 -
JVM-透彻掌握ParNew垃圾回收器的原理与使用screenflow
【代码】JVM-透彻掌握ParNew垃圾回收器的原理与使用screenflow。原创 2024-01-08 11:29:59 · 487 阅读 · 0 评论 -
JVM-透彻掌握Parallel垃圾回收器的使用方法
在这种模式下,年轻代的⼤ ⼩、Eden和Survivor的⽐例、晋升⽼年代的对象年龄等参数会被⾃动调整,已达到在堆⼤⼩、吞吐量和停顿时间之 间的平衡点。在⼿动调优⽐较困难的场合,可以直接使⽤这种⾃适应的⽅式,仅指定虚拟机的最⼤堆、⽬标的吞吐量 (GCTimeRatio)和停顿时间(MaxGCPauseMills),让虚拟机⾃⼰完成调优⼯作。不管执⾏多少次,也不管每次执⾏多少时间,但是要在⼀定的时间范围⾥ ,尽可能让线程执⾏⽤户程序 ⾼吞吐量则可以⾼效率地利⽤CPU时间,尽快完成程序的运算任务。原创 2024-01-08 11:29:34 · 1181 阅读 · 0 评论 -
亿级流量系统如何优化老年代ParNew_CMS?
情况1:比如,老年代此时可用空间80M < 历次YGC后升级老年代的平均对象大小100M,这样就会触发FullGC;情况2:移入老年代的对象大于,此时老年代的剩余空间,触发FullGC;情况3:被占用的老年代空间超过阈值,触发FullGC。原创 2024-01-05 09:27:30 · 391 阅读 · 0 评论 -
G1为什么更适合亿级流量系统以及YGC优化策略screenflow
之前讲过,在G1里新生代的占比是5%-60%,如果堆空间是8G,此时新生代占的空间就是400MB~4.7GB,如果一次回收完,就会非常耗时,可以通过设置回收最大停顿时间,减少服务的停顿,一次回收一部分,比如1.2G。1.ParNew执行回收的时候,STW会比较长,CMS存在碎片化的问题,当物理机的内存变大,这套组合存在的问题会更大,加大物理内存,反而让垃圾回收更慢。如果是视频、大数据、批处理等对象比较大的场景,我们可以将最大停顿时间调大一些,让垃圾回收频率降低,单次垃圾回收效果会更好。原创 2024-01-05 09:26:44 · 520 阅读 · 0 评论 -
JVM-【场景实战】熟悉Serial垃圾回收器的使用
这个收集器是⼀个单线程的收集器,但它的 “单线程” 的意义并不仅仅说明它只会使⽤⼀个 CPU 或⼀条收集线 程去完成垃圾收集⼯作,更重要的是在它进⾏垃圾收集时,必须暂停其他所有的⼯作线程,直到它收集结束 (Stop The World)Serial回收器的优势与设置参数优势:简单⽽⾼效(与其他收集器的单线程⽐),对于限定单个 CPU 的环境来说, Serial 收集器由于没有线程交互的开销,专⼼做垃圾收集⾃然可以获得最⾼的单线程收集效率。② 作为⽼年代 CMS 收集器的后备垃圾收集⽅案,原创 2024-01-04 09:30:21 · 553 阅读 · 0 评论 -
JVM-透彻理解GC日志的内容
⽼年代的总⼤⼩是10240K,未使⽤。这是因为 在新⽣代⾥的from和to是轮流使⽤的,⼀次只有⼀个发挥作⽤,相当于浪费了⼀个1M的空间,因此只有空间只有 8M的Eden区+1个1M的S区,⼀共是9M。] 这⾥表示的含义是在执⾏垃圾回收之前,年轻代被占⽤的空间 是8105K,完成垃圾回收之后占⽤的空间是378K,完成之后新⽣代的总空间⼤⼩是9216K,耗时0.0015472 secs。表示垃圾回收之前堆空间被占⽤的空间是8105K,回收之后被占⽤的是 378K,堆的总空间为19456K。原创 2024-01-04 09:29:37 · 1406 阅读 · 0 评论 -
JVM-【原理精讲】解密新生代垃圾回收器的工作原理
JVM-解密新生代垃圾回收器的工作原理原创 2024-01-03 09:20:53 · 456 阅读 · 0 评论 -
JVM-【原理精讲】图解垃圾清除算法的原理
JVM-垃圾清除算法的原理原创 2024-01-03 09:20:11 · 380 阅读 · 0 评论 -
JVM-【原理精讲】图解垃圾标记算法的原理
原创 2024-01-02 17:53:06 · 362 阅读 · 0 评论 -
JVM-从收拾房间看垃圾回收基本思想
JVM-垃圾回收器介绍原创 2024-01-02 17:43:52 · 378 阅读 · 0 评论 -
JVM-七步带你掌握JVM内存结构
这是JDK1.6的内存结构,JDK1.8以后方法区已经挪出来了,不属于JVM内存。一、从房屋户型图理解JVM的内存划分原理与基本结构介绍。二、第一步:掌握程序计数器的功能与工作过程。原创 2024-01-02 17:24:28 · 1458 阅读 · 0 评论 -
用了6年的 SpringBoot 项目部署方案,稳得一批!
都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;该节点中的节点是可作为参数传递给其他配置文件,如我这里的package-name节点值就可以在另外的assembly.xml或者shell脚本文件中通过${package-name}其实shell脚本中包含有解压命令,但是我在打包时放在了zip中,所以只能通过手动解压了,当然可以调整;把配置文件和jar包等压缩成什么文件格式,这里可以有:zip,tar等。转载 2023-12-29 17:18:59 · 132 阅读 · 0 评论 -
亿级流量场景下如何优化混合回收
当大对象超过region一半,就会将其放到大对象region里边去,占用老年代空间,当有大量短周期大对象进入老年代,也会提高混合回收的频率,进而影响到FullGC的频率。我们完全可以通过最大停顿时间的调整,来控制每次垃圾回收的region数量以及回收垃圾大小。关于G1的优化,最重要的两点1.调整最大停顿时间、2.调整region大小。2.优化G1垃圾回收关键的一点,设置合理的最大停顿时间。1.是已分配内存占总内存的超过45%阈值;原创 2023-12-28 09:57:43 · 412 阅读 · 0 评论 -
亿级系统设置年轻代(ParNew+CMS)
秒杀场景,ParNew+CMS优化设置原创 2023-12-27 22:25:36 · 417 阅读 · 0 评论 -
JVM基础原理篇-带你深入拆解G1垃圾回收原理
动态调整新生代区域region的数量 - 在G1里,在执行YGC的时候,新生代的数量是可以动态变化的,一般什么都不设置的情况下,Eden区占比例在5%~60%之间(调整的原因,是根据每次执行垃圾回收后,根据当前的情况判断增加region数量,每增加一个region数量,Eden区就会增加一个,如果没有必要,Eden数量太多,导致回收时间太长,这时JVM就会减少Eden区数量)。1.混合回收前面为什么会有一次YGC呢,前面讲了混合回收的触发条件是,在YGC后,已分配的内存占总内存的45%,触发混合回收;原创 2023-12-27 22:16:13 · 2004 阅读 · 0 评论 -
总结两套JVM模版配置
XX:+CMSScavengeBeforeRemark - 在重新标记阶段,会STW,导致服务中断,这个时候,在执行重新标记前,先执行一次YGC,因为重新标记主要管的是新创建的对象(新生代),先执行一次YGC,新生代中的垃圾对象都会被提前清除掉,这样再扫描对象,对象就会少很多,从而降低STW停顿时间。-XX:PermSize=256M - 设置永久代初始内存大小,永久代大小的设置,跟你是什么应用(比如秒杀系统)没有多大关系,因为永久代是装载类文件的,一般设置256/512M就可以;原创 2023-12-21 11:55:25 · 1065 阅读 · 0 评论 -
JVM征服面试篇-亿及流量系统设计(学习笔记)
一、如何拆解亿级流量系统-百万级结算系统如何设置JVM。4.第四步:确定单笔订单耗时,寻找性能瓶颈。2.第一步:确定业务背景和核心流程。5.第五步:确定单笔支付需要的空间。3.第二步:确认系统的压力在哪里。6.第六步:回答面试官的问题。3.第三步:确定QPS。原创 2023-12-20 18:00:31 · 420 阅读 · 0 评论 -
JVM基础原理篇-透彻理解类加载子系统(学习笔记)
收到一个新的类,最底层的系统类加载器并不直接加载,而是向上委托给扩展类加载器,而扩展类加载器拿到新类后,也不执行加载,继续向上委托给引导类加载器,引导类加载器会执行加载,假如能够加载成功,结束退出,如不能加载,向下返回个null,扩展类加载器检测到上层加载器不能加载,它会执行加载,假如加载成功,结束退出,如不能加载,继续向下返回个null,系统类加载器检测到上层加载器不能加载,系统类加载器会执行加载。扩展类加载器加载的类文件,相对JVM而言,不是特别重要,但是又比我们写的代码重要。原创 2023-12-20 17:54:24 · 590 阅读 · 0 评论 -
垃圾收集器及内存分配
‐XX:+PrintGC 输出GC日志 ‐XX:+PrintGCDetails 输出GC的详细日志 ‐XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式) ‐XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013‐05‐04T21:53:59.234+0800) ‐XX:+PrintHeapAtGC 在进行GC的前后打印出堆的信息 ‐Xloggc:F://test//gc.log 日志文件的输出路径。(这里是指,并行能力较强的机器)原创 2023-12-15 14:18:36 · 1143 阅读 · 0 评论 -
SpringBoot+内置Tomcat配置,参数调优,最大并发量,最大连接数
SpringBoot开发最大的好处是简化配置,内置了Tomcat, 在SpringBoot2.0.x版本中内置Tomcat版本是8.5.x,SpringBoot内置Tomcat的默认设置中,Tomcat的等待队列长度默认是100,Tomcat的最小工作线程数默认分配10,Tomcat的最大线程数是200,最大连接数是10000,至于最大并发量和最大连接数,常常理解成最大并发量就是最大连接数,实际上是有些牵强的,最大连接数并不一定就是最大并发量。,这2条请求任务恰恰是最容易忽略的,如此最终处理了14条请求,转载 2023-12-15 10:00:00 · 3620 阅读 · 0 评论 -
JVM垃圾回收算法
上面这张图代表的是程序运行期间所有对象的状态,它们的标志位全部是0(也就是未标记,以下默认0就是未标记,1为已标记),假设这会儿有效内存空间耗尽了,JVM将会停止应用程序的运行并开启GC线程,然后开始进行标记工作,按照根搜索算法,标记完以后,所有从root对象可达的对象就被标记为了存活的对象,此时已经完成了第一阶段标记。和标记清除算法一样,也是从根节点开始,对对象的引用进行标记,在清理阶段,并不是简单的清理未标记的对象,而是将存活的对象压缩到内存的一端,然后清理边界以外的垃圾,从而解决了碎片化的问题。原创 2023-12-14 16:12:17 · 1163 阅读 · 0 评论 -
jvm调优参数常用命令总结
(2)查询内存中对象数量及大小(包括活跃以及非活跃对象)(4)查看进程的GC信息 间隔1秒1次,打印5次。(4) 将内存使用情况dump到文件中。(3)查询内存中对象数量及大小(活跃对象)5.设置jvm的堆内存初始大小和最大大小。通过jstat命令进行查看堆内存使用情况。12.当发生内存溢出时,自动dump文件。查看Java进程xxx的指定JVM参数。查看Java进程xxx的JVM参数。(2) 通过浏览器访问。(1)查看class加载数统计。1.查看Java命令参数。(2)其他见学习笔记。原创 2023-12-14 14:46:44 · 689 阅读 · 0 评论 -
JVM调优:参数(学习笔记)
JVM调优:参数(学习笔记)原创 2023-12-14 14:18:25 · 1540 阅读 · 0 评论 -
SpringBoot方法异步调用@Async
SpringBoot方法异步调用@Async转载 2023-10-13 10:19:12 · 391 阅读 · 0 评论 -
SpringBoot 快速实现 api 加密
SpringBoot 快速实现 api 加密转载 2023-10-13 09:44:34 · 708 阅读 · 0 评论
分享