对JVM的理解

对jvm的理解,

每一个Java虚拟机都由一个类加载器子系统,负责加载程序中的类型(类和接口),并赋予唯一的名字,每一个Java虚拟机都有一个执行引擎,负责执行被加载类中包含的指令。JVM的两种类装载起包括:启动类装载和用户自定义类装载器启动类装载器是JVM实现的一部分,用户自定义类装载器则是Java程序的一部分,必须是ClassLoader类的子类。```

运行时数据区:主要包括:方法区,堆,Java栈,PC寄存器,本地方法栈
JVM 内存模块划分
1. 方法区
> 被所有方法线程共享的一块内存区域。用于存储已经被虚拟机加载的类信息,常量,静态变量等,这个区域的内存回收目标主要针对常量池的回收和堆类型的卸载。
2. 虚拟机栈
> java 虚拟栈也是私有的,每个方法在执行的时候也会创建一个栈帧,存储了局部变量,操作数, 动态链接,方法返回地址。每个方法从调用到执行完毕,对应一个帧在虚拟机栈中的入栈和出栈。
> 所以通常所说的的栈,一般是指在虚拟机栈中的局部变量部分。局部变量所需要的内存在编译期间完成分配,如果线程请求的栈深度大于虚拟机所允许的深度,则StackOverFlowError。
> 如果虚拟机长可以动态扩展,扩展到无法申请足够的内存,则OutOfMemoryError。
3. 本地方法栈(线程私有)
> 和虚拟机栈类似,主要虚拟机使用到的Native方法服务。也会抛出StackOverFlowError和OutOfMemoryError
4. 堆
> 被所有线程共享的一块内存区域,在虚拟机启动的时候创建,用于存放对象实例。对可以按照可扩展来实现(通过-Xmx和Xms来控制)当对中没有内存克分配给实例,也无法在扩展时,则抛出OutOfMemoryError异常。
5. 程序计数器(线程私有)
> 程序计数器是当前线程锁执行行字节码的行号治时期,每条线程都有一个独立的线程计数器,这类内存也称为”线程私有“的内存。正在执行java的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果是Native方法,则为空。

你可能感兴趣的:(对JVM的理解)