Java较C而言,最大的区别在于内存管理。JVM设有无用内存空间自动回收复用机制,也就是我们所说的GC。

之前说过,栈是为线程、为函数的执行分配内存的地方,用完即“销毁”,这里留待以后做深入探讨;堆是为对象和数组分配内存的地方,有些对象可能会伴随着程序运行的完整生命周期,但大部分对象都是朝生夕死的,如何判断对象是否有必要“占坑”呢?首先我们要来说一下判别方法:Java中对象的活性判别主要有两种,引用计数法和可达性分析法。

引用计数法:为每个对象设立一个计数器,对象每被引用一次,计数器加一,当引用失效的时候,计数器减一。原理简单易懂,但存在一个致命问题,无法处理循环引用问题。如果A.son = B; B.son = A;A和B除此之外再无其他引用,按需求A和B应该被回收掉,但引用计数法却无法识别这种引用。

可达性分析法:JVM列出一些称之为GC Roots的对象,把它们作为活对象的源头,如果顺着它们的引用能找到的对象,一律认为是活着的。那么哪些对象可以当作GC Roots呢?能作为GC Roots的对象,一定是程序目前运行中的正在使用的对象。JVM规定了以下四类:

1、栈里面的本地变量表中,引用类型所指向的对象;

2、本地方法栈中Native方法所引用的对象;

3、方法区中常量所指向的对象;

4、方法区中类的静态属性所指向的对象


针对上述两种方法,都存在一个共有名词:引用!如果只存在一种引用,非黑即白,那么Java也太不智能了。所以,Java中把引用分为四个等级,有强有弱,依次分为:

强引用:我们最常见的引用类型,类似于User user = new User();强引用是真的引用!

软引用:当JVM申请不到额外内存了,快到内存溢出时,会把软引用的对象处理掉腾出空间;SoftReference类

弱引用:通过弱引用关联的对象只能活到下次GC之前;WeakReference类

虚引用:这种引用连最基本的调用都无法实现,仅仅用来为对象发送GC通知。PhantomReference类

finalize方法

对于那些不可达的对象,也不是不给它们申辩机会的。当JVM发现程序不可达后,会对这个对象进行一次标记,此时对象如果重写了finalize方法,JVM会把它扔进F_Queue的队列之中,并在之后创建一个低优先级的Finalizer线程去触发这个对象的finalize方法。JVM 会对队列中的对象进行第二次标记,如果在执行方法之后,这个对象成功与活着的对象产生引用关联,那么他将被移除这个队列,对象成功拯救了自己。如果没有重写finalize方法或者没能取得引用关联,下次GC的时候它就真的会被回收掉了。

但是不建议使用这个方法来干预JVM的GC过程,因为代价高昂,不确定性大,finalize方法能做的事情在try finally中都可以做得更好更及时。

方法区回收

栈、堆、方法区是三个占用内存最大的地方,其中对堆区进行GC最高效,对方法区GC情况就很不乐观了。方法区在一些JVM中又叫永久代,他们不会对方法区进行GC操作。

方法区是用来存放类信息的地方,这里可以把常量池中无用常量和无用类回收掉。

常量回收:如果一个字面量没有对象引用它,如“abc”,那么就可以把它清理出常量池了。

类回收:当一个类1、所有实例都被已经回收掉 2加载该类的classLoader已经被回收; 3、该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法,满足这三个条件的类就可以清理掉了,条件很苛刻,但是满足这三点的类也不是说一定会被清理,而是通过参数来控制。如果你的程序大量使用了动态生成class(反射,动态代理,动态生成jsp等),以及大量自定义classLoader(OSGi)的场景,可以设置类卸载的功能来防止方法区溢出。

最新文章

  1. 【java基础】面向对象的三大基本特征之-------继承
  2. 3. Android程序生成步骤
  3. PS中常用快捷键
  4. iOS缓存使用的框架
  5. h5 input file ajax实现文件上传
  6. P1697: [Usaco2007 Feb]Cow Sorting牛排序
  7. hdu 1754 I Hate It (模板线段树)
  8. clas
  9. [工具] 解决sublime text运行javascript console无输出问题
  10. JavaLearning:JAVA IO Piped流
  11. 电子科大POJ "敲错键盘"
  12. 使用Theos做一个简单的Mobile Substrate Tweak
  13. 使用非阻塞ServerSocketChannel、SocketChannel代替ServerSocket和Socket
  14. Windows批处理命令学习中遇到的坑--持续更新中
  15. Android为TV端助力 handler ,message消息发送方式
  16. Pandas 合并merge
  17. PyCharm设置Python版本
  18. CMS 01
  19. nginx 更改用户组
  20. Luogu2149 [SDOI2009]Elaxia的路线-最短路+拓扑排序

热门文章

  1. H3C 链路层协议
  2. jq实现简单手风琴效果
  3. Python--day19--collections模块
  4. Vue的filter过滤器
  5. 【codeforces 766D】Mahmoud and a Dictionary
  6. easyui—element-ui框架套用(表格宽度自适应)
  7. 基于AutoIt3的打印机安装
  8. Fast Stone截图工具使用教程
  9. linux进程睡眠的介绍
  10. D3.js力导向图(适用于其他类型图)中后添加元素遮盖已有元素的问题解决