首先JVM全称java虚拟机,是java面试过程中常问的问题,这里对JVM作讲解,足以应付面试,以后工作中如果用到,还需要深耕,学习以下知识大概1小时就可以应付一般的面试了
一、JVM内存结构
以上蓝色部分表示线程私有的,表示每个线程单独都有一份:栈、本地方法栈、程序计数器。黄色部分表示线程共有的部分:堆、方法区。
首先看线程私有的部分:栈:栈是一种先进后出的数据结构,代码的运行就是压栈弹栈的过程;本地方法栈:java底层保留了许多c写的方法,这些c写的native方法就是依靠本地方法栈执行;程序计数器:程序计数器是用来记录方法执行到哪一步了,最简单来说递归调用时,jvm如何知道执行到哪了就靠程序计数器。
其次看线程共享的部分:堆:堆是最大的一块内存,简单说所有代码中new出来的对象都存在堆内存中,堆内存中有两代:新生代和老年代,其中新生代发生的垃圾回收叫新生代GC,也叫轻GC;老年代发生的垃圾回收叫老年代GC,也叫Full GC;这两个垃圾回收有区别,Full GC耗时且会使得JVM暂停,所以项目会卡,轻GC很快,所以JVM调优其实是在想办法让Full GC的次数少一些。
新生代:新生代中分为三个区域:Eden区,from区(s0区),to区(s1区)
老年代:老年代中存放的是幸存区中活到15岁就会被放到老年代
方法区:方法区中存放的是静态变量,常量,类信息
二、类加载机制
类加载机制分为三个阶段
1.加载阶段
由不同的类加载器将.class文件从硬盘读取到内存中,类加载器有三种:
(1)启动类加载器:加载jre的核心包
(2)扩展类加载器:加载jre的ext目录下的扩展jar包
(3)系统类加载器:加载我们自己编写的类
加载机制:
(1)全盘委托机制:当一个classloader加载一个类时,这个类依赖和引用的其他类也由这个classloader加载
(2)双亲委派机制:默认会向当前类加载器的parent加载器加载,parent加载器加载不了才会使用下一层的加载器加载。
2.连接阶段
(1)验证
验证字节码文件的正确性
(2)准备
给类的静态变量分配内存,给默认值
(3)解析
类加载器装载当前类引用和依赖的其他类
3.初始化阶段
执行静态代码块和程序员给变量的赋值
三、垃圾回收算法
1.判断是否是垃圾的两个算法
(1)引用计数法
(2)可达性分析法
2.垃圾回收算法
(1)标记-清除算法
(2)复制算法
(3)标记-整理算法
(4)分代收集法