中级java知识图谱
2023-05-19 17:12:30 0 举报
AI智能生成
中级java知识图谱
作者其他创作
大纲/内容
DB
MySQL
存储引擎
MyISAM
InnoDB事务原理
MVCC多版本并发控制
B+树存储数据
事务隔离级别
ACID
未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
读已提交(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞
HBase/Mongo
DesignPattern
工厂模式
简单工厂
普通工厂
单例
观察者
责任链
装饰器
代理
JVM
GC
GC算法
复制
Serial/ParNew/ParallelScanvage
标记清除
SerialOld
标记整理
SerialOld/ParallelOld
GS组件
SerialNew SerialOld(FullGC默认收集器)
ParNew
一般配合CMS 响应时间优先
ParallelScanvage + ParallelOld
吞吐量优先,年轻代年老代都是并行收集
CMS
并发清理,不停止用户线程,提高相应时间
G1
不区分年轻代年老代,弹性垃圾回收
线程执行到达 SafePoint SafeRegion 开始FullGC
引用
可达性分析算法(JVM使用)
引用计数算法(难解决循环引用)
四种引用关系
强、软、弱(Guava)、幻
句柄池
Hotspot JVM 使用的是直接内存,为了更快的查找速度
类加载机制
双亲委派
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应当有自己的父类加载器。
OSGI
问题:类加载器死锁或者在动态环境下的OutOfMemoryError问题
假如bundleE不存在,则bundleC就不会被解析成功,会有错误消息提示为何未能解析;而不是报错ClassNotFoundException或NoClassDefFoundError。
在标准Java类加载模型中,总是会在classpath那一长串列表中进行查找;而OSGi类加载器能立即知道去哪里找类
内存模型
堆
new 对象
栈
虚拟机栈(线程私有)
方法变量
方法递归调用过程,就是典型的进栈出栈的过程
本地方法栈(JVM native修饰的方法)
方法变量
方法递归调用过程,就是典型的进栈出栈的过程
程序计数器
如果线程正在执行的是Java 方法,则这个计数器记录的是正在执行的虚拟机字节码指令地址,用于线程切换后的方法继续执行
如果正在执行的是Native 方法,则这个计数器值为空(Undefined),因为native不编译成字节码
常量池、方法区、永久代
静态常量,静态类,字符串
常用指令
jstat
GC 情况
jmap
堆内存现状(年轻代,年老代)
找出大对象 -histo:live | head -n 10
jstack
线程堆栈(查看死锁)
JVMTI
ClassLoader层的加解密
Algorithm
二叉树
平衡二叉树
前后先序遍历
B+树
红黑树
排序
快速排序
归并排序
冒泡排序
二分查找
Thread
线程池
ThreadPoolExecutor
newFixedThreadPool
newSchedualThreadPool
newSingleThreadPool
newCacheThreadPool
ForkJoinPool
RecursiveTask Task1.fork() Task2.fork() 1/2.join()
工具包
内存栅栏
volatile
只能保证多线程间的可见性,多线程写还是有线程安全问题
可以使用 Thread.MemoryBarrier();自行操作栅栏
可重入锁
synchronized
lock
lock/unlock实现锁
可获取锁持有状态,设置获取锁超时时间
lock与sync区别
可中断/可实现公平竞争
lock与sync选择
同步辅助类
以下都基于AQS https://www.cnblogs.com/dolphin0520/p/3920397.html
CountDownLatch
保证多线程执行完毕,不能重复使用
Cyclicbarrier
可重复使用的栅栏
Semaphore
5把钥匙,循环放钥匙,用完放回去,没有拿到钥匙则等着
Phaser
阶段器:switch case
Atomic
AtomicInteger/Long/Boolean
线程间通信
阻塞队列
BlockingQueue
Exchanger
线层与进程
线层
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行。同样多线程也可以实现并发操作,每个请求分配一个线程来处理。
进程
进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
0 条评论
下一页