java基础_JVM
2021-11-05 17:01:14 0 举报
AI智能生成
登录查看完整内容
JAVA基础
作者其他创作
大纲/内容
生成Class文件
生成Class对象
加载
确保Class符合jvm要求
验证
在方法区中分配这些变量所使用的内存空间
准备
指虚拟机将常量池中的符号引用替换为直接引用的过程
解析
执行类构造器<client>方法的过程
初始化
装载Class
解释执行
client
server
编译执行
执行Class
java_home\\lib
启动类加载器(Bootstrap ClassLoader)
java_home\\jre\\lib
扩展类加载器(Extension ClassLoader)
classpath
应用程序类加载器(Application ClassLoader)
用户指定
自定义类加载器
类加载器
java代码执行过程
eden
survivor from
survivor to
young
old
堆,线程共享
程序计数器,线程共享
Class
meta数据
方法区,线程共享8改为元空间,放在物理内存中
局部变量表
操作数栈
动态链接
方法出口
栈->栈帧,线程私有
本地方法栈,线程私有
内存空间
堆分配
栈分配
条件:对象的作用域不会逃逸出方法之外,方法结束快速释放
默认Eden空间的1%
-XX:UseTLAB
假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间那边挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump the Pointer)
连续空间撞针分配
会导致内存碎片
TLAB线程本地分配缓存区
内存分配
无法解决对象相互循环引用
引用计数
虚拟机栈中引用的对象
方法区中类静态属性实体引用的对象
方法区中常量引用的对象
本地方法栈中JNI引用的对象
GcRoots
可达性分析
对象存活判断
标记 -清除算法
复制算法
标记-压缩算法
分代收集算法
分区收集算法
垃圾收集算法
单线程复制算法
Serial
Serial+多线程
ParNew
多线程复制算法、吞吐量大
Parallel Scavenge
单线程标记整理算法
Serial Old
多线程标记整理算法
Parallel Old
多线程标记清除算法、停顿少
初始标记
并发标记
重新标记
并发清除
CMS
基于标记-整理算法,不产生碎片、停顿少
G1
垃圾回收器
内存回收
S0C:第一个幸存区的大小S1C:第二个幸存区的大小S0U:第一个幸存区的使用大小S1U:第二个幸存区的使用大小EC:伊甸园区的大小EU:伊甸园区的使用大小OC:老年代大小OU:老年代使用大小MC:方法区大小MU:方法区使用大小CCSC:压缩类空间大小CCSU:压缩类空间使用大小YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间GCT:垃圾回收消耗总时间
jstat
heap: 显示Java堆详细信息
histo[:live]: 显示堆中对象的统计信息
jmap
visualvm
jconsole
Athas阿里
mat
内存状况分析
内存管理
线程概念
继承Tread
实现Runnable接口
使用线程池
线程实现
让出时间片
yield
等待固定时间
会有中断异常
sleep
当前线程加塞等待另一个线程
join
弃用,会释放所有monitor
stop
isInterrupted()判断执行XX
interrupt()打招呼
interrupt
suspend挂起,不会释放临界资源,不推荐使用
resume恢复执行,不推荐使用
先拿到对象的监视器
释放线程的监视器
wait
随机唤醒一个
notify
线程启动前设置
setDaemon
进入同步代码前要获得给定对象的锁
synchronized
常用方法
new
Ready
Running
Runnable
Terminated
Blocked
Waiting
TimedWaiting
线程状态
多个线程间相互获取对方的资源导致互相等待
死锁deadlock
线程无法获得到需要的资源,导致无法执行
饥饿starvation
动态获取相同一种资源而等待
活锁liveLock
线程容易发生的问题
阻塞
最弱障碍,自由出入临界区,有竞争回滚数据。最终可能都失败。
无障碍
无障碍,保证有一个线程胜出,例CAS
无锁
无锁,所有线程都必须有限步完成。无饥饿。例:读,写副本
无等待
并发级别
定义了串行系统并行化后的加速比的计算公式和理论上限
amdahl阿姆达尔定律
处理器的个数,串行比和加速比之间的关系。
gustafson古斯塔夫定律
定律
线程同步
异常与锁
volatile
wait notify线程通信
基本概念
运算调度的最小单位
executor
但要重复退出
可重入
lockInterruptibly
可中断
超时不能获得锁,就返回false,不会永久等待构成死锁
可限时
ReentrantLock(boolean fair)
公平锁
ReentrantLock
类似于 Object.wait()和bject.notify()与ReentrantLock结合使用
await
signal
signalAll
Condition
acquire
tryAcquire
release
Semaphore
是JDK5中提供的读写分离锁
读-读不互斥,读-写互斥,写-写互斥
ReadWriteLock
倒数计时器
new CountDownLatch(10)
countDown
CountDownLatch
循环栅栏
CyclicBarrier
提供线程阻塞原语
park()
unpark(t)
LockSupport
locks
ConcurrentLinkedQueue
ArrayBlockingQueue
DelayQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronousQueue
BlockingQueue
ArrayDeque
IdentityLinkedList
LinkedList
LinkedBlockingDeque
BlockingDeque
Deque
Queue
CopyOnWriteArrayList
CopyOnWriteArraySet
ConcurrentSkipListSet
ConcurrentHashMap
ConcurrentSkipListMap
ConcurrentNavigableMap
ConcurrentMap
collections
tools
CAS(一个指令cmpxchg)
Unsafe
getAndSet
compareAndSet
getAndIncrement
getAndAdd
AtomicInteger
对引用进行修改
AtomicReference
AtomicStampedReference
支持无锁的数组
AtomicIntegerArray
让普通变量也享受原子操作
AtomicIntegerFieldUpdater
AtomicXXX原子类
JUC同步工具
AbstractQueuedSynchronizer
ReentrantLock/Semaphore/CountDownLatch
同步容器
线程池
Disruptor
多线程
哈希码、分代年龄、锁标志位、偏向线程ID、偏向时间戳等信息
MarkWord 4个字节
标识是哪个类的实例
类型指针 4个字节
对象头
有效信息
相同宽度的字段总是被分配到一起
分配策略参数
源码中定义顺序
存储顺序
实例数据
不是必然存在
满足8字节的整数倍
对齐填充
对象在内存中的结构
处于可达状态,不被回收
强引用
内存不足够时回收
软引用
下一次垃圾回收
弱引用
不存储跟踪对象被垃圾回收的状态
虚引用
引用类型
交出CPU
阻塞 IO 模型
不会交出 CPU用户线程不断地询问内核数据是否就绪
非阻塞 IO 模型
有一个线程不断去轮询多个 socket 的状态,当 socket 真正有读写事件时,才真正调用实际的 IO 读写操作。
多路复用 IO 模型
IO请求注册信号函数,收到信号后调用 IO 读写
信号驱动 IO 模型
内核完成后通知用户线程使用数据
异步 IO 模型
IO 模型
FileInputstream
ByteArrayInputstream
ObjectInputstream
PipedInputstream
SequenceInputstream
StringBufferInputstream
Inputstream
Outputstream
字节流
buffered
stirng
charArray
filter
fileReader
inputstream
piped
reder
writer
字符流
io包
Channel(通道、双向)
Buffer(缓冲区)
Selector监听多个通道的事件
核心
Channels
FileChannel
Pipe
Selector
ServerSocketChannel等
SocketChannel
channel包
CharSet
CharSetDecoder
CharSetEncoder等
charSet包
ByteBuffer
CharBuffer
IntBuffer
DoubleBuffer等
Buffer
ByteOrder
mappedByteBuffer
包
NIO
IO
一旦开始不会被干扰
原子性
在并发时可能会出现乱序
汇编代码执行步骤:取指,译码和取寄存器操作数,执行或者有效地址计算,存储器访问,写回
java 代码要转成汇编代码
指令重排可以使流水线更加顺畅
有序性
当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改
产生原因:编译器优化,硬件优化
可见性
程序顺序原则
volatile规则:volatile变量的写,先发生于读
锁规则:解锁(unlock)必然发生在随后的加锁(lock)前
传递性:A先于B,B先于C,那么A必然先于C
线程的start()方法先于它的每一个动作
线程的所有操作先于线程的终结
线程的中断(interrupt())先于被中断线程的代码
对象的构造函数执行结束先于finalize()方法
Happen-Before
线程安全的概念
JMM
显示当前所有java进程pid的命令
jps
堆栈跟踪工具
jstack
java常用命令
JAVA基础
0 条评论
回复 删除
下一页