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