`

Java内存管理基础篇 - Java内存回收-常见的垃圾回收策略

阅读更多

Java的内存使用完之后,是通过JVM的GC进行回收的。


1 概述

 

垃圾收集的目的在于清除不再使用的对象。gc通过确定对象是否被活动对象引用来确定是否收集该对象。gc首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。

 

1.1引用计数(Reference Counting)

 

通过引用的次数来判断对象是否需要被回收。因为在循环引用时,容易出问题,因此在较新的JVM中被抛弃,这种策略只是在早期的JVM中使用过。

 

由下图可以看出,

Interger P = new Integer(); Integer对象的引用计数为1.

p=q;refCount加一=2;

 


 

缺点,无法解决循环引用的问题:

 


 

1.2. 对象引用遍历

 

对象引用遍历 指的是从一个根集出发,遍历对象图,跟踪可达到对象,并进行标记(mark),然后对不可达到对象进行清除。

这里的根集是指正在执行的Java程式能访问的引用变量的集合(包括局部变量、参数、类变量)

 

 


 

参考文献:

 

http://www.brpreiss.com/books/opus5/html/page423.html

 

2.几种垃圾回收机制

  2.1.标记-清除收集器

  这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。

  2.2.标记-压缩收集器

  有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。

  2.3.复制收集器

  这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,jvm生成的新对象则放在另一半空间中。gc运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。

  2.4.增量收集器

  增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。

  2.5.分代收集器

  这种收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法以优化性能。

  2.6.并发收集器

  并发收集器与应用程序同时运行。这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低。

  2.7.并行收集器

  并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性。

 


  • 大小: 1.5 KB
  • 大小: 3.3 KB
  • 大小: 11.5 KB
分享到:
评论

相关推荐

    java基础篇——java的起源与演变

    Java 的跨平台原理: Java 源代码---编译--->java 字节码(可跨平台) ---运行--->JVM(java 虚拟机)→Windows,Linux 等平台。JVM 屏蔽了底层运行平台的差别,实现了“以此编译,随处运行”。 垃圾回收器: 不...

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx ...

    Java内存管理的一些小疑问

     一直以来都在接受一个论调:在Java的内存管理中,基础类型变量保存在栈中,对象类型保存在堆中。  这其实是一个很粗的论调,会引起很多错误的理解。  这篇博客的产出,仅是因为脑子里偶然间冒出来的一个问题...

    Java虚拟机内存优化实践

    众所周知,Java是从C++的基础上发展而来的,而C++程序的很大的一个问题是内存泄露难以解决,尽管Java的JVM有一套自己的垃圾回收机制来回收内存,在许多情况下并不需要java程序开发人员操太多的心,但也是存在泄露...

    java8集合源码分析-toBeTopJavaArchitect:Java架构师--成神之路

    基础篇 集合容器 数据结构 常用算法 JDK演变 I/O机制 网络协议 第二章 进阶篇 类加载 JVM 垃圾回收 线程 线程池 锁 高并发 第三章 中间件篇 缓存 远程调用 消息队列 任务调序 搜索引擎 分布式锁 监控 日志监控 限流&...

    JVM自动内存管理机制

    Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...

    互联网Java面试训练营.rar

    13. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题 14. 2020年大厂Java面试前复习的正确姿势(800+面试题附答案解析) 15. 大白话聊聊Java并发面试问题之Java 8如何优化CAS性能...

    99乘法表java源码-roadmap:路线图

    Java内存模型,Java内存管理,Java堆和栈,垃圾回收 1.1.2. 了解JVM各种参数及调优 1.1.3. 学习使用Java工具 jps, jstack, jmap, jconsole, jinfo, jhat, javap, … 1.1.4. 学习Java诊断工具 1.1.5. 自己编写各种out...

    Java大数据培训学校全套教程--继承

    Class,java的垃圾回收与内存泄露的关系,数据封装类,Math?类等相关概念,让大家对继承编程?打下好的基础 课程特色:专业细致,偏案例,理论强,多作业。 课程软件使用:最好为myeclipse6.01,因为可以省去安装jdk了...

    Java经典入门教程pdf完整版

    括了Java运行坏境,一系刎Java开发工具和Java基础的类库。目前主流的JDK是Sun公 同发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JD,例如IBM公司开 发的JD,BA公司的 Jrocket,还有GN组织丌发的JDK等等。 ...

    JavaFamily:【Java面试+Java学习指南】 一份涵盖大部分Java程序员所需要掌握的核心知识

    Java基础核心串讲 Java基础知识 计算机操作系统与Linux 计算机网络 HTTP TCP/IP 7种常见的设计模式和使用场景 Java必会基础与新版本特性 集合框架 HashMap ConcurrentHashMap ArrayList Vector 深入浅出JVM JVM内存...

    java范例开发大全源代码

     第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6...

    java范例开发大全

    第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    Java范例开发大全 (源程序)

     第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5 算术运算符 12  实例6 关系...

    Java范例开发大全(全书源程序)

    第2章 Java基础类型与运算符 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑运算符 14 实例8 位运算符 15 实例...

    java范例开发大全(pdf&源码)

    第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 关系运算符 13 实例7 逻辑...

    Android移动应用开发(第3版)卷Ⅰ基础篇 (Shane Conder, Lauren Darcey) PDF扫描版

    《Android移动应用开发(第3版)卷Ⅰ:基础篇》涵盖了作者数年来在移动开发领域所积累的经验,以及成功进行移动项目开发所需的全部概念和实用技术,包括移动开发过程与传统软件开发的区别,还包括帮助你节约宝贵时间和...

    Android系统源代码情景分析-罗升阳-源码

    6.1.6 匿名共享内存块的回收过程 6.2 运行时库cutils的匿名共享内存访问接口 6.3 匿名共享内存的C++访问接口 6.3.1 MemoryHeapBase 6.3.2 MemoryBase 6.3.3 应用实例 6.4 匿名共享内存的Java访问接口 6.4.1 ...

    看了这篇虚拟机 GC,可以跟面试官扯半天

    2:JAVA开发的系统更加健壮,避免因为垃圾忘记回收导致内存溢出。 2 什么是垃圾 方法执行完后,方法内定义的变量以及对象。 for , each while 执行完当前轮循后, 循环里定义的变量以及对象。 if 执行完后,if内部...

Global site tag (gtag.js) - Google Analytics