JVM理解与总结
0、java运行时数据区域
线程私有:虚拟机栈、本地方法栈、程序计数器
线程共享:堆、方法区、直接内存(非运行时数据区的一部分)
(1)堆里面存放的是我们new的对象;
(2)jvm栈是java方法运行时所需要使用的空间;
(3)本地方法栈是native方法运行时所需要使用的空间;
(4)方法区是用来存储类元信息:类方法属性信息、静态变量、常量等属性值
(5)程序计数器主要存储的是程序运行指令当前所处的一个位置。用于控制程序的执行
1、程序计数器:
(1)字节编码器通过改变计数器的值选择下一条指令,实现代码的流程控制:顺序、选择、循环、异常处理
(2)记录当前线程所执行的字节码的行号指示器,方便线程切换回正确的执行位置。
(3)随着线程的结束而死亡,不会出现OutOfMemoryerror的区域
2、虚拟机栈
虚拟机栈是由一个个栈帧组成的;
java方法执行的内存模型,每次方法调用的数据都是通过栈传递;
局部变量表:基本数据类型(byte、short、int、long、char、float、double、boolean)对象引用(引用地址、代表对象的句柄)
虚拟机的两个异常:
(1)StackOverFlowError:虚拟机栈的内存大小不允许动态扩展,当线程请求栈超过当前的java虚拟机栈的最大深度时,抛该异常
(2)OutOfMemoryError:虚拟机栈的内存大小允许动态扩展,当线程的请求栈内存用完时,无法再动态扩展了,报错。
3、本地方法栈
虚拟机栈为执行java方法服务;
本地方法栈为执行Native方法服务;
4、堆
堆:存放对象实例,数组;管理垃圾收集器,GC堆
堆分配内存的策略:
垃圾收集算法:
(1)标记—清除算法
先标记需要回收的对象,在标记完成后统一回收所有被标记的对象
问题:效率问题和空间问题(标记清除后,会有大量不连续的碎片)
(2)复制算法
将内存分为大小相同的两块,每次只使用一块,所有内存使用完后,将存活的对象复制到另一块中,再把对象一次清理掉
(3)标记-整理算法
5、方法区
存储已被虚拟机栈加载的类信息、常量、静态变量、即使编译器编译后的代码等数据;
6、运行是常量池
方法区的一部分
7、java创建对象的过程
8、强引用、软引用、弱引用、虚引用
9、类加载过程