目录
==================== 持续更新中 ====================
==================== 持续更新中 ====================
==================== 持续更新中 ====================
一、JVM的运行原理
JVM是Java的核心和基础,在java编译器和os平台之间的虚拟处理器。它是一种基于下层的操作系统和硬件平台并利用软件方法来实现的抽象的计算机,可以在上面执行java的字节码程序。
二、JVM内存模型
JVM内存空间分为5部分,分别是:方法区、堆、Java虚拟机栈、本地方法栈、程序计数器。
1、方法区:主要用来存放类信息、类的静态变量、常量、运行时常量池等,方法区的大小是可以动态扩展的。
2、堆:是被所有线程共享的区域,是在虚拟机启动时创建的。堆里面存放的都是对象的实例。
3、Java虚拟机栈:是线程私有的,生命周期与线程相同。创建线程的时候就会创建一个java虚拟机。虚拟机执行java程序的时候,每个方法都会创建一个栈帧,栈帧存放在java虚拟机中,通过压栈出栈的方式进行方法调用。
4、本地方法栈:线程私有,功能和虚拟机栈非常类似。线程在调用本地方法时,来存储本地方法的局部变量表,本地方法的操作数栈等信息。(是非java语言实现的方法。)
5、程序计数器:用来记录当前线程执行程序的位置,改变计数器的值来确定执行的下一条指令,比如循环、分支、方法跳转、异常处理,线程恢复都是依赖程序计数器来完成。(唯一一个不会出现OOM的内存区域。)
区域 | 是否线程共享 | 是否会内存溢出 | 是否需要GC |
程序计数器 | 否 | 不会 | 否 |
Java虚拟机栈 | 否 | 会 | 否 |
本地方法栈 | 否 | 会 | 否 |
堆 | 是 | 会 | 是 |
方法区 | 是 | 会 | 是 |
三、JVM
1、确定某个对象是否是“垃圾”:java中采用引用计数法和可达性分析来确定对象是否应该被回收。其中,引用计数法容易产生循环引用的问题,可达性分析通过“GC Roots”搜索算法来实现。
2、怎么回收(垃圾回收算法):常用的有标记清除,复制,标记整理和分代收集四种垃圾回收算法。