`

Java中垃圾回收、内存分配

    博客分类:
  • Java
阅读更多

一、垃圾回收
1、垃圾回收是一个比较复杂的过程,当程序运行时会自动检查整个内存,检查内存中哪些对象的引用不再被使用。一旦检查来后,便会安全删除这些对象。但是,由于垃圾回收需要占用系统的资源,所以他可能会影响应用程序代码的运行,可能会使得程序代码的执行时间延长,导致程序运行的延迟,而且延迟时间不可预知。对实时程序是一个致命的问题。
2、只要对象可以被任何存活线程访问,就不适合进行垃圾收集,一个已经成为垃圾收集目标的对象还可以消除这种适合性。当对象的finalize()方法创建了一个指向该对象的可达引用时,就会出现这种情况。Java中没有delete关键词,用来消除对象,对象在变得不可达之后不必马上作为垃圾被收集,该对象只是适合垃圾收集。
3.任何垃圾回收算法一般做两件事:(1)发现无用信息对象;(2)回收被无用对象占用的内存空间,是该空间可被程序再次利用。有一种简单的算法:引用计数法,该算法使用引用计数器来区分存活对象和不再使用的对象。
4.如果一个对象赋值为null或者重新定向了该对象的引用者,则该对象被认定为没有存在的必要,那么它所占用的内存就可以被释放。被回收的内存可以用于后续的再分配。
5.GC即垃圾收集机制是JVM用于释放哪些不再使用的对象所占用的内存。Java语言并不要求JVM有GC,也没有规定GC如何工作。不过常用的JVM都有GC。大多数用GC使用类似的算法管理内存和执行收集操作。其实,调用System.gc()也仅仅算是一个请求。JVM接受这个消息后,并不是立即进行垃圾回收,仅仅是使得垃圾回收操作容易发生或者提早了或者回收较多而已。
6、Java提供了默认机制来终止该对象并释放资源,这个方法就是finalize()。 所有的对象都有finalize()方法,是从Object继承来的,所有的类都是继承自Object。他的原型为:
protected void finalize() throws Throwable
Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。这个方法使由垃圾收集器在确定这个对象没有被应用时对这个对象调用的。
调用finalize()方法本身不会破坏该对象,当JVM的拦截收集器调用一个合适对象的fianlize()方法时,他会忽略任何由finalize()方法抛出的异常。
7、Java的垃圾回收并不能保证内存的耗尽;垃圾回收只是一个低优先级的后台线程,而且跟踪可以或不可达对象。

二、内存分配
Java把内存分成两种,一种叫栈内存,一种叫堆内存。 
当某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈空间。当函数运行结束时,分配给函数的栈空间被收回。在这个函数中被定义的变量也随之被释放和消失。通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个栈中变量的取值等于堆中对象的首地址。栈内存中的变量就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是再没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!
分享到:
评论

相关推荐

    java垃圾回收及内存泄漏.pptx

    ### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...

    Java垃圾回收机制和内存分配

    你认真演示了一遍,你就能明白JAVA的垃圾回收机制。当然文档写的不一定全面,比如文档当中关于老年区少年区有一页写的不是很完整,我也没有添加太多进去,但是还是很有很全面很有参考意义的。

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...

    java程序中的内存分配问题

    Java程序在运行时的内存分配是一个关键的概念,它关乎到程序的性能、稳定性和资源管理。这个主题主要涉及以下几个方面: 1. **JVM内存结构**:Java虚拟机(JVM)将内存划分为几个区域,包括堆(Heap)、栈(Stack)...

    Java垃圾回收详解

    ### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...

    Java内存泄露及内存无法回收解决方案

    Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...

    Java内存分配及垃圾回收文章汇总

    Java内存分配与垃圾回收是Java程序性能优化的关键领域。在Java平台上,程序的运行主要依赖于JVM(Java虚拟机),而JVM的核心组件之一就是内存管理。本篇将深入探讨Java内存分配策略以及垃圾回收机制,以帮助你更好地...

    JVM内存分配与垃圾回收详解

    JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾回收进行详细的解释。 JVM 运行时数据区域 JVM 内存分配主要涉及到五个运行时数据区域:程序计数器、Java 虚拟机栈、本地方法栈...

    操作系统实验和课设,java实现动态内存分配和回收,FF,NF,WF,BF

    在这个实验和课程设计中,我们将深入探讨动态内存分配与回收的机制,通过Java编程语言来实现四种不同的内存分配策略:First Fit(FF)、Next Fit(NF)、Best Fit(BF)以及Worst Fit(WF)。 首先,让我们详细了解...

    java内存管理与垃圾回收

    Java 内存管理与垃圾回收是Java编程中至关重要的概念,它们确保了程序的稳定运行和内存的有效利用。Java在JVM(Java Virtual Machine)上运行,内存主要分为两个主要区域:栈(Stack)和堆(Heap)。 栈主要用于...

    Java垃圾回收原理

    ### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...

    深入Java核心_Java内存分配原理精讲

    Java内存分配原理是Java编程中的重要一环,它关乎到程序的性能、稳定性和资源管理。深入理解这一主题,能够帮助开发者编写出更高效、更稳定的代码。在Java中,内存分为堆内存、栈内存、方法区(在Java 8之后被元空间...

    java垃圾回收技术,面试会问

    ### Java垃圾回收技术详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制(Garbage Collection, GC)是面试和技术交流中经常提及的话题之一。尤其对于那些深入研究Java内存...

    Java中堆内存与栈内存分配浅析

    ### Java中堆内存与栈内存分配浅析 #### 一、引言 在Java编程语言中,内存管理是一项至关重要的技术。程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的...

    java核心 内存分配问题

    当方法执行完毕,这些变量的内存会被自动释放,这是Java垃圾回收机制不涉及的部分。栈内存分配速度快,但空间有限。 3. **堆内存**:对象实例主要存储在堆中,由Java虚拟机的垃圾回收器管理。当使用`new`关键字创建...

    java垃圾回收

    总的来说,Java垃圾回收是JVM中不可或缺的一部分,它帮助我们解决了内存管理的复杂性,但同时也需要我们根据应用的特性和需求进行适当的调优。深入理解垃圾回收的工作机制,能够帮助我们编写出更加高效、稳定的应用...

    java内存分配情况

    Java内存分配主要涉及五个区域:寄存器、栈、堆、静态域和常量池。在Java编程中,理解这些内存区域的分配规则对于优化代码性能和避免内存泄漏至关重要。 1. **寄存器**:这是最快捷的存储区域,但不在Java程序员的...

Global site tag (gtag.js) - Google Analytics