当前位置:首页 > 开发 > 编程语言 > Java > 正文

Java中垃圾回收、内存分配

发表于: 2014-08-19   作者:船长过桥人   来源:转载   浏览:
摘要: 一、垃圾回收 1、垃圾回收是一个比较复杂的过程,当程序运行时会自动检查整个内存,检查内存中哪些对象的引用不再被使用。一旦检查来后,便会安全删除这些对象。但是,由于垃圾回收需要占用系统的资源,所以他可能会影响应用程序代码的运行,可能会使得程序代码的执行时间延长,导致程序运行的延迟,而且延迟时间不可预知。对实时程序是一个致命的问题。 2、只要对象可以被任何存活线程访问,就不适合进行垃圾收集,一个已

一、垃圾回收
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中垃圾回收、内存分配

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

推荐文章
编辑推荐
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号