JVM---内存管理

JVM是一种用于计算设备的规范,他是一个虚构的计算机。是通过在实际的计算机上的仿真模拟各种计算机的功能来实现的。
引入java虚拟机后,java语言在不同的平台上运行时不需要重新编译,运行字节码即可。

五大内存区域
1、方法区

(1)所有线程共享的内存区域
(2)用于存储已被虚拟机加载的类信息、常量、静态常量等。如:被static修饰的常量
(3)方法区中的信息来源于类装载子系统,其加载class信息
(4)这个区域的内存回收目标主要针对于常量池的回收和堆类型的卸载

2、Java堆

(1)是所有线程共享的内存区域
(2)堆在JVM启动的时候会创建,用来存放所有的java对象实例,包括全局变量、属性类的成员变量
(3)java堆可以存在物理上不连续的内存空间

3、Java栈(虚拟机栈)

(1)每一个线程都有一个私有的java栈
(2)在线程被创建的时候被创建,其中保管着帧信息(局部变量、方法参数、方法出口等)
(3)每一个方法从方法调用到执行完成的过程,都对应着一个栈帧在java栈中入栈到出栈的过程
(4)通常所说的栈,一般是指在虚拟机栈中的局部变量部分

4、本地方法栈

(1)是线程私有的
(2)本地方法栈为虚拟机使用的native服务,可能底层调用c或c++

5、程序计数器

(1)是线程私有的
(2)是一块很小的内存空间,可以作为当前线程的信号指示器,也叫指令计数器
(3)如果当前线程执行一个java方法,则程序计数器记录了正在执行的java字节码地址;如果正在执行一个本地方法(native底层方法),那么计数器为空


为什么需要一个程序计数器?

(1)对单核CPU来说,每个时刻只能有一个线程处于运行状态,直到当前线程执行完或者被挂起,让出CPU资源后,才能轮到下一个线程进来运行
(2)如果是多核CPU,是可以同时跑多线程的,线程之间也互不相干。当线程数量大于CPU数量时,也会和单核CPU一样进行一个轮询切换来分配资源。为了确保线程切换后能够恢复正常的位置继续执行,每个线程都要有自己的程序计数器

你可能感兴趣的:(八股文,JVM)