JVM和JUC的简要介绍
开始~~~
JVM
JVM体系结构概览
类加载器
- 类加载器一共四种
- 虚拟机自带的三个
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
- 用户自定义类加载器
- 双亲委派机制
- 作用
- 防止类的重复加载
- 防止JDK中的类被篡改
- 加载类的过程
- 应用程序类加载器委派扩展类加载器,扩展类加载器委派启动类加载器
- 如果启动类加载器加载成功,则不需要再加载
- 没有成功的话,就向下委派直到加载成功,否则抛出ClassNotFound异常
JVM的体系结构
本地方法栈
- 当需要执行native方法时,会将方法压入本地方法栈,此时会向操作系统发送指令,然后由执行引擎解释命令
,会调用本地方法接口,会用到本地方法库 - 程序计数器(PC寄存器)
- 小小的指针,指向了下一个将要执行的方法
方法区
- 方法区中存放
- 静态变量、常量、类信息、运行时常量池
- 方法区的实现
- JDK1.7以及之前
- 通过永久代实现方法区,JDK1.7之前字符串常量池放到方法区中
- JDK1.8及之后
- 通过元空间实现方法区,JDK1.7之后字符串常量池放到堆中
栈
- 栈也叫栈内存,是线程私有的,生命周期随线程的生命周期,线程结束栈内存则释放
- 栈中存放
- 8中基本数据类型变量
- 对象的引用变量
- 实例方法
- 栈在内存中以栈帧的形式存在,方法调用时遵循先进后出/后进先出的原则
堆
- 逻辑上的划分
- 新生区
- 伊甸园区
- 幸村区
- 幸存from区
- 幸存to区
- 养老区
- 永久区/元空间
- 物理上的划分
- 新生区
- 养老区
- 创建对象的过程
- 新new的对象会放到伊甸园区,伊甸园区的对象的存活率非常低。伊甸园快满时会触发轻量级的垃圾
回收机制(MinorGC),MinorGC会回收伊甸园区和幸存from区,将伊甸园区的幸存者标记复制到to区,
对于from区中的幸存者会根据年龄决定:默认情况下,年龄小于15则被标记复制到to区,大于15则被
标记复制到养老区,然后from区与to区交换角色 - 当养老区内存不足时会触发重量级的垃圾回收机制(MajorGC/fullGC),如果养老区无法回收内存则会
出现OOM异常
GC
- GC的分类
- MinorGC
- 用来回收永久区
- MajorGC/FullGC
- 重点回收养老区,偶尔会伴随新生区和养老区
- GC的算法
- 标记复制
- 优点:不会产生内容碎片
- 缺点:需要双倍空间
- 标记清除
- 优点:不需要双倍空间
- 缺点:会产生内存碎片、需要停止整个应用程序、需要维护内存碎片的地址列表
- 标记压缩
- 优点:不需要双倍空间也不会产生内存碎片、不需要维护内存碎片的地址列表、只需要记录空闲内存的起始位置即可
- 缺点:开销较大、需要更新新对象的地址
- 标记清除压缩
JUC
多线程创建的方式
- 继承Thread类
- 实现Runnable接口
- 使用Callable接口
- 需要借助于中间人FutureTask
- 使用线程池
- 创建线程池的方式
- 通过ExecutorService接口的实现类ThreadPoolExcutor直接new
- 通过工厂类Executors的静态方法
Synochronized与Lock的区别
- Synochronized不需要手动上锁和解锁,lock需要手动上锁和解锁
- Synochronized能实现的功能lock都可以实现,而且lock比他更强大
Runnable与Callable的区别
- Runnable没有返回值,Callable有返回值
- Runnable没有抛异常,Callable抛出了异常
- Synochronized能实现的功能lock都可以实现,而且lock比他更强大
Runnable与Callable的区别
- Runnable没有返回值,Callable有返回值
- Runnable没有抛异常,Callable抛出了异常
- Runnable中的落地方法是run,Callable的落地方法是call
JVM和JUC的简要介绍
开始~~~
JVM
JVM体系结构概览
类加载器
- 类加载器一共四种
- 虚拟机自带的三个
- 启动类加载器
- 扩展类加载器
- 应用程序类加载器
- 用户自定义类加载器
- 双亲委派机制
- 作用
- 防止类的重复加载
- 防止JDK中的类被篡改
- 加载类的过程
- 应用程序类加载器委派扩展类加载器,扩展类加载器委派启动类加载器
- 如果启动类加载器加载成功,则不需要再加载
- 没有成功的话,就向下委派直到加载成功,否则抛出ClassNotFound异常
JVM的体系结构
本地方法栈
- 当需要执行native方法时,会将方法压入本地方法栈,此时会向操作系统发送指令,然后由执行引擎解释命令
,会调用本地方法接口,会用到本地方法库 - 程序计数器(PC寄存器)
- 小小的指针,指向了下一个将要执行的方法
方法区
- 方法区中存放
- 静态变量、常量、类信息、运行时常量池
- 方法区的实现
- JDK1.7以及之前
- 通过永久代实现方法区,JDK1.7之前字符串常量池放到方法区中
- JDK1.8及之后
- 通过元空间实现方法区,JDK1.7之后字符串常量池放到堆中
栈
- 栈也叫栈内存,是线程私有的,生命周期随线程的生命周期,线程结束栈内存则释放
- 栈中存放
- 8中基本数据类型变量
- 对象的引用变量
- 实例方法
- 栈在内存中以栈帧的形式存在,方法调用时遵循先进后出/后进先出的原则
堆
- 逻辑上的划分
- 新生区
- 伊甸园区
- 幸村区
- 幸存from区
- 幸存to区
- 养老区
- 永久区/元空间
- 物理上的划分
- 新生区
- 养老区
- 创建对象的过程
- 新new的对象会放到伊甸园区,伊甸园区的对象的存活率非常低。伊甸园快满时会触发轻量级的垃圾
回收机制(MinorGC),MinorGC会回收伊甸园区和幸存from区,将伊甸园区的幸存者标记复制到to区,
对于from区中的幸存者会根据年龄决定:默认情况下,年龄小于15则被标记复制到to区,大于15则被
标记复制到养老区,然后from区与to区交换角色 - 当养老区内存不足时会触发重量级的垃圾回收机制(MajorGC/fullGC),如果养老区无法回收内存则会
出现OOM异常
GC
- GC的分类
- MinorGC
- 用来回收永久区
- MajorGC/FullGC
- 重点回收养老区,偶尔会伴随新生区和养老区
- GC的算法
- 标记复制
- 优点:不会产生内容碎片
- 缺点:需要双倍空间
- 标记清除
- 优点:不需要双倍空间
- 缺点:会产生内存碎片、需要停止整个应用程序、需要维护内存碎片的地址列表
- 标记压缩
- 优点:不需要双倍空间也不会产生内存碎片、不需要维护内存碎片的地址列表、只需要记录空闲内存的起始位置即可
- 缺点:开销较大、需要更新新对象的地址
- 标记清除压缩
JUC
多线程创建的方式
- 继承Thread类
- 实现Runnable接口
- 使用Callable接口
- 需要借助于中间人FutureTask
- 使用线程池
- 创建线程池的方式
- 通过ExecutorService接口的实现类ThreadPoolExcutor直接new
- 通过工厂类Executors的静态方法
Synochronized与Lock的区别
- Synochronized不需要手动上锁和解锁,lock需要手动上锁和解锁
- Synochronized能实现的功能lock都可以实现,而且lock比他更强大
Runnable与Callable的区别
- Runnable没有返回值,Callable有返回值
- Runnable没有抛异常,Callable抛出了异常
- Synochronized能实现的功能lock都可以实现,而且lock比他更强大
Runnable与Callable的区别
- Runnable没有返回值,Callable有返回值
- Runnable没有抛异常,Callable抛出了异常
- Runnable中的落地方法是run,Callable的落地方法是call