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

jvm内存模型与垃圾回收

  • 内存
  • 2024-08-29 14:24:54
  • 3716

一、JVM基础和内存区域剖析

概念

特点

先进后出

虚拟机堆栈:用户定义的Java方法执行的内存模型

栈框架:虚拟机栈的栈元素(用于支持虚拟机的方法调用和方法执行的数据结构)包括局部变量表、操作数栈、动态链接、方法出口

1主存储:

2数据过多会导致OutOfMemoryError异常

=JDK1.8

。和永久代的区别:

1.永久代在物理上是堆的一部分;

2.存储内容不同。元空间存储类、静态变量和常量组的元信息合并到堆中;

3代分为堆和元空间

直接内存:避免来回复制本机空间和Java堆之间

虚拟机启动时创建,用于存储对象实例所有对象(包括常量池)都在堆上分配内存,当对象无法在此空间申请内存时,将抛出OutOfMemoryError异常。它也是垃圾收集器管理的主要区域。最大和最小堆可以分别通过参数-Xmx–Xms指定

GC主管理区,最大和最小值可以通过-Xmx和Xms指定,或者-XX:NewSize-XX:MaxNewSize指定年轻代初始大小

超过空间大小会抛出OutOfMemoryError异常

新建区域

新建区域分为两个组成部分:伊甸空间(Edenspace)和幸存者空间

EdenRoom

大部分物品都会在EdenRoom中诞生,如果一段时间不使用就会被GC回收

幸存者空间(survivorspace)

已经使用一段时间的对象会进入幸存者空间,回收无用的对象,用于延长对象的生命周期物体。

养老区(oldFullGC)

经过几次GC后仍然存在的对象将被移至养老区,如果养老区也满了,则进行一次MajorGC(FullGC)将被移动。会产生旧站点执行内存清理(STW),如果旧站点运行FullGC,发现仍然无法对对象报错,就会出现OOM异常“OutOfMemoryError”。

问题:空间不连续,浪费空间

复制算法有两个相同大小的空间,当对象在使用时,可用的对象被移动到复制算法连续的to区域

问题:使用了两块空间,所以内存中的模型from和to很小

它只使用了一块空间,先标记无用的对象,然后组织内存空间地址,最后删除它们

它只有一个GC线程,正如前面提到的,它在运行时必须暂停用户程序(stoptheworld)STW

它有多个GC线程,并且它还必须在暂停(stoptheworld)STW上暂停用户程序

有一个或多个GC线程,并且它必须在某些阶段暂停用户程序(stoptheworld),并运行它在某些阶段与用户程序并发

serial(用于新生代,使用复制算法),serialold(用于老年代,使用标记/排序算法)

parNew(对于新生代,使用复制算法),Parallel

Scavenge(对于新生代,使用复制算法),Parallel

old(对于新生代,使用复制算法)老年代,使用mark/sweep算法)

concurrentmarksweep[CMS](老年代使用,使用mark/sweep算法)


二、什么是Java的JVM?

Java的JVM(JavaVirtualMachine)是Java程序运行的平台,它负责加载和执行Java字节码程序以及管理内存和垃圾收集等运行时功能。JVM是JavaSE架构的重要组成部分,不同的JVM实现不同的Java规范。

JVM的主要组件包括:

Java虚拟机(JavaVirtualMachine):它是类加载器,字节码解释器;JVM的核心,包括垃圾收集器等组件。

Java内存模型(JavaMemoryModel):定义了Java中不同线程之间存储和读取变量的规则。

Java指令集(JavaInstructionSet):类型;定义了Java语言的指令集,包括操作码等。

JVM通过解释器将Java字节码程序编译为本地代码并加载到内存中执行。JVM通过垃圾回收来保证Java程序的稳定运行。它还负责内存管理和其他功能。所以,Java程序的性能和稳定性高度依赖于JVM的性能和优化。


三、有垃圾回收机制为什么会出现内存溢出你没有开启自动回收!