JVM终篇

回顾:

JVM组成:

1.堆(创建的所有对象)
新生代/老生代
老年代中的对象:大对象,新生代经过一定GC之后(默认15次)还存活的对象
新生代(复制算法)
新生代区域划分:Eden:80%内存、S0:10%内存,S1:10%内存
新生代内存利用率可达到90%(Eden+S0或Eden+S1)
2.Java虚拟机栈
a)本地变量(8大初级类型和对象引用)
b)操作栈
c)动态链接:运行常量池的引用
d)方法返回:PC寄存器的地址
3.本地方法栈
作用和Java虚拟机栈相似,只不过他是本地方法
4.程序计数器
用来记录线程执行的行号
5.元空间(JDK1.8)JDK1.7方法区
常量,字符串常量池,类的元信息…
JDK1.8已经将字符串常量池移到堆里面。
直接在本地内存

线程私有区域:程序计数器、Java虚拟机栈、本地方法栈
线程共享区域:Java堆、元空间(方法区JDK1.7)

JVM类加载机制

加载
效验
准备
解析
初始化
使用
卸载

加载:
1.根据类路径全名加载它的二进制流。
2.将静态的存储结构转换成运行时的数据结构。(将静态文件转成运行内存)
3.在内存中生成一个此类的方法入口。
效验:
1.文件格式进行效验
2.字节码效验
准备:
将类中的静态变量在内存中进行分配
解析:
将常量的符号引用替换成直接引用的过程
初始化:
将执行从jvm转移给应用程序,加载类中的构造方法

JVM垃圾回收

1.死亡判断算法
a)引用计数器算法[不能解决循环引用问题]
b)可达性分析算法

可以作为GC Roots的对象?

  1. 虚拟机栈(栈帧中的本地变量表)中引用的对象
  2. 方法区中类静态属性引用的对象
  3. 方法区中常量引用的对象
  4. 本地方法栈中JNI(Native方法)引用的对象

2.垃圾回收算法
标记-清除算法(内存碎片)
标记—整理算法
复制算法(内存使用率不高)
3.7种垃圾回收器

JMM

可以让JVM运行的更快
JMM:
1.工作内存
2.主内存

内存间交互操作

  • lock(锁定) : 作用于主内存的变量,它把一个变量标识为一条线程独占的状态
  • unlock(解锁) : 作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。
  • read(读取) : 作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随 后的load动作使用。
  • load(载入) : 作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量 副本中。
  • use(使用) : 作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎。
  • assign(赋值) : 作用于工作内存的变量,它把一个从执行引擎接收到的值赋给工作内存的变量。
  • store(存储) : 作用于工作内存的变量,它把工作内存中一个变量的值传送到主内存中,以便后续的 write操作使用。
  • write(写入) : 作用于主内存的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中。

JMM(3大特征):

原子性
可见性
有序性

volatile

1.内存可见性问题
2.禁止指令重排序

BIO(阻塞IO操作,传统IO)
NIO(非阻塞IO)
AIO(异步IO)

你可能感兴趣的:(多线程,jvm)