在JVM中,内存主要被分为5类
堆
Heap
存放关键字
new
创建的对象和数组。
堆内存被所有线程共享。
这块内存区由
JVM
(Java虚拟机)自己管理。当使用new创建对象时,不必指定分配空间的大小,
JVM
会动态自动分配一块区域;在程序执行过程中,没有指向此对象的引用时,此对象就被标记为可被回收状态,将由
GC
(垃圾回收器)在一个不确定的时间自动回收,释放所占的内存空间。小编推荐一个学Java的学习裙【二零二,二五零,一九四】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有很多干货和技术分享!
虚拟机栈
VM Stack
存放8种基本类型的数据和对象引用(不是对象)。
每个线程有自己的单独的栈。
先进后出,后进先出。
因为主要存放基本类型数据变量,所以分配空间比堆快。当超出变量的作用域,将由编译器立即释放空间。
本地方法栈
Native Method Stack
程序调用本地方法的内存区域。
程序计数器
Program Counter Register
一块较小的内存空间,可看作是当前线程所执行的字节码的 行号指示器。
通过改变计数器的值来选取下一条需要执行的字节码指令。(分支、循环、跳转、异常处理、线程恢复等)基础功能都依赖与其完成。
特点:
线程私有:因为 Java 虚拟机的多线程是通过 线程轮流切换 并 分配处理器执行时间 来实现的,在某一时刻,只会执行一条线程。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器。
无内存溢出:如果线程正在执行的是一个 Java 方法,这个计数器记录的是正在 执行的虚拟机字节码指令的地址;如果正在执行的是 Native 方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在 Java 虚拟机程序规范中没有规定任何 OutOfMemoryError 情况的区域。
方法区
Method Area
跟堆一样,被所有的线程共享。
是一个内存逻辑区域,是
JVM
在装载类文件时,用于存储类型信息(类的描述信息):
运行时常量池:在方法区中,每个类型都对应一个常量池,存放该类型所用到的所有常量,常量池中存储了诸如文字字符串、final变量值、类名和方法名常量。它们以数组形式通过索引被访问,是外部调用与类联系及类型对象化的桥梁。(存的可能是个普通的字符串,然后经过常量池解析,则变成指向某个类的引用)
字段信息:字段信息存放类中声明的每一个字段的信息,包括字段的名、类型、修饰符。
字段名称指的是类或接口的实例变量或类变量,字段的描述符是一个指示字段的类型的字符串,如private A a=null;则a为字段名,A为描述符,private为修饰符。
方法信息:类中声明的每一个方法的信息,包括方法名、返回值类型、参数类型、修饰符、异常、方法的字节码。
(在编译的时候,就已经将方法的局部变量、操作数栈大小等确定并存放在字节码中,在装载的时候,随着类一起装入方法区。)
静态成员变量:类中的静态成员变量和静态代码块。
到类classloader的引用:到该类的类装载器的引用。
到类class的引用:虚拟机为每一个被装载的类型创建一个class实例,用来代表这个被装载的类。
每个类的全限定名
每个类的直接超类的全限定名(可约束类型转换)
该类是类还是接口
该类型的访问修饰符
直接超接口的全限定名的有序列表
类的基本信息:
已装载类的详细信息:
领取专属 10元无门槛券
私享最新 技术干货