高性能编程专题
文章平均质量分 87
本专栏主要会从多线程并发编程、高并发网络编程、Java系统性能调优3个维度分享相关优质内容和常见面试题。
凌波漫步&
Nick Liu,目前是某外资企业后端研发,主要负责发卡、汇款、充值、转账等业务。自己的几个小标签:
1、互联网金融领域全栈攻城狮
2、真诚热情有爱的多面手
3、头马演讲俱乐部主持钉子户
4、自带幽默的表演系
一句话形容我自己:
向外伸展,向内修行,向阳而生。
展开
-
内存爆炸、CPU100%问题定位
最小堆内存并不是程序一启动就申请这么多内存,而是当前进程如果申请的内存已超过最小堆内存,内存回收时,大于最小堆内存的部分会返回给操作系统,其它申请的内存不会。简单来说就是没有开启预热时,JVM只是向操作系统做了登记,告诉操作系统我需要多少内存,但实际上并没有进行物理分配,加上该参数后在程序启动时就会分配物理内存。参数时,JVM进程申请的内存只是虚拟内存,程序运行时根据虚拟内存地址映射到实际的物理内存,缺页时才将数据加载到物理内存,分配实际的物理空间。现在可以看到该线程的方法调用栈,进而找到相应的代码。原创 2023-10-20 15:19:17 · 475 阅读 · 9 评论 -
Spring声明式基于注解的缓存(3-精进篇)
在实例化时,我们可以指定key过期的entryTtl/*** 自定义CacheManager,具体配置参考{@link org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration}* @param redisConnectionFactory 自动配置会注入} }备注:这种方式有一个很明显的缺点,所有key都会共享配置,比如这里会设置所有key的过期时间都为1秒。Spring。原创 2022-09-29 16:58:40 · 2309 阅读 · 14 评论 -
Spring声明式基于注解的缓存(2-实践篇)
总得来说,声明式缓存抽象和声明式事务一样,使用起来都比较简单。Spring缓存抽象官方文档。有同学可能会发现,Spring提供的这些注解不支持过期时间的设置,官方文档也有一些解释,如下:官方提供的建议是通过缓存提供器来实现,其实就是我们可以通过自定义来实现。缓存抽象只是一种逻辑抽象,而不是具体的缓存实现,具体怎么写缓存,缓存写到哪里应该由缓存管理器来实现。下一节我们会通过自定义、、以及相关Cache注解来实现带过期时间的缓存实现。原创 2022-08-22 15:21:57 · 1044 阅读 · 22 评论 -
Spring声明式基于注解的缓存(1-理论篇)
从3.1版本起,Spring框架就已经支持将缓存添加到现有的Spring应用中,和事务支持一样,缓存抽象允许在对代码影响最小的情况下一致性地使用各种缓存解决方案。从Spring 4.1版本起,有了JSR-107注解和更多定制化的选项支持后,缓存抽象有个重大的改进。对于这种情况,@Cacheable注解有一个key属性,通过该属性可以自定义Key生成。我们也可以使用SPEL(Spring表达式语言)当然,我们也可以通过@Cacheable注解指定自定义的key和参数是互斥的,如果两者都指定会触发异常。....原创 2022-08-09 00:47:05 · 820 阅读 · 11 评论 -
Java面试题之关于JIT编译器的那些个优化项
Java到底是一门解释型语言还是编译型语言呢?这取决于Java虚拟机,现在主流的商用虚拟机如HotSpot,都同时包含与,我们可以认为Java即是一门解释型语言,也是一门编译型语言。关于解释器与编译器的优势:当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码“。为了提高热点代码的执行效率,虚拟机会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为。锁粗化和锁消除都是针对synchronized平台级锁所做的优化,具体可参考:Java面试题之syn原创 2022-07-02 17:48:30 · 832 阅读 · 0 评论 -
Java面试题之synchronized平台级锁和Lock实现的锁区别
ReentrantLock和ReentrantReadWriteLock都是并发包下的工具类,ReentrantLock实现了Lock接口,ReentrantReadWriteLock实现了ReadWriteLock接口,而其中的ReadLock和WriteLock又实现了Lock接口。为了区别synchronized和ReentrantLock,我们先了解一下Lock接口相关的API。Object中的、、只能和关键字配合使用,可以唤醒一个或全部线程。Condition需要与Lock配合使用,提供多个等原创 2022-06-27 14:39:42 · 526 阅读 · 0 评论 -
Java面试题之CAS和ABA问题
原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序不能被打乱,也不可以被切割而只执行其中的一部分(不可中断性)。将整个操作视为一个整体,资源在该次操作中保持一致,这是原子性的核心特征。CAS属于硬件同步原语,处理器提供了基本内存操作的原子性保证。CAS操作需要输入两个数值,一个旧值A(期望操作前的值)和一个新值B,在操作期间先对旧值进行比较,若没有发生变化,才交换成新值,发生了变化则不交换。Java中的sum.misc.Unsafe类,提供了compareAndSwapInt()和compareAnd原创 2022-06-23 13:27:03 · 639 阅读 · 0 评论 -
Java面试题之synchronized关键字原理以及锁相关
特性:可重入、独享、悲观锁。锁相关的优化:2、锁粗化示例三、synchronized关键字原理1、关于Mark Word首先,对象在堆中由对象头、实例数据和对齐填充组成。对象头包含两部分信息,第一部分用于存储对象自身的运行时数据,如、、、、等,这部分数据官方称为"Mark Word"。对象头的另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。synchronized实现的锁是通过改变对象头的"Mark Word"来实现的。"Mard Word"原创 2022-06-22 01:37:07 · 1421 阅读 · 8 评论 -
Java面试题之线程池应用及原理
线程在java中是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间 + 销毁时间大于执行时间就很不合算。java对象占用堆内存,操作系统线程占用系统内存,根据jvm规范,Linux/x64操作系统一个线程默认最大栈大小为1m。操作系统需要频繁切换线程上下文(大家都想被运行),影响性能。我们先看下线程池执行器的全参构造器具体有哪些参数,下面是该构造器的定义:corePoolSize:核心线程数,即使任务队列中没有任务,处于空闲状态也不会被回收的线程数,除非指定参数为true。.....原创 2022-06-21 13:29:13 · 387 阅读 · 0 评论 -
Java面试题之线程通信的方式
要实现多个线程之间的协同,如:线程执行先后顺序、获取某个线程的执行结果等等。线程之间相互通信,分为下面四类:作用:调用suspend挂起目标线程,通过resume可以恢复线程。被弃用的主要原因:容易写出死锁的代码,所以用wait/notify、park/unpark机制对它就行替代,resume先调用造成死锁:wait/notify机制相关介绍:......原创 2022-06-20 17:48:58 · 630 阅读 · 2 评论 -
Java面试题之线程状态
面试官问到多线程时一般会问一嘴线程状态有哪些,或者各个状态之间到底是怎么切换的呢?原创 2022-06-20 16:13:13 · 190 阅读 · 0 评论