一、jvm内存结构
1、程序计数器
就是一个指针,它指向了方法区中的方法字节码(其实就是存了下一个指令的地址码)。
2、java虚拟机栈
java线程执行方法的内存模型,一个线程对应一个栈,每个方法在执行时都会在栈中创建一个栈帧,不存在垃圾回收问题,只要方法结束自然就会弹栈。
3、本地方法栈
和栈的作用很像,区别只是在于,本地方法栈是为jvm执行native方法服务的。
4、堆
jvm管理的最大一块内存区域,是线程共享的,用于存放对象的实例。也是gc垃圾回收重点的区域。
5、方法区(jdk8后改为元数据区,常量池由堆管理)
线程共享,用于存储已经被jvm加载的类信息,常量,静态变量等。
二、类加载
类加载是类从.java文件编译成.class文件之后,经过类装载器初始化的过程。
双亲委派机制:首先委托父类加载器查询目标类,在找不到的情况下才会向下寻找。
三、什么是gc垃圾回收
内存空间是有限的,那么程序运行时及时的释放资源,就是gc要做的事。
在jvm中,程序计数器、虚拟机栈、本地方法栈的生命周期就是线程的生命周期,实现了内存的自动清理,所以gc垃圾回收机制主要集中在堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的。