JVM
文章平均质量分 84
Alan CGH
从500强外企干到头部二手电商公司,目前流落到央企搞数字化
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
高并发写利器-组提交,我的Spring组件实战
介绍高并发写的常用优化手段,解析MySQL组提交原理,基于批量顺序写理论实现组提交组件。对比组提交和单条提交的两种测试用例,进行压测得出组提交比单提交性能高出很多。原创 2025-01-04 20:10:04 · 797 阅读 · 0 评论 -
排查和解决JVM OOM实战
本文深入探讨Java虚拟机(JVM)中的内存区域布局及常见的内存溢出错误(OOM)类型,不仅限于堆内存,还包括元空间和直接内存等。通过沃尔玛支付中台的实战案例,详细解析了一次因内存泄漏导致的OOM事故排查过程。从问题表现、排查手段到最终解决方案,全面展示了如何运用jmap、MAT等工具定位内存泄漏点,并修复代码以避免类似问题再次发生。无论你是Java开发者还是系统运维人员,都能从中获得宝贵的经验和技巧,提升系统稳定性和性能。原创 2024-10-06 13:05:54 · 1459 阅读 · 1 评论 -
AbstractQueuedSynchronizer 工作原理 JDK8
AbstractQueuedSynchronizer 是Java中有名的同步队列器,提供同步锁支持,包括共享同步锁,排它同步锁。还支持尝试获取锁机制(毫秒值),如果线程不能立即获取锁,还提供阻塞等待唤醒机制。ReentrantLock的Sync NonSync就是由AQS实现的。acquire(int arg) 是AQS对外提供的获取独占锁的重要方法,实际获取锁的逻辑交给用户的自定义同步器实现,获取锁失败后的阻塞队列逻辑则由AQS实现。.........原创 2022-07-22 12:58:52 · 402 阅读 · 0 评论 -
FutureTask原理 JDK8
FutureTask类是并发编程的一个代表异步计算任务类,提供异步计算任务的封装以及异步计算结果的返回。本身实现Runnable接口,可以直接提交给线程池执行。不过更多应该是配合Callable使用,因为要用到Callable.call()返回的结果封装在自己的outcome变量。那为什么有了Callable还要用这个类?因为它提供了获取异步计算结果的机制,如果任务没执行完会阻塞获取线程等待任务结束。省去了工程师自己管理的流程。本文基于JDK 8源码分析。FutureTask已经不依赖A.原创 2022-07-21 18:04:18 · 895 阅读 · 0 评论 -
ReentrantLock原理 JDK8
ReentrantLock (简称RS)是区别于 synchronized 的一种锁技术,特性有 等价于 synchronized 的 lock、可重入锁、公平锁与非公平锁、读锁与写锁、Condition对象等等......RS应该在同步性能上与synchronized 到底孰优孰劣,未知。不过由于 RS基于 volatile 变量 state 实现锁的机制,而 synchronized 是基于JVM的 mointer 对象实现的锁机制(偏向锁、轻锁不再考虑范围内)。各位可以自己推敲或试验下。...原创 2022-07-21 17:54:09 · 369 阅读 · 0 评论 -
volatile关键字的使用心得
在读一篇文章的时候,作者对volatile的使用场景就生动解释了它的使用误区:不要在依靠volatile变量现有值的情况下对其自身做修改其实就是不要拿volatile变量做多步骤的操作就是了。volatile变量单纯的读或写操作是可以的,例如:volatile int count = 1;单纯的写操作,直接将value赋值给count,不用读取count变量。这种操作相等于带锁的原子操作,因为其本身就是不可再分割的最小操作了。...原创 2022-07-21 17:21:20 · 200 阅读 · 0 评论 -
Thread类黑魔法原理
Thread类是Java中线程的抽象,是OS线程的一对一映射。Thread本身提供一些基础的并发控制API,利用它可以做基本的线程交互通信。将学习到 wait() notify() join() sleep() interrupt() 方法的原理Java中线程状态流转图可以看到Java的线程状态对比OS实际上是少了一个running的。JVM把running和ready状态合并成了runnable状态。可能由于Java属于上层应用通常不需要关注到线程当前的调度细分状态,设计者把运行中的状态原创 2022-07-21 17:14:17 · 178 阅读 · 0 评论 -
打印异常栈信息的过程和影响
在我们自己实际案例中也有,转转卖场双十一压测时,发现一个接口耗时偏高500ms+,经排查是打印大量日志(一次打印2个屏幕的量)。回到输出异常信息的地方,看到s.lock(),s是System.err的包装类,System.err是一个PrintStream对象。在别人的优化案例中也提到了大量日志输出会增加服务压力,首先大量日志打印造成大量线程争抢PrintStream流的独占锁,线程需要调用线程栈信息。所以回到一开始的场景,avenger框架屏蔽RPC异常超时的接口的异常栈信息打印而是换成自定义异常打印。.原创 2022-07-17 15:11:44 · 1014 阅读 · 3 评论 -
String对象和常量池 intern可以干点什么
有一个使用场景,缓存没有数据时异步查询DB数据,为了避免大流量查询DB,需要在JVM中保证一个活动只放一个线程去查,这样并发查询的数量,对于一个活动来说,就是JVM实例的数量,一般也就十几台就是十几个并发。还有就是HashCode,HashCode是判断两个对象是否完全相等的核心条件,另外,像Set、Map结构中的key值也需要用到HashCode来保证唯一性和一致性,因此不可变的HashCode才是安全可靠的。这个锁对象要求所有的活动id使用同一个,刚好符合String常量池。.........原创 2022-07-17 15:30:07 · 239 阅读 · 0 评论
分享