碎碎念,介绍Java内存管理基础知识
1.自动内存管理
内存管理就是查找出不再使用的对象,释放这些对象占用的内存空间,为其他对象的分配提供足够的内存空间。在一些编程语言(C,C++)中,内存管理是程序员的职责。内存管理使开发变得复杂,而且会造成许多潜在的bug和不可知的崩溃。导致程序猿花费大量时间debug来修复这些很隐蔽的问题。
在精确的内存管理中经常发生一个问题是悬摆指针
(dangling references
)。程序猿可能释放一个对象占用的内存空间,即使这个对象还在被其他对象引用。如果一个对象引用另一个被不小心
释放的对象,这个释放对象的内存空间可能被重新分配新的对象,这个时候,不可预期的结果就可能发生了,而且很可能是致命的。
另一个在精确内存管理中经常发生的问题是内存泄露
(menory leaks
)。泄露经常是对象占用的内存空间不再被任何其他对象引用,但是这个对象没有被回收。例如,如果你打算回收一个列表的空间,但是不小心只释放了列表的第一个元素,这个列表的其他元素将一直持有内存空间,因为这个列表引用已经不存在了,其他元素占用的空间得不到释放,造成了泄露。久而久之,类似的泄露累计,将会填满内存空间,导致没有足够的内存分配给其他的新对象。
鉴于上面的原因,Java做出一个明智但艰难的抉择,自动内存管
理。程序猿不再管理负责的内存分配和回收,把更多的精力放在业务开发上。承担次任务的是Java中的垃圾收集器,它能解决悬摆指针,内存泄露问题。对象的引用关系会被垃圾收集器检索到,当某个对象不再被任何对象引用的时候,垃圾收集器会自动回收。
2.垃圾收的集概念
一个垃圾回收器的职责:
-
分配内存
- 确保被引用的对象留在内存中
- 释放那些不再被任何其他对象引用的对象占用的内存空间
如果一个对象在以根对象
(root objects
)为首的引用链中可达
,那么这个对象是存活
的;否则,这个对象已经死亡
(将要被回收)。查找并释放不可达对象占用内存空间的过程,成为垃圾回收。
垃圾回收能解决大部分问题,但不是所有问题。你可以不断创建新的对象,并保持这写对象的引用,直到没有足够的内存位置(操作系统可能会用到交换空间,虚拟内存等保证系统正常运行,但是效率会下降)。
对于垃圾收集器分配和回收内存的算法,对程序员来说是透明的,通常对象内存空间是从堆
(heap
)中分配的。
垃圾收集器控制着垃圾回收的时间。通常,垃圾回收发生在整个堆或者堆一部分已经被填满或者堆的使用情况达到某个阈值
。对象内存分配需要垃圾收集器在堆中找到特定大小的连续
空间
,而垃圾回收又会产生碎片
,导致内存空间不连续。所以为了避免碎片,垃圾回收过程会有一些动作保证内存连续。
3.垃圾回收器特点
垃圾收集器应该是安全并且全面的。存活对象不能被错误的回收,并且在一次垃圾回收周期中,垃圾对象应该被全部清除,不能有残留。
垃圾回收器还应该是高效的,不能给正在运行的程序造成太大的停顿(STW
——stop the word
)。在一个计算密集的系统中,在耗时,空间,频率
通常会有一个权衡。如果堆的空间很小,垃圾收集很快就会完成,但是堆很快就会被填满,这时候垃圾收集器活动就会更频繁。相反,对于一个较大的堆,填满这个堆需要相对较长时间,但是收集器执行一次垃圾回收耗时也相对较长。
垃圾收集器的另一个特点是减少碎片空间。当回收对象占用的内存空间的时候,内存随便会遍布整个堆,新的对象分配没有足够大的连续空间导致分配失败。为了解决这个问题,在回收对象时,会对内存进行整理
或压缩
。
可扩展对垃圾收集器也很重要。垃圾收收集器不应该在单线程和多线程执行效率是一样的,也就是说,多cpu不应该成为垃圾收集器的瓶颈。
分享到:
相关推荐
总的来说,Java内存管理和诊断是一个复杂的过程,需要深入理解JVM的工作原理和垃圾收集机制。通过合理使用各种工具和技巧,开发者能够有效地识别和解决内存泄露和溢出问题,确保应用程序的稳定性和性能。
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
HotSpot JVM引入了一项新技术——**工效学(ergonomics)**,能够在不同的平台上自动选择合适的内存收集器类型、堆大小及工作模式(客户端或服务器),并根据用户期望的目标自动调整垃圾收集的参数。 #### 六、内存...
但在Java中,有一个自动的垃圾收集机制来处理不再使用的对象。 **2.3.1 作用域** 作用域定义了变量的有效范围,即变量在哪一部分代码中可以被访问。Java中的作用域规则非常重要,因为它决定了变量的生命周期。 ...
首先,C++标准库并没有提供内置的垃圾清理系统,如Java或.NET中的垃圾收集器。在C++中,程序员需要手动管理内存,通过`new`运算符分配内存,使用完后用`delete`来释放。这样的设计让C++具备了更高的性能和灵活性,但...
这是出于性能和安全性的考虑,因为不可变性可以避免并发环境下的数据同步问题,并且方便垃圾收集器进行内存管理。 `String`类提供了多种构造方法,如`String()`用于创建空字符串,`String(char[] value)`通过字符...
Java的垃圾收集机制自动管理内存,回收不再使用的对象,避免内存泄漏,简化了程序员的工作。 7. J2SE下载和安装: J2SE(Java SE)是Java标准版,用于开发桌面应用。用户可以从Oracle官网下载并安装JDK,安装过程...
本毕业设计项目——“基于JAVA的内存管理模拟”深入探讨了Java内存模型及其管理机制,通过模拟实现来帮助理解这些概念。下面将详细阐述相关知识点。 1. **Java内存模型**:Java内存模型(JVM Memory Model)定义了...
例如,垃圾收集器就是守护线程。通过setDaemon(true)方法可以将线程设置为守护线程。 通过以上内容,你应该对Java线程有了较为全面的认识。在实际开发中,合理使用线程能显著提升程序的并发性能,但也需要关注线程...
其次,深入理解Java内存管理是至关重要的。了解堆和栈的区别,以及如何管理对象生命周期。JVM(Java虚拟机)的工作原理,包括类加载机制、垃圾收集(GC)以及内存模型(JMM),都是面试中常见的主题。理解垃圾收集器...
最后,文档还提供了更多资源链接,供感兴趣的读者深入了解JVM内存管理和垃圾收集。 从这些核心内容可以看出,《JVM内存管理白皮书》是JVM内存管理领域的权威资料。它不仅向读者提供了JVM垃圾收集机制的理论知识,还...
在本项目"基于Java实现内存管理小项目【100013111】"中,我们聚焦于使用Java语言来实现一个内存管理的模拟系统。该项目包含两个核心包——`dynamic`和`request`,以及一个启动主类`MainTest`。这表明开发者可能在...
Java虚拟机提供了多种垃圾收集器,如: - **Serial**:单线程的新生代收集器,使用复制算法,适用于简单应用。 - **ParNew**:Serial的多线程版本,同样使用复制算法,但可能导致`StopTheWorld`事件。 - **Parallel...
通过以上内容可以看出,深入理解JVM内存管理和垃圾收集机制对于提高应用程序的性能至关重要。尽管现代JVM已经非常智能,能够自动管理大部分内存相关的工作,但在面对复杂的应用场景时,仍然需要开发人员具备一定的...
3. **内存管理与垃圾收集**:Java的自动内存管理主要依赖于垃圾收集器。理解内存模型(堆、栈、方法区等),知道如何分析和解决内存泄漏,理解垃圾收集的工作原理(如可达性分析、标记-清除、复制、标记-整理、分代...
在Java高级面试中,面试官通常会关注应聘者对核心概念、并发处理、集合框架、设计模式、数据库操作、性能优化、垃圾收集以及框架应用等多个方面的理解和实践能力。以下是根据这些关键点展开的详细知识点: 1. **...
类、消息、接口、及抽象等概念。 2.2.1 对象 现实世界中的对象具两个特征:状态和行为。例如:自行车有状态(传动装置、步度、 两个车轮和齿轮的数目等)和行为(刹车、加速、减速和换档等)。 其次,我们再...
- **JVM参数设置**:学习如何根据应用特性设置初始堆大小、最大堆大小、垃圾收集器等参数。 4. **设计模式**: - **常见设计模式**:单例、工厂、观察者、装饰者、适配器、代理等,理解它们的意图和实现方式。 -...
- 内存管理:理解Java内存模型,包括堆、栈、方法区和本地方法栈,以及垃圾回收机制。 2. **并发编程**: - 线程:线程的创建、启动、同步和协作,如synchronized、wait/notify、Lock接口等。 - 并发工具类:...
在Java高级面试中,面试官通常会关注候选人在核心Java、多线程、集合框架、JVM内存管理、设计模式、数据库操作、网络编程、异常处理、IO流、Spring框架及其实现原理等方面的知识掌握程度。以下是根据这些关键点展开...