当前位置:首页 > 内存 > 正文

jvm内存分几部分

  • 内存
  • 2024-04-23 18:46:49
  • 5197

一、重新理解jvm运行时的内存分布(堆栈方法区交互)栈的方法区之间的交互关系
Java栈中存储的局部变量表包括八种数据类型和引用类型,引用类型指向对象的地址,它存储在引用,它指向Java堆和对象类型数据变量名、变量类型、变量值等。将被保存,并且这些将被存储在方法区中以供显示(在初始化期间)。
对象实例(s1)会存储在Java栈中,但是对象实例中的具体数据会通过Java栈中的引用和里面存储的是对象实例数据(实例名称、实例相关类型、元数据信息...)以及静态变量、常量、类加载后的信息等。当运行时需要时,将从方法区检索它们。堆都是共享的。Java堆栈由线程独有的数据(包括程序计数器、本地方法堆栈)组成。
一个jvm实例只有一块堆内存,并且堆内存的大小是可以调整的。类加载器读取类文件后,需要将类、方法和常量放入堆内存中,并保存所有引用类型的实际信息,以方便执行器执行。堆内存分为三部分。
(退休区就是老年代)
堆内存逻辑上分为三部分:新生代+退休区+方法区
eden+survivor+空间(元空间或方法区或Perm)
Perm永久存储区是常驻内存区域,用于存储jdk本身携带的Class和Interface元数据,加载到该区域中。该区域中的数据不会被垃圾收集器回收。该区域占用的内存只有在jvm关闭后才会被释放。
如果看到OutOfMemoryReeor:PermGenspace,则说明Java虚机堆永久Perm内存设置不够。出现这种情况有一半是因为程序开始加载大量第三方jar,速度慢。
对于HotSpot虚拟机,很多开发者习惯调用永久代区方法(Parmenent
Gen永久代是这是错误的方法区的一个实现,在jdk7中,原来放在永久代中的字符串常量池已经被移动了。>常量池(ConstantPoolConstantPoolConstantPoolConstantPoolConstantPool)是方法区的一部分,ClassClass文件中除了类的版本、字段方法、接口等描述信息外,还有加载类后会添加的常量池内容。/>
EdenPark,所有对象都会被原样放置在这里
对象有两种类型:
1如果是大对象,则分配。直接到老区。
2.如果禁用转义解析,它将在堆栈上分配。
如果以上两种情况都不满足,他将被安置在伊甸园公园。(伊甸园区域)
查看java7中的图像:
对比java8
二、哪些内存区域属于jvm规范JVM规范定义的内存区域如下:
1.程序计数器(ProgramCounterRegister):用于记录线程执行的指令的地址,用于选择线程执行的下一条指令。
2.虚拟机栈:每个方法执行时都会创建一个栈帧,用于存储局部变量表、操作数栈、常量池引用等。
MethodStack:类似于虚拟机栈,用于加载本地方法。
4.堆:存储对象实例和数组,Java堆空间管理器负责内存分配和回收。
Memory:JVM可以直接访问和操作的内存区域,主要用于快速的数据传输和交换。
6.方法区:存放类信息、常量、静态变量以及虚拟机加载的其他数据。
以上区域构成了JVM规范定义的内存布局。这可能会因JVM实现而异,但通常遵循以下规范: