仅提供一个大致的思路:

垃圾回收(gc)的目的是释放堆中不需要保存的对象,达到内存的充分利用。

1.回收哪些对象的判定

垃圾回收最简单的思路是采用引用计数的方式,即记录对象被引用的次数,直到一段时间内对象都没有被其他对象引用,此时可以确定该对象能被回收,引用计数实现简单,运行高效,但是有一个循环引用的问题,即两个本应被回收的对象因为互相引用而无法被回收,针对这个问题又有了弱引用,即把两个互相引用的一个引用计数改为弱引用,弱引用不会使次数加1,c++即是这么做的。 jvm虚拟机的使用的是根寻路算法,其大致思想是看除堆区以外的内存区域能否通过引用链找到堆中的对象,找不到就证明该对象可以被回收。

2.如何回收

jvm有两种回收方式,一种是标记完待回收的对象之后一起释放内存,这种方法的缺点是会产生较多难以重复利用的内存碎片。另一种为了避免内存碎片的出现,将内存分为两块,一块使用,一块不使用,标记完所有待回收的对象之后,将还要使用的内存复制到不使用的区域,然后对使用的整体区域进行内存回收,这种方法没有内存碎片问题,但是每次回收的复制工作很耗性能。

通过统计发现,在内存中存活越久的对象就越不容易被回收,越是新分配的内存对象就越可能会被回收。根据这个特性,把内存区域分为新生代和老年代(有的虚拟机会分为很多代),新生代容易被回收,采用复制内存再回收的方法,老年代不容易被回收,采用标记后回收和复制内存相结合的方法。

3.什么时候回收

程序员可以手动调用gc,一般是系统等到新生代的内存区占满了又需要分配内存的时候,这个时候新生代就变成了老年代,等老年代的内存占满之后开始回收老年代所占的内存区。

java 什么时候进行垃圾回收_Java中垃圾回收有什么目的?什么时候进行垃圾回收?...相关推荐

  1. java String如何回收_java中的垃圾回收

    原文-http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确 ...

  2. java堆和栈的区别_JAVA中堆和栈的区别

    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配 ...

  3. java什么是栈和堆_JAVA中的栈和堆

    JAVA在程序运行时,在内存中划分5片空间进行数据的存储.分别是:1:寄存器.2:本地方法区.3:方法区.4:栈.5:堆. 基本,栈stack和堆heap这两个概念很重要,不了解清楚,后面就不用学了. ...

  4. java判断对象已经被回收_Java中JVM判断对象已死的基本算法分析

    原标题:Java中JVM判断对象已死的基本算法分析 jvm中 有各种的垃圾收集器,每个收集器都有各自的算法. 但是一切的根本都需要找到找到应该被消除的对象,理解如何找到死亡对象才是理解垃圾收集器的基础 ...

  5. java 内存溢出和内存泄漏_JAVA中的内存溢出和内存泄漏有很大的区别

    JAVA中的内存溢出和内存泄漏分别是什么,有什么联系和区别,我谈谈自己的理解. 内存泄漏(memory leak ):申请了内存不释放,比如100m的内存,分配了10m的内存一直不回收,那么可以用的内 ...

  6. java是如何实现原语的_Java中的低GC:使用原语而不是包装器

    java是如何实现原语的 总览 有两个很好的理由在可能的地方使用原语而不是包装器. 明晰. 通过使用原语,您可以清楚地知道null值是不合适的. 性能. 使用原语通常更快. 清晰度通常比性能更重要,并 ...

  7. java怎样获取线程的进度_java中的多线程——进度2

    多线程总结: 1,进程和线程的概念. |--进程:是一块包含了某些资源的内存区域.操作系统利用进程把它的工作划分为一些功能单元: 最小的内存单元: 是具有一定独立功能的程序关于某个数据集合上的一次运行 ...

  8. java 内存溢出和内存泄漏_java中内存溢出和内存泄漏的区别

    虽然在java中我们不用关心内存的释放, 垃圾回收机制帮助我们回收不需要的对象,但实际上不正当的操作也会产生内存问题:如,内存溢出.内存泄漏 内存溢出:out of memory:简单通俗理解就是内存 ...

  9. java斐波那切数列_Java中的递归方法

    递归算法 1.递归算法 递归在计算机科学中也称为递归算法.一些问题在分解的时候会有这样的现象:解决该问题的过程是由重复的相似子过程组成,类似这样的问题我们都可以通过递归算法进行解决.在计算机语言中,递 ...

最新文章

  1. 10年测试工程师首谈测试前景,如何25天进入滴滴大厂
  2. 如何编译Apache Hadoop2.2.0源代码
  3. 配置EIGRP默认路由
  4. android最大json,Android:解析大型JSON文件
  5. 中国基础软件历史性突破!Gartner最新报告:阿里云进入全球数据库领导者象限
  6. ffplay.c学习-4-⾳频输出和⾳频重采样
  7. Vue2.0中子组件向父组件传递数据的方法,以完整demo演示
  8. 围观:各地大学教师自曝近年工资待遇,真实一手数据!
  9. arduino和单片机c语言,Arduino和单片机的区别-与非网
  10. oracle数据库服务器启动后需执行的命令(SecureCRT中执行)
  11. Qt QSettings读写ini时 General 读不出来值
  12. 剑指Offer系列刷题笔记汇总
  13. C# Remoting理解
  14. 二十六 .ajax登录 认证 验证码(session)
  15. openstack 权限管理
  16. leetcode动态规划之零钱兑换问题
  17. Spring05:面向切面编程
  18. 最简单的平面制图用什么软件_建筑绘图用什么软件好?AUTO CAD软件快速制图,工程人必备...
  19. Mutual Supervision for Dense Object Detection
  20. GLDAS数据下载及处理(使用Matlab语言进行NC转TIF)

热门文章

  1. BCH压力测试即将开始,你确定不来凑凑热闹?
  2. 从Hadoop集群中移除一块磁盘的操作
  3. web开发小记2:js触发css过渡
  4. Paxos算法之旅(四)zookeeper代码解析--转载
  5. Thinkphp怎样修改模板标签定界符
  6. 谷歌跟随微软加入云安全联盟 亚马逊依然游离
  7. Power Designer使用技巧
  8. 可爱的MicrosoftAjax.js精简版(47K)
  9. vault-使用kubernetes作为认证后端
  10. 沈阳初步建成国内领先的城市级大数据资源库