volatile关键字
java虚拟机提供的轻量级的同步机制
- 保证可见性
- 不保证原子性
- 禁止指令重排序
CAS是什么?CPU并发原语(原语执行必须是连续的)(CompareAndSwap)
比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,否则继续比较直到主内存和工作内存中的值一致
功能是判断内存某个位置的值是否为预期值,如果是则更改为最新值。原子操作
CAS的执行依赖于Unsafe的方法
缺点:
- 循环时间长开销大
- 只能保证一个变量的共享操作
- ABA问题
java锁
公平锁和非公平锁
公平锁:指多个线程按照申请锁的顺序来获取锁
非公平锁:指多个线程获取锁的顺序并不按照申请锁的顺序,在高并发的情形下,有可能会造成优先级反转和饥饿效应
非公平锁的优点在于吞吐量比公平锁大
可重入锁(递归锁)
线程可以进入任何一个他已经拥有的锁所同步着的代码块
防止死锁
自旋锁
尝试获取锁的线程不会立即阻塞,二是采用循环的方式去获取锁。 好处是减少上下文线程切换的消耗, 缺点是循环会消耗CPU
独占锁(写锁)/共享锁(读锁)/互斥锁
ReentreenkReadWriteLock()
CountDownLatch/CyclicBarrier/Semaphore
阻塞队列
synchronized和Lock有什么区别?
线程池
- 线程池的使用及优势
- 线程池三个常用方式
- Executor.newFixedThreadPool()//执行长期的任务,性能好很多
- Executor.newSingleThreadPool()//一个任务一个任务执行的场景
- Executor.newCachedThreadPool()//执行很多短期异步的小程序和负载较轻的服务器
- Executor.newFixedThreadPool()//执行长期的任务,性能好很多
- 线程池的七大参数
- 线程池的工作流程
- 线程池配置合理线程数
- CPU密集型:CPU核数+1
- IO密集型:CPU核数2
CPU核数1-阻塞系数
- 死锁编码及定位分析
jps命令定位进程号
jstack找到死锁查看
GC Roots
java中可以作为GC Roots的对象
jvm调优和参数配置
- XX参数
- Boolean类型
+开启;-关闭 - KV设置类型
jinfo -flag 查看当前运行程序的配置 - Xms等价于-XX:InitialHeapSize初始大小内存,默认为物理内存1/64
- Xmx等价于-XX:MaxHeapSize最大分配内存,默认为物理内存1/4
- Xss等价于-XX:ThreadStackSize设置单个线程栈大小,默认为512k~1024k
- Xmn设置年轻代大小
- -XX:+PrintGCDetails输出详细GC收集日志信息
java -XX:+PrintFlagsInitial:查看jvm初始化参数
java -XX:+PrintFlagsFinal:查看jvm修改更新后的参数(=代表没修改,:=代表修改了)
java -XX:+PrintCommandLineFlags:查看默认垃圾回收器
- Boolean类型
强、软、弱、虚引用
- 强引用:GC不会回收
- 弱引用:内存够不回收,内存不够回收
- 弱引用:都会回收
- 虚引用:必须和引用队列联合使用,get()方法总为null
OOM
垃圾回收器
- Serial(串行)启用时会暂停所有用户线程
- Parallel(并行)多个垃圾回收期并行工作,用户线程也是暂停的
- CMS(Concurrent Mark Sweep:并发标记清除)(并发)用户线程和垃圾收集器线程同时执行(可能交替执行)不需要停顿用户线程
优点:并发收集停顿低
缺点:并发执行,对CPU压力大;采用的标记清除算法会产生大量碎片 - G1
特点:
原理:Region区域化垃圾收集器(避免全内存扫描)
与CMS相比优势:- 不会产生内存碎片
- 可以精确控制停顿
- (ZGC)
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/276271.html