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

java虚拟机中内存划分哪些区域(java虚拟机的内存分配)

  • 内存
  • 2024-08-18 04:49:45
  • 1187

一、Java中内存分为几块你说的是JVM的内存空间。
当在方法(代码块)中定义变量时,Java会在堆栈上为该变量分配JVM空间。当变量超出范围时,Java会自动释放为该变量分配的JVM内存。存储空间;堆中分配的JVM内存由Java虚拟机的自动垃圾收集器管理。
JVM内存区域的组成
JVM内存分为四种类型:
1.堆栈段(stacksegment)——由编译器自动分配、释放和保存,函数参数值、局部变量值等在具体方法执行后确定。系统自动释放JVM内存资源
2.堆段(heapsegment)对象圈——一般是程序员新创建的分配和释放的对象和数组,JVM时不时地检查这个对象。如果没有对该对象的引用,则会回收该对象。
3.-存储全局变量、静态变量和字符串常量,不释放
4。代码段(码段)——存储程序中方法的二进制代码,多个对象共享一个代码空间区域
在方法(代码块)中,定义变量时,Java会分配JVM堆栈上变量的空间。当超出变量作用域时,Java会自动释放为该变量分配的JVM空间;堆中分配的JVM内存由虚拟机的自动垃圾收集器管理。堆的优点是可以动态分配JVM内存大小,并且不需要提前向编译器指定生存期,因为它是在运行时动态分配JVM内存的。缺点是JVM内存需要在运行时动态分配,访问速度慢,堆栈需要安全且不灵活。
◆Java堆由Perm区和Heap区组成。堆区由旧区和新区组成。和至区域。
堆分为两大块,一个是NEWGeneration,另一个是OldGeneration。在NewGeneration中,有一个称为Eden的空间,主要用于存储和存储新对象,还有两个SurvivorSpace(from、to)用于存储在任何垃圾回收中都存活下来的对象。OldGeneration主要存储应用程序中生命周期较长的JVM内存对象。还有PermanentGeneration,主要用于存储JVM自身的反射对象如类对象、方法对象等。
在NewGeneration块中,垃圾回收一般采用复制算法,速度快。在每次GC期间,幸存的对象首先从Eden复制到SurvivorSpace。当SurvivorSpace满了时,剩余的存活对象会直接复制到OldGeneration中。因此,每次GC之后,EdenJVM内存块都会被删除。在OldGeneration块中,垃圾回收一般采用Mark-Compact算法,速度较慢,但​​减少了JVM内存占用。
垃圾回收分为几个级别,0级为完整(complete)垃圾收集。OLD段的废物得到回收利用;1级或更高级别是部分垃圾回收,在OLD段或Perm段中的垃圾收集完毕后,只回收NEW段中的垃圾,没有JVM空间用于新的Java对象。
JVM调用GC的频率还是很高的。垃圾收集主要在两种情况下进行:当应用程序线程不足时,调用GC;如果JVM内存堆不足问题仍然存在,则报告内存不足错误。由于该异常取决于系统运行环境,因此无法预测何时会发生。
根据GC机制,程序的执行会引起系统运行环境的变化,从而增加GC触发的概率。为了避免这些问题,在设计和编写程序时应避免垃圾对象对JVM内存的消耗以及GC的开销。显式调用()只能表明JVM需要回收JVM内存中的垃圾对象,但这并不需要立即回收。其中之一是,这并不能解决JVM内存资源耗尽的情况,还会增加GC消耗。
◆当URL被非法访问时,JVM内存区域申请流程如下:
AJVM尝试在Eden中为相关Java初始化一块JVM内存区域-目的。
B.当Eden存储空间足够时,JVM存储申请将终止。否则,继续下一步。
尝试释放Eden中所有不活动的对象(这些属于第一级或更高级别的垃圾回收。释放后,Eden空间总是足够的,不会用完)然而)。丢弃新对象。然后尝试将Eden中的一些活动对象放入Survivor区。
DSurvivor区作为Eden和OLD存储空间之间的中间交换区,Survivor区中的对象被移动
E如果OLD区域没有足够的空间,JVM将在OLD中执行完全垃圾收集(级别0)
Q.完全垃圾回收后,如果Survivor和OLD区域仍然无法存储从Eden复制的一些对象,则JVM无法创建如果Eden区域有用于新对象的JVM内存区域,出现“内存不足错误”。
二、java内存溢出运行时数据区域Java内存溢出主要与虚拟机的运行时数据区有关。这些池包括程序计数器、虚拟机堆栈、本地方法堆栈、Java堆和常量池。
1.1程序计数器(PC)是线程私有的,用于跟踪当前正在执行的字节码行数。即使内存不够,也不会因为内存小而造成溢出。独立。
1.2专用于线程的虚拟机堆栈。它为每个方法执行分配堆栈帧并存储局部变量表、操作堆栈和其他信息。当堆栈溢出(StackOverflowError)或无法分配空间(OutOfMemoryError)时,就会出现该问题。局部变量表可以存储基本数据类型和对象引用。
1.3本地方法栈与虚拟机栈具有相同的功能。它用于执行本地方法。当容量不足时,也会导致内存溢出。
1.4Java堆是分配所有对象和数组实例的最大内存部分。随着技术的进步,Java堆不再完全占用内存,但是内存分配仍然需要关注。如果无法缩放,则会出现错误“Javaheapspace”。
1.5方法区(或永久代)存储类信息、常量和编译后的代码。当内存不足时,会出现“PermGenspace”错误。但现代虚拟机已将其与堆合并,使管理更加灵活。
1.6运行时常量池存储类文件的常量和符号引用,动态添加是它的特点,比如通过intern(method)。当容量不足时,也可能会出现内存溢出的情况。
1.7NIO中用于通道和缓冲区的直接内存(非Java运行时数据区域)。它不受Java堆的限制,但会受到系统总内存的限制。当容量不足时,它也会导致问题。