`
红尘star
  • 浏览: 4609 次
社区版块
存档分类
最新评论

JVM学习笔记(三)------内存管理和垃圾回收

    博客分类:
  • java
阅读更多

转载自:http://blog.csdn.net/cutesource/article/details/5906705

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学习笔记

    JVM学习笔记(一)--------基本结构 JVM学习笔记(二)----java代码编译和执行的整个过程 JVM学习笔记(三)---------内存管理和垃圾回收 JVM学习笔记(四)------内存调优

    jvm内存和垃圾回收.xmind

    自己总结的jvm中内存和垃圾回收的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。适合jvm的爱好者和学习者

    jvm学习笔记(jvm内存模型&垃圾收集算法&类加载机制)

    在JVM的学习中,理解其内存模型、垃圾收集算法以及类加载机制至关重要。 1. **JVM内存模型** - **方法区**:也称为“永久代”,存储虚拟机加载的类信息、常量、静态变量等,是线程共享的区域。在Java 8之后,这...

    Java分布式应用学习笔记-谈JVM.doc

    同时,JVM包含一个垃圾回收器,负责监控和回收内存资源。 **3. JVM编译Java代码** Java SDK中的javac编译器将.java源代码转化为.class字节码。这个过程包括: 1. 分析输入到符号表,构建抽象语法树。 2. 处理注解...

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...

    JVM三期(更新到第五节)笔记.pdf

    3. **垃圾回收**:JVM负责自动管理内存,通过垃圾收集器(如Serial、Parallel、CMS、G1、ZGC等)来回收不再使用的对象,防止内存泄漏。垃圾回收策略包括分代收集、引用计数、可达性分析等。 4. **执行引擎**:JVM的...

    java7rt.jar源码-Java_JVM:这是我的JavaJVM学习笔记

    一:上篇——内存与垃圾回收器 二:中篇——字节码与类的加载 三:下篇——性能监控与调优篇 一: 上篇——内存与垃圾回收器 架构: jvm依赖的架构: 栈架构/寄存器架构 栈架构 JVM的生命周期: 1.启动 通过引导类加载...

    java基础(超详细。。学习笔记) 公司内部资料!保密哦!!!

    垃圾回收是Java的一项重要机制,它自动管理内存,避免了程序员手动释放内存可能导致的问题。当一个对象不再被引用时,垃圾收集器会回收其占用的内存空间。Java虚拟机通过有向图算法跟踪对象的引用关系,确定哪些对象...

    corejava学习笔记

    5. **内存垃圾回收机制(GC)** - GC是Java自动管理内存的一种机制,它负责回收不再使用的对象所占用的内存,避免内存泄露。 6. **集成开发环境(IDE)** - IDE如Eclipse、IntelliJ IDEA等,提供了代码编辑、调试...

    JAVA 学习笔记

    JAVA学习笔记涵盖了从环境配置到Java运行过程,再...总结来说,JAVA学习笔记包含了Java开发的基础环境配置、程序运行流程、内存管理、安全机制以及源代码的编写和编译执行。这些知识点对于初学者理解Java编程至关重要。

    Jack_《JVM从入门到入魔》笔记.pdf

    4. **垃圾回收(GC)**:深入理解垃圾收集的工作原理,包括GC算法(如标记-清除、复制、标记-整理、分代收集等)以及GC调优。 5. **性能优化**:学习JVM参数设置,进行性能监控和调优,例如通过JVisualVM、...

    Java相关课程系列笔记之一Java学习笔记.doc

    - 垃圾回收:Java自动进行内存管理,程序员无需手动释放内存。 - 并发性:Java提供了丰富的并发工具和API,方便开发多线程程序。 1.3 Java开发环境 Java开发通常需要JDK(Java Development Kit),包括Java编译器...

    java基础相关学习笔记

    同时,Java引入了自动内存管理,即垃圾回收机制,减轻了程序员管理内存的负担。 - **面向对象**:Java完全基于面向对象编程,支持类、接口、继承、封装和多态等概念,使得代码组织更加有序,易于维护和重用。 2. *...

    java基础学习知识笔记

    - **JVM(Java Virtual Machine)**:是Java程序的运行平台,负责解释执行字节码,并提供内存管理、垃圾回收等服务。 4. **JDK跨平台原理**:Java的“一次编写,到处运行”特性得益于JVM。源代码被编译成与平台...

    java学习笔记(corejava)部分.pdf

    在Java学习中,基础是非常关键的部分,包括语法、类的继承、垃圾回收机制、开发环境的配置等。 1. **Java源码与编译**: Java语言的源代码是通过`javac`编译器转化为`.class`字节码文件的。这些字节码文件随后由...

    java学习笔记

    15. **内存管理和垃圾回收**:Java的自动内存管理机制包括堆和栈内存,以及垃圾回收机制,开发者无需手动释放内存。 除了Java语言本身,你提到的CMD命令是Windows系统的命令行工具,用于执行各种系统级任务。例如,...

    关于学习笔记整理,包括Linux、Java、数据结构和算法,和一些IT工具的使用.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java学习笔记(详细)

    Java是一种广泛使用的高级编程语言,以其跨平台的可移植性、面向对象的特性以及自动垃圾回收等优点而受到青睐。本篇将详细讲解Java的基础知识,包括Java的环境配置、面向对象的概念、基础数据类型以及方法的使用。 ...

    java学习资料之Java笔记

    JVM还包含了垃圾回收机制,自动管理内存,避免了内存泄露问题。 1. **JAVA目录** 了解Java开发环境的目录结构至关重要。通常包括src目录存放源代码,bin目录存放编译后的类文件,lib目录包含必要的库文件,而项目...

Global site tag (gtag.js) - Google Analytics