`

java虚拟机学习笔记之垃圾收集(上)

阅读更多

java程序是运行在java虚拟机当中的,在java虚拟机的堆中运行着程序所创建的对象。可以使用new,newarray,anewarray,multianewarray指令来创建对象,但是没有明确的代码来释放这些对象所使用的空间。垃圾收集就是自动释放不在被程序使用的对象的过程。为了能够无限制的使用内存,大部分的java虚拟机都附带有垃圾收集堆。

★为什么使用使用垃圾收集

垃圾收集,也就是把程序中不需要的对象作为“垃圾”进行回收,以精确,新鲜的说法就是“内存回收”。当一个对象不再被程序引用的时候,所使用的堆空间可以被回收,以便后续创建的新的对象使用。垃圾收集器必须能断定哪些对象是不再被引用的,并且能够把它们所占据的堆空间释放出来。在释放不再被引用的对象的过程中,垃圾收集器运行将要被释放对象的终结方法----finalizer

除此之外,垃圾收集器还要处理堆碎块。堆碎块是在正常的程序运行过程中产生的。新的对象分配了空间,不再被引用的对象被释放,所以堆内存的空闲位置介于活动对象之间。请求分配新对象时可能不得不增大堆空间放得下新的对象。在一个虚拟的内存系统中,增长堆所需要的额外空间会影响运行程序的性能。在内存较小的嵌入式系统中,碎块导致虚拟机产生不必要的“内存不足”错误。

将以上这种工作交给java虚拟机有几个好处:

1.可以提高生产效率。在一个不具有垃圾收集机制的语言下编程,可能要花很多的时间来解决难以捉摸的内存问题。使用java,恰恰可以充分的,有效的利用这些时间。

2.可以保持程序的完整性。垃圾收集是java安全策略的一个重要的部分。

存在的缺陷:

加大了程序的负担,可能影响程序的性能。java虚拟机必须追踪哪些对象被正在执行的程序所使用,并且动态的终结释放不再被使用的对象。和明确释放不再被使用的内存比起来,这个活动需要更多的CPU时间。并且,在垃圾收集环境下,程序员对安排CPU时间来释放无用的对象缺乏控制。

★垃圾收集算法

任何垃圾收集算法必须做的两件事情:

1.必须检测出垃圾对象

2.必须回收垃圾对象所使用的堆空间并还给程序

垃圾检测通常建立一个根对象的集合并且检查从这些根对象开始的可触及性来实现。如果正在执行的程序可以访问到的根对象和某个对象之间存在引用路径,这个对象就是可触及的。对于程序来说,根对象总是可以访问的。从这些根对象开始,任何可以被触及的对象都被认为是“活动”的对象。无法触及的对象被认为是垃圾,因为它们不再影响程序的未来执行。

根对象来源:

1.包含局部变量中的对象引用和栈帧的操作数栈。

2.被加载的类的常量池中的对象引用,比如字符串

3.潜在的来源,java虚拟机运行时数据区中从垃圾收集器的堆中分配的部分。

区分活动的对象和垃圾的两个基本方法是引用计数和跟踪。引用计数垃圾收集器通过为堆中的每个对象保存一个计数来区分活动对象和垃圾对象。这个计数记录下了对那个对象的引用的次数。跟踪垃圾收集器实际上追踪从根节点开始的引用图。在追踪中遇上的对象以某种方式打上标记,当追踪结束时,没有被打上标记的对象就被判定是不可触及的,可以被当做垃圾收集。

在编程中寻找快乐,在快乐中自由编程!!!

分享到:
评论

相关推荐

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

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

    java虚拟机学习笔记之垃圾收集

    总之,Java虚拟机的垃圾收集机制是其内存管理的核心,它自动化地处理了内存的分配和释放,为开发者提供了便利,同时也带来了性能和复杂性的挑战。理解垃圾收集的工作原理和各种算法对于优化Java应用程序的性能至关...

    java虚拟机学习笔记进阶篇

    本篇文章将深入探讨Java虚拟机中的垃圾收集器(GC)及其对内存管理的影响。 1. 垃圾收集器的由来与作用 垃圾收集器的引入主要是为了解决内存管理的问题。在没有GC的情况下,程序员需要手动释放不再使用的对象,这...

    学习笔记之java虚拟机

    ### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...

    学习笔记:深入浅出 Java 虚拟机.docx

    JVM 不仅执行字节码,还负责垃圾收集、内存管理等任务,确保Java程序的高效运行。 与C++等编译型语言不同,Java 程序不直接生成操作系统可执行文件。Java 源代码先由javac编译器转化为字节码,然后由JVM 解释执行。...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

    JVM 学习笔记(Java虚拟机)

    **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

    Java JDK 7学习笔记 PDF

    12. **垃圾收集优化**:JDK 7在垃圾回收机制上也有所改进,如G1垃圾收集器的引入,提供了一种可预测停顿时间的内存管理策略。 这些是Java JDK 7中一些关键的更新和改进,对于开发者来说,理解和掌握这些知识点对于...

    Java学习笔记_垃圾回收

    2. 垃圾回收器:Java虚拟机(JVM)包含一个或多个垃圾回收器,它们负责监测和回收不再使用的对象所占的内存。 二、垃圾回收的工作原理 1. 引用计数法:早期的垃圾收集算法,通过计算对象的引用次数来判断是否需要...

    JVM:深入理解Java虚拟机 - 学习笔记

    《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...

    良葛格java学习笔记

    8. **JVM原理**:简要介绍Java虚拟机的工作原理,包括内存模型、类加载机制、垃圾收集器和调优策略。 9. **网络编程**:涉及Socket编程,讲解如何建立客户端和服务端通信,以及套接字和服务器套接字的使用。 10. *...

    java虚拟机源码学习-UnderstandingTheJVM:深入理解Java虚拟机(周志明)源码及学习笔记

    《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...

    理解虚拟机--有笔记版

    本文主要关注的是Java虚拟机(JVM),它是实现Java语言跨平台特性的关键。JVM定义了Java程序运行所需的一套指令集和一个相应的运行时环境。它能够将Java源代码编译成与平台无关的字节码,然后在不同的操作系统上通过...

    java虚拟机笔记及代码.zip

    Java虚拟机(JVM)是Java程序运行的核心,它是一个抽象的计算机系统,负责执行Java字节码。在深入理解JVM之前,我们先要明白什么是字节码:Java源代码经过编译后生成的中间表示,即.class文件,里面包含的就是字节码...

    java学习笔记源码MD.rar

    Java学习笔记源码MD.rar是一个压缩包,其中包含了一系列关于Java编程语言的学习资料,特别是针对JVM(Java虚拟机),Spring框架以及Java多线程等内容的深入探讨。这些主题是Java开发中的核心部分,对于任何想要提升...

    java私塾学习笔记整理

    ### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...

    非常详细javaSE学习笔记.rar

    15. **垃圾收集与内存管理**:理解Java内存模型,了解如何避免内存泄漏,以及垃圾收集的工作原理。 16. **设计模式**:可能包含常见的23种设计模式,如单例,工厂,观察者,装饰器,适配器等模式的应用场景和实现。...

    阿里P8 架构师整理Java学习笔记.pdf

    - **JVM(Java Virtual Machine)**: Java虚拟机是执行Java字节码的虚拟机,它提供了运行Java程序所需的环境。 **1.2 线程** - **线程**: 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程...

Global site tag (gtag.js) - Google Analytics