内存管理的话题在C或C++程序设计中讨论得相对较多,因为在C与C++程序设计中需要开发人员自己申请并管理内存,开发人员可以申请/借用(Apply)系统内存并且负责释放/归还(Release)系统内存,如果“只借不还”就会造成系统内存泄漏的问题。在Java程序设计中,这些工作由Java虚拟机(JVM)负责处理。所有内存的申请、分配、释放都由JVM负责完成。因此,开发人员就省去了这部分工作,不过这并不意味着开发人员可以完全依赖于JVM的内存管理功能,如果你这样想并在实际的应用开发中也这样做,你所开发的应用的性能,可能不是最优的。这是因为,无论配置多么优良的硬件环境其自身资源都是有限的,而Java语言(其实不只Java语言)的性能极大程度上依赖于其运行的硬件环境资源,而内存又是硬件环境资源中重要的一部分,因此说如果开发人员开发的Java应用没能有效、合理地使用系统内存,那么这个应用就不可能具备较高的性能。下面对在Java应用开发中的与内存管理相关的技术做详细的讲解。
1 垃圾回收
垃圾回收(Garbage Collection, GC)是Java程序设计中内存管理的核心概念,Java虚拟机(JVM)的内存管理机制被称为垃圾回收机制。因此,掌握如何在开发Java应用时才能合理地管理内存,首先应该了解Java虚拟机的内存管理机制——垃圾回收机制 ,否则,在不了解垃圾回收具体实现机制的情况下讨论Java程序设计中的内存管理,优化Java应用性能,就有些纸上谈兵,舍本逐末了。
我们提到Java程序设计中的内存管理机制是通过垃圾回收来完成的,那么在JVM运行环境中什么样的对象是垃圾呢?下面我们给出了在JVM运行环境中垃圾对象的定义:
一个对象创建后被放置在JVM的堆内存(heap)中,当永远不再引用这个对象时,它将被JVM在堆内存(heap)中回收。被创建的对象不能再生,同时也没有办法通过程序语句释放它们。
我们也可以这样给JVM中的垃圾对象下定义:
当对象在JVM运行空间中无法通过根集合(root set)到达(找到)时,这个对象就被称为垃圾对象。根集合是由类中的静态引用域与本地引用域组成的。JVM中通过根集合索引对象。
这里提到了堆内存的概念,它是JVM管理的一种内存类型,在做Java应用开发时经常会用到由JVM管理的两种类型的内存:堆内存(heap)与栈内存(stack)。简单地讲,堆内存主要用来存储程序在运行时创建或实例化的对象与变量,例如:我们通过new MyClass()创建的类MyClass的对象。而栈内存(stack)则是用来存储程序代码中声明为静态(static)(或非静态)的方法,JVM、堆内存(heap)与栈内存(stack)三者的关系如图所示:
下面通过一个实例来看一下堆内存(heap)与栈内存(stack)中所存储对象的类型由哪些不同。
... ... public class BirdTest { static Vector birdList = new Vector(); static void makeBird() { Object bird = new Bird(); birdList.addElement(bird); } public static void main(String[] arg) { makeBird(); ... } } ... ...
在上面的代码中声明了一些静态的变量与方法,同时也通过关键字new创建了一些对象实例,下面给出这个简单的类在运行时JVM中堆内存(heap)与栈内存(stack)中所存储的对象情况,如图所示。
在上图中,可以看到我们在类BirdTest中声明的Vector类的birdList对象,以及在运行时创建的Bird对象都被放在了堆内存(heap)中,而把两个静态方法main()与makeBird()放在了栈内存(stack)中。这说明birdList对象占用了堆内存,静态方法main()与makeBird()则占用了栈内存。在对Java程序设计中内存管理技术做更为深入的讨论之前,有必要再详细地讲一下堆内存(heap)的相关知识。
1.1 堆内存
堆内存(heap)在JVM启动的时候被创建,堆内存中所存储的对象可以被JVM自动回收,不能通过其他外部手段回收,也就是说开发人员无法通过添加相关代码的手段,回收位于堆内存中的对象。堆内存(heap)通常情况下被分为两个区域:新对象(new object)区域与老对象(old object)区域。这里又引入了两个有关JVM内存管理的新概念。下面分别对这两个概念做一下介绍。
新对象(new object)区域 。又可以细分为三个小区域:伊甸园(Eden)区域、From区域与To区域。伊甸园区域用来保存新创建的对象,他就像一个堆栈,新的对象被创建,就像指向该栈的指针(如果你熟悉C语言,应该非常熟悉指针的概念)在增长一样,当伊甸园区域中的对象满了之后,JVM系统将要做可到达性测试,主要任务是检测有哪些对象由根集合出发是不可到达的,这些对象就可以被JVM回收,并且将所有的活动对象从伊甸园区域拷到To区域,此时一些对象将发生状态交换,有的对象就从To区域被转移到From区域,此时From区域就有了对象。上面对象迁移的整个过程,都是由JVM控制完成的。
老对象(old object)区域 。在老对象区域中的对象仍然会有一个较长的生命周期,大多数的JVM系统垃圾对象,都是来源于“短命”对象,经过一段时间后,被转入老对象区域的对象,就变成了垃圾对象。此时,它们都被打上相应的标记,JVM系统将会自动回收这些垃圾对象,建议你不要频繁地强制系统做垃圾回收,这是因为JVM会利用有限的系统资源,优先完成垃圾回收工作,致使应用无法快速地响应来自用户端的请求,这样会影响系统的整体性能。
通过上面的学习,我们知道垃圾回收与对象的生命周期是紧紧联系在一起的,那么JVM中的对象生命周期是怎样的呢?下一篇就来讲解JVM中对象的生命周期的相关知识。
发表评论
-
【JAVA优化编程】表达式、语句与保留字之——(4)正则表达式
2011-03-12 20:46 04 正则表达式 正则表达式对于熟悉脚本语言 ... -
【JAVA优化编程】表达式、语句与保留字之——(3)判断语句与循环语句
2011-03-12 19:32 19693 判断语句与循环语句 ... -
【JAVA优化编程】表达式、语句与保留字之——(2)Java语言中的保留字
2011-03-08 23:02 9272 Java语言中的保留字 任何一种语言都 ... -
【JAVA优化编程】表达式、语句与保留字之——(1)表达式
2011-03-05 11:52 770表达式与语句是任何程序设计语言的基础,也是开发大型软件 ... -
【JAVA优化编程】内存管理之——(10)Java程序设计中有关内存管理的其他经验
2011-02-18 17:36 108810 Java程序设计中有关 ... -
【JAVA优化编程】内存管理之——(9)JVM内存参数调优
2011-02-18 16:38 10599 JVM内存参数调优 我们前面所提到的堆内存( ... -
【JAVA优化编程】内存管理之——(8)不要提前创建对象
2011-02-13 16:54 9538 不要提前创建对象 尽量在需要的时候创建 ... -
【JAVA优化编程】内存管理之——(7)瞬间值
2011-02-13 16:41 9607 瞬间值 相信你在做远程方法调用 ... -
【JAVA优化编程】内存管理之——(6)对象重用与GC
2011-02-13 16:08 13526 对象重用与GC 有时候我们为了提高系统 ... -
【JAVA优化编程】内存管理之——(5)共享静态变量存储空间
2011-02-11 13:29 13265 共享静态变量存储空间 我们知道类中的静 ... -
【JAVA优化编程】内存管理之——(4)数组的创建
2011-02-11 11:35 8084 数组的创建 ... -
【JAVA优化编程】内存管理之——(3)Java中的析构方法finalize
2011-02-11 11:01 14143 Java中的析构方法finalize ... -
【JAVA优化编程】内存管理之——(2)JVM中对象的生命周期
2011-02-10 16:07 11042 JVM中对象的生命周期 在J ...
相关推荐
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
4. **内存管理与垃圾回收**:JAVA的自动内存管理是通过垃圾回收机制实现的,学习笔记会解释如何理解和使用这个机制,以及如何避免内存泄漏。 5. **集合框架**:JAVA集合框架是存放和操作对象的容器,包括List、Set...
Java的强类型系统和自动内存管理机制,如垃圾回收,为开发者提供了稳定和高效的编程环境。书中会详细解析这些概念,并通过实例演示如何在实际项目中应用。 面向对象设计(OOP)是Java编程的核心,书中将深入讨论...
与《高性能Java系统实现与调优.pdf》这本书结合,你可能会学到更多关于Java性能优化的技巧,包括内存管理、垃圾回收、JVM参数调整等方面。书中的内容可能涵盖了如何通过调整系统配置、优化算法和数据结构,以及使用...
Java作为一种广泛使用的编程语言,其垃圾回收机制是其重要的特性之一,能够自动管理内存,大大简化了开发者的负担。本文将深入探讨Java中的垃圾回收机制,包括其工作原理、常用算法以及实际应用中的注意事项。 ####...
在Java编程环境中,尽管程序员通常不需要直接处理内存地址,但在进行系统级编程或者理解底层工作原理时,了解内存地址转换是必要的。本项目以Java实现,通过图形界面展示了三种内存地址转换的方法,这对于我们深入...
- 除了基本的垃圾回收机制之外,现代的JVM还支持一些高级特性,比如对象局部化(Object Localization)、内存池管理等,这些特性可以帮助进一步优化内存使用效率。 #### 四、总结 通过对Java语言回收机制的深入...
在Java编程中,与C++或C等语言相比,开发者无需手动管理内存,因为Java引入了一种自动的内存管理机制——垃圾回收(Garbage Collection,简称GC)。垃圾回收器负责监测并回收不再使用的对象所占用的内存空间,以防止...
垃圾回收器在Java编程中扮演着至关重要的角色,它负责管理内存,自动释放不再使用的对象,以防止内存泄漏。本文将深入探讨垃圾回收器的重要指标、发展历程以及各种经典的垃圾收集器。 首先,垃圾回收器有两个核心...
在Java编程中,垃圾回收(Garbage Collection,简称GC)是自动管理内存的一种机制。它主要用于自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而避免了内存泄漏问题,提高了程序的稳定性和性能。传统的...
本文将深入探讨Android系统中的常见内存泄露问题及其优化方案,主要针对Java编程语言。 一、内存泄露的理解与类型 内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次小的内存泄露可能看似无关痛痒,...
在Java编程语言中,内存管理是一项关键任务,它涉及到如何有效地分配、使用和释放内存资源。内存分配通常由Java虚拟机(JVM)自动进行,但程序员也可以通过理解和利用特定的策略来优化这一过程。本篇文章将深入探讨...
Java的垃圾回收机制是JVM(Java虚拟机)中一个重要的功能,它负责自动管理内存,避免程序员手动释放已无用的对象,从而简化了编程工作并减少了潜在的内存泄漏问题。在Java中,堆内存主要分为新生代和老年代,新生代...
理解JVM的工作原理,包括堆内存的分配、栈帧的管理以及垃圾回收机制,对于优化Java程序性能至关重要。 在实践中,Java提供了丰富的API和框架,如集合框架、IO流、网络编程、多线程等。集合框架是存储和操作数据的...
9. **垃圾回收与内存管理**:理解JVM的工作原理,包括内存区域划分、垃圾回收机制、性能调优等,对于优化程序性能至关重要。 10. **泛型**:泛型的使用和限制,以及如何利用泛型提高代码的类型安全性和重用性。 11...
4. **JVM内部机制**:了解Java虚拟机(JVM)的工作原理,包括类加载、内存管理、垃圾回收以及性能优化策略,这有助于编写出更加高效和稳定的代码。 5. **Java开发工具**:讲解JDK自带的工具,如javac编译器、...
在Java编程中,JVM扮演着至关重要的角色,它是Java程序运行的基础。了解JVM内部机制,包括类加载机制、内存模型、垃圾收集等,是提高程序性能和解决运行时问题的关键。书中的内容涵盖了以下几个核心知识点: 1. **...
本文将深入探讨从C++编程转向Java编程的相关知识点,帮助程序员理解这两个语言的区别、相似性以及如何有效地进行过渡。 首先,C++和Java都是面向对象的编程语言,但它们的设计哲学和应用领域有所不同。C++起源于...