jvm类加载机制
类加载机制是指把编译后的.class类文件的二进制数据读取到内存中,并为之创建一个java.lang.Class对象,用来封装类在元数据空间的数据结构。
类jvm中的生命周期为 加载,连接,初始化和使用和卸载。
1.加载过程
加载是将类得class文件读入到内存,并未指创建一个java.lang.Class对象,也就是说,当程序中使用任何类时,系统都会为之简历一个java.lang.class对象。
类的加载有类加载器王城,类加载器通常由JVM提供,JVM中由许多类加载器。也可以自行通过继承ClassLoader基类来创建自己得类加载器。
通过使用不同得类加载器,可以从不同来源加载类得二进制数据。
本地文件系统加载class文件,这是钱买你绝大分实列程序类加载方式。
jar包加载class文件,这种也是恒常见得,钱买你介绍jdbc编程时候用到的数据库驱动类就放在jar文件中,jvm也可以从jar文件中加载该class文件。
通过网络加载class文件。
把一个java元文案金动态编译,并执行加载。
类加载器通常无需等到“首次使用”该类时才加载该类,java虚拟机规范允许系统预先加载某些类。
2.链接
当类被加载之后,系统位置生成一个对应的class对象,接着将会进入连接阶段,连接阶段负责将类的二进制数据合并到jre中。类连接又可以分如下3个阶段。
1)验证:验证阶段用于检验被加载的类是否有正确的内部结构,并和其他类协调一致。
java时相对c++语言时安全的,拥有数组越界的检查。 验证文件格式,元数据验证,字节码验证,符号引用验证。
2).准备:类准备阶段负责为类的静态变量分配内存,并设置默认初始值。
3)解析:将类的二进制数据中的符号替换成直接引用。 符号引用是以一组符号来描述引用的目标,符号可以是任何字面形式的字面量,只要不会出现冲突能够定位就行。
直接引用:指向目标的指针,偏移量或者能够直接定位的句柄。
3.初始化
初始化是类的静态变量赋予正确的初始值,准备和初始化阶段看似有点矛盾,
一个语句 , prive static int b= 9
加载:首先是字节码被加载到内存后,验证:先进行连接验证这一步,验证通过准备阶段:给b分配内存。解析: 初始化:才将9赋值给b
双亲委派机制:如果一个类加载器收到了类加载请求,不会自己先去加载,而是把这个请求委托给父类的加载器去执行,如果父类加载器还存在其父类加载器,则进异步向上委托,依次递归。最终将到达顶层的的类加载器,如果不能够完成加载任务,那么这就是双亲委派模式,即每个儿子都很懒,每次有活就丢给父亲去干,直到父亲说这件事我也干不了时,儿子自己才想办法去完成。
双亲委派机制的优势:采用双亲委派模式的是好处是Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层级关可以避免类的重复加载,当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。其次是考虑到安全因素,java核心api中定义类型不会被随意替换,假设通过网络传递一个名为java.lang.Integer的类,通过双亲委托模式传递到启动类加载器,而启动类加载器在核心Java API发现这个名字的类,发现该类已被加载,并不会重新加载网络传递的过来的java.lang.Integer,而直接返回已加载过的Integer.class,这样便可以防止核心API库被随意篡改。
juc并发编程
JUC来源于java.util.concurrent\java.util.atomic\java.t=util.concurrent.locks这三个包(简称juc),在这些包中增加了并发便哼中哼唱用的使用工具类,用于定义类似线程的自定义子系统,包括线程池、异步io和轻量级任务框架。提供可调、林火的线程池。还提供了设计用多线程上下文中的collection实现等。
进程、线程的关系
进程包含多个线程,打的cf,lol游戏,在任务管理器就是一个进程。
java的两个默认线程4
main函数执行的线程和Gc垃圾回收的线程。
线程的六种状态
新生new
运行Runnable
阻塞Blocked等待
watting
timed_waitting
终止terminated
并发、并行的关系:
并发(多个线程操作一个资源)
并行:cpu多核,多个线程可以同时执行
LOCK锁
lock锁是一个接口,实现类:
RenntrantLock(可重入锁)
ReentranReadWriteLock.ReadLock (可重入读写锁中的读锁)
ReentranReadWriteLock。WriteLock(可重入读写锁中的写锁)
Synchronized和Lock区别
1.来源不同synchronize 是java内置的关键子,在jvm层;lock是java的一个接口。
2.synchronize 是自动获取锁,不能够判断锁的状态;lock,手动获取锁,可判断是否获取到锁。
线程阻塞方面
3.3synchronize => 线程1阻塞会导致线程2永远等待;Lock=>不一定会等下去
锁得类型不同
.synchronize=>可重入锁、不可中断、非公平;Lock=>可重入锁、可判断锁、非公平(可设4置成公平)
使用范围不同
synchronize=>适用于少量代码块同步;Lock=>适合锁大量的同步代码块