JVM学习笔记---内存管理和垃圾回收
JVM内存组成结构
JVM栈由堆、栈、本地方法栈、方法区等部分组成,结构图如下所示:
1)堆
所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:
- 新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
- 旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象
2)栈
每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果
3)本地方法栈
用于支持native方法的执行,存储了每个native方法调用的状态
4)方法区
存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值
垃圾回收机制
JVM分别对新生代和旧生代采用不同的垃圾回收机制
新生代的GC:
新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和From Space或To Space之间copy。新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代,
用java visualVM来查看,能明显观察到新生代满了后,会把对象转移到旧生代,然后清空继续装载,当旧生代也满了后,就会报outofmemory的异常,如下图所示:
在执行机制上JVM提供了串行GC(Serial GC)、并行回收GC(Parallel Scavenge)和并行GC(ParNew)
1)串行GC
在整个扫描和复制过程采用单线程的方式来进行,适用于单CPU、新生代空间较小及对暂停时间要求不是非常高的应用上,是client级别默认的GC方式,可以通过-XX:+UseSerialGC来强制指定
2)并行回收GC
在整个扫描和复制过程采用多线程的方式来进行,适用于多CPU、对暂停时间要求较短的应用上,是server级别默认采用的GC方式,可用-XX:+UseParallelGC来强制指定,用-XX:ParallelGCThreads=4来指定线程数
3)并行GC
与旧生代的并发GC配合使用
旧生代的GC:
旧生代与新生代不同,对象存活的时间比较长,比较稳定,因此采用标记(Mark)算法来进行回收,所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,总之就是要减少内存碎片带来的效率损耗。在执行机制上JVM提供了串行GC(Serial MSC)、并行GC(parallel MSC)和并发GC(CMS),具体算法细节还有待进一步深入研究。
以上各种GC机制是需要组合使用的,指定方式由下表所示:
指定方式 |
新生代GC方式 |
旧生代GC方式 |
-XX:+UseSerialGC |
串行GC |
串行GC |
-XX:+UseParallelGC |
并行回收GC |
并行GC |
-XX:+UseConeMarkSweepGC |
并行GC |
并发GC |
-XX:+UseParNewGC |
并行GC |
串行GC |
-XX:+UseParallelOldGC |
并行回收GC |
并行GC |
-XX:+ UseConeMarkSweepGC -XX:+UseParNewGC |
串行GC |
并发GC |
不支持的组合 |
1、-XX:+UseParNewGC -XX:+UseParallelOldGC 2、-XX:+UseParNewGC -XX:+UseSerialGC |
相关推荐
理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文将深入探讨JVM如何处理内存分配、垃圾检测与回收,以及具体的实现策略。 首先,垃圾回收机制的目标是自动识别并...
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文主要探讨了JVM如何处理内存分配、垃圾检测与回收,以及各种策略和性能指标。 首先,垃圾回收是JVM的一项核心...
Java虚拟机(JVM)内存管理和垃圾回收是Java应用程序高效运行的关键组成部分。JVM自动管理内存,通过垃圾回收机制来释放不再使用的对象所占据的空间,从而避免程序员手动管理内存可能导致的内存泄漏问题。 1. 垃圾...
Java 内存管理与垃圾回收是Java编程中至关重要的概念,它们确保了程序的稳定运行和内存的有效利用。Java在JVM(Java Virtual Machine)上运行,内存主要分为两个主要区域:栈(Stack)和堆(Heap)。 栈主要用于...
Go 语言的内存管理和垃圾回收机制,帮助读者理解如何在 Go 中高效管理内存。首先,文章介绍了 Go 语言的内存管理概述,包括栈和堆的内存分配及逃逸分析的重要性。栈内存分配效率高且生命周期明确,而堆内存需要通过...
Python内存管理是编程中至关重要的一个方面,它涉及到对象的创建、引用计数、垃圾回收以及内存池等机制。在Python中,所有对象都通过一个称为`refchain`的环状双向循环链表进行管理。这个链表包含了程序运行过程中...
本项目深入探讨了Java虚拟机(JVM)的内存管理和垃圾回收机制。通过详细的代码示例和理论分析,项目展示了JVM如何管理内存、加载类、执行垃圾回收,以及如何通过调优来优化JVM的性能。 ## 项目的主要特性和功能 1....
Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它们直接影响着程序的性能和稳定性。本文将详细解析JVM内存结构以及垃圾回收机制。 首先,JVM内存主要分为四个区域: 1. **堆(Heap)**:这是...
Python的内存管理机制主要包括引用计数、垃圾回收和内存池三个部分。 ##### 1. 引用计数 引用计数是一种基本且高效的内存管理方式。Python中的每个对象都有一个内部引用计数(`ob_refcnt`),用于跟踪有多少变量...
很久之前就一直在学习JVM,但是一直也没有好好的总结,最近终于有了空闲,将之前学习的内容整理成了一个PPT。 也希望大神们可以批评指正。 ppt中主要包含下面几部分: Java内存模型 ... 垃圾收集器
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
Java内存管理是Java开发中的核心话题,特别是对于大型和高性能应用而言,良好的内存管理和垃圾回收调优至关重要。本文将深入探讨Java内存结构、垃圾回收机制以及调优策略。 首先,Java内存主要分为堆内存和非堆内存...
总的来说,理解JVM内存管理和垃圾回收机制是每个Java开发者必备的知识,这能帮助我们编写出更高效、更健壮的应用程序,避免因内存问题导致的性能瓶颈和错误。通过深入学习这些概念,我们可以更好地优化代码,提高...
JVM内存管理和垃圾回收机制 JVM内存管理是Java虚拟机(JVM)中一个重要的组件,它负责管理Java应用程序在运行时所需的内存资源。 JVM内存管理主要包括堆、栈、本地方法栈、方法区四个部分。其中,堆是最重要的部分...
5. **垃圾回收和对象生命周期**: - AS3的垃圾回收机制会自动回收无引用的对象,但这可能会在大型项目中消耗大量CPU。 - 为加速回收,可以显式地将不再使用的对象设为NULL,尤其是removeChild后,同时移除事件监听...
垃圾回收机制是为了有效地管理内存,防止内存泄漏和内存溢出。在新生代,垃圾回收通常采用复制算法,将Eden区存活的对象复制到Survivor区,当Survivor区满时,再将存活对象移到老年代。老年代则使用标记-压缩算法,...