1、JVM的结构、执行流程
JavaSource:源代码
JavaClass:将源代码的字节码文件
使用java命令 运行JavaClass文件的时候,就会创建一个java虚拟机,创建一个main主线程作为程序入口
1.类加载子系统:将字节码文件读取到内存中,存到方法区
2.方法区:类的信息
3.堆(Heap):对象信息,new的对象
4.栈(Stacks):局部变量、方法参数
java虚拟机栈:java中的方法
本地方法栈:调本地方法接口,到本地库中找方法执行
5.程序计数器:记录各个线程的运行状态,上下文的切换
6.解释器(Interpreter):将java代码解释成机器代码,机器才可以识别
7.即时编译器(JIT Compiler):将一些热点信息解释成机器代码后,存到缓存中
8.垃圾回收器(GC):不再被引用的对象会被回收
2、造成内存溢出的情况
jvm的结构中,除了程序计数器不会造成内存溢出,其他都有可能造成内存溢出。
OutOfMemoryError:
1.方法区内存耗尽:加载的类越来越多
2.堆内存耗尽:对象越来越多,且一直在使用,不能被垃圾回收
3.栈内存耗尽:线程越来越多,每个线程占用1M内存
StackOverflowError:
1.虚拟机栈内部:方法的调用次数过多,造成线程的1M内存被耗尽。如:回调、死循环
3、方法区的元空间
方法区中的信息是存在元空间中,元空间就是将类的信息存到本地内存中。
元空间的销毁:
元空间中的某个类在堆内存中的引用消失,该类不会立即被释放;
而是当堆内存中元空间所有的类引用消失,GC在做垃圾回收时,发现该类加载器中数据都被回收了,才会回收类加载器,同时回收类加载器对应的元空间中所有的数据,对元空间内存进行释放。
4、jvm垃圾回收算法
- 标记清除:对引用的数据打上标记,未标记的数据就会被清除。
缺点:内存碎片化严重 - 标记整理:未使用的数据删除后,将使用的数据整理,向一端靠拢。
优点:解决内存碎片化。
缺点:多了一个移动数据的操作 - 标记复制:将内存分成两部分,一部分用来存储数据from,另一部分为空闲区to。将打上标记的数据从from移动到to中,然后将from区全部清理。
优点:效率相比前两种高。
缺点:占用了一份空闲内存。
适用情况:适用于新生代垃圾回收;不适用于老年代垃圾回收,老年代复制量较大,适合标记整理法。