wordpress searchform,成都网站排名优化,如何用手机制作app,域名注册查询批量文章目录 一、JVM内存结构二、常见垃圾回收算法1. 标记-清除算法(Mark-Sweep Algorithm)2. 标记-整理算法(Mark-Compact Algorithm)3. 复制算法(Copying Algorithm)4. 分代收集算法(Generational Collection)5. 增量收集算法(Incremental Collection)6. 并行收集算法… 文章目录 一、JVM内存结构二、常见垃圾回收算法1. 标记-清除算法(Mark-Sweep Algorithm)2. 标记-整理算法(Mark-Compact Algorithm)3. 复制算法(Copying Algorithm)4. 分代收集算法(Generational Collection)5. 增量收集算法(Incremental Collection)6. 并行收集算法(Parallel Collection)7. 并发收集算法(Concurrent Collection)8. 压缩算法(Compacting Algorithm)9. 选择性复制算法(Selective Copying Algorithm) 三、常见的垃圾回收器1. Serial Collector2. Parallel Collector3. Concurrent Mark Sweep (CMS) Collector4. Garbage First (G1) Collector5. ZGC (Z Garbage Collector)6. Shenandoah Collector7. Epsilon Collector特定版本的垃圾收集器配置选项选择垃圾收集器总结 四、垃圾回收的时机总结 一、JVM内存结构
Java虚拟机(JVM)的内存结构主要分为几个不同的区域,每个区域都有其特定的目的和功能。以下是JVM内存结构的主要组成部分:
先看一下总体的结构图 程序计数器(Program Counter Register) 这是一个较小的内存块,用于存储当前线程所执行的字节码指令的地址。每个线程都有一个独立的程序计数器。如果当前线程正在执行的是本地(native)方法,则该计数器的值为空(Undefined)。 Java虚拟机栈(Java Virtual Machine Stack) 也是线程私有的,它的生命周期与线程相同。描述的是Java方法执行的内存模型:每个方法被执行的时候都会创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。当线程请求的栈深度大于虚拟机所允许的最大深度时,将会抛出 StackOverflowError。若JVM栈可以动态扩展,当栈扩展时无法申请到足够的内存时会抛出 OutOfMemoryError。 本地方法栈(Native Method Stack) 与虚拟机栈类似,但是它为虚拟机使用到的Native方法服务。在HotSpot虚拟机中,本地方法栈和Java虚拟机栈合二为一。本地方法栈同样也会抛出 StackOverflowError 和 OutOfMemoryError。 Java堆(Java Heap) Java堆是JVM所管理的内存中最大的一块,几乎所有的对象实例都在这里分配内存。堆是所有线程共享的一块内存区域,在虚拟机启动时创建。对象的创建、数组的创建都在堆上分配。堆的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可;实现可以选择固定大小或者可扩展的方式实现。如果在堆中没有内存完成实例分配,并且也无法再扩展时,将会抛出 OutOfMemoryError。以下是堆区分代结构图: 方法区(Method Area) 方法区也称为非堆区,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。它是线程共享的区域。HotSpot虚拟机中,通常把这部分称为“永久代”(Permanent Generation),但JDK 8之后,已经被元空间(MetaSpace)取代,永久代被移除。如果方法区无法满足新的内存分配需求时,将抛出 OutOfMemoryError。 运行时常量池(Runtime Constant Pool) 是方法区的一部分,Class文件中的常量池表被放到这个区域中。运行时常量池中包含了各种字面量和符号引用,这部分内容将在类加载后存放在方法区的运行时常量池中。 直接内存(Direct Memory) 不属于JVM自动内存管理的范围,它是通过 java.nio.ByteBuffer.allocateDirect() 方法分配的内存。直接内存的分配不会受到Java堆大小的限制,但是会受到本机总内存大小以及系统其他内存开销的限制。如果本机内存不够或者无法申请到足够的直接内