JVM理解与总结

0、java运行时数据区域

JVM理解与总结

线程私有:虚拟机栈、本地方法栈、程序计数器

线程共享:堆、方法区、直接内存(非运行时数据区的一部分)

JVM理解与总结

(1)堆里面存放的是我们new的对象;
(2)jvm栈是java方法运行时所需要使用的空间;
(3)本地方法栈是native方法运行时所需要使用的空间;
(4)方法区是用来存储类元信息:类方法属性信息、静态变量、常量等属性值
(5)程序计数器主要存储的是程序运行指令当前所处的一个位置。用于控制程序的执行

1、程序计数器:

(1)字节编码器通过改变计数器的值选择下一条指令,实现代码的流程控制:顺序、选择、循环、异常处理

(2)记录当前线程所执行的字节码的行号指示器,方便线程切换回正确的执行位置。

(3)随着线程的结束而死亡,不会出现OutOfMemoryerror的区

2、虚拟机栈

虚拟机栈是由一个个栈帧组成的;

JVM理解与总结

java方法执行的内存模型,每次方法调用的数据都是通过栈传递;

局部变量表:基本数据类型(byte、short、int、long、char、float、double、boolean)对象引用(引用地址、代表对象的句柄)

虚拟机的两个异常:

(1)StackOverFlowError:虚拟机栈的内存大小不允许动态扩展,当线程请求栈超过当前的java虚拟机栈的最大深度时,抛该异常

(2)OutOfMemoryError:虚拟机栈的内存大小允许动态扩展,当线程的请求栈内存用完时,无法再动态扩展了,报错。

3、本地方法栈

虚拟机栈为执行java方法服务;

本地方法栈为执行Native方法服务;

4、堆

JVM理解与总结

JVM理解与总结

堆:存放对象实例,数组;管理垃圾收集器,GC堆

堆分配内存的策略:

JVM理解与总结

垃圾收集算法:

(1)标记—清除算法

先标记需要回收的对象,在标记完成后统一回收所有被标记的对象

问题:效率问题和空间问题(标记清除后,会有大量不连续的碎片)

JVM理解与总结

(2)复制算法

将内存分为大小相同的两块,每次只使用一块,所有内存使用完后,将存活的对象复制到另一块中,再把对象一次清理掉

JVM理解与总结

(3)标记-整理算法

JVM理解与总结

5、方法区

存储已被虚拟机栈加载的类信息、常量、静态变量、即使编译器编译后的代码等数据;

6、运行是常量池

方法区的一部分

JVM理解与总结

7、java创建对象的过程

JVM理解与总结

8、强引用、软引用、弱引用、虚引用

JVM理解与总结

JVM理解与总结

9、类加载过程

JVM理解与总结