垃圾收集器与内存分配策略

前言:为什么我们要了解GC以及内存分配呢?

因为当需要排查内存泄露,内存溢出问题时,当垃圾回收成为系统达到高并发量的瓶颈时,我们就需要对其中的细节了解清楚。

 

Java内存运行时区域的各个部分, 其中程序计数器、 虚拟机栈、 本地方法栈3个区域随线程而生, 随

线程而灭; 栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作。 每一个

栈帧中分配多少内存基本上是在类结构确定下来时就已知的( 尽管在运行期会由JIT编译器

进行一些优化, 但在本章基于概念模型的讨论中, 大体上可以认为是编译期可知的) , 因此

几个区域的内存分配和回收都具备确定性, 在这几个区域内就不需要过多考虑回收的问

题, 因为方法结束或者线程结束时, 内存自然就跟随着回收了。 而Java堆和方法区则不一

样, 一个接口中的多个实现类需要的内存可能不一样, 一个方法中的多个分支需要的内存也

可能不一样, 我们只有在程序处于运行期间时才能知道会创建哪些对象, 这部分内存的分配

和回收都是动态的, 垃圾收集器所关注的是这部分内存, 本章后续讨论中的“内存”分配与回

收也仅指这一部分内存

 

回收的对象:不可能再被任何途径使用的对象

判断对象是否存活方法:

1.引用计数算法

给对象添加一个引用计数器,每当有一个对象引用它时计数器就加一,当引用失效时,计数器就减一。任何时刻计数器为0的对象就是不可能在被使用的了。

2.上面的方法也是有弊端的, 至少主流的Java虚拟机里面没有选用引用计数算法来管理内存, 其中最主要的原因是它很难解决对象之间相互循环引用的问题。

3.可达性分析算法:判断对象是否存活

原理:这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点, 从这些节点开始向下搜索, 搜索所
走过的路径称为引用链( Reference Chain) , 当一个对象到GC Roots没有任何引用链相连
( 用图论的话来说, 就是从GC Roots到这个对象不可达) 时, 则证明此对象是不可用的。

在Java中,可作为GC Roots的对象包括:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • Native方法引用的对象

 4.再谈引用

无论是通过引用计数算法判断对象的引用数量, 还是通过可达性分析算法判断对象的引用链是否可达, 判定对象是否存活都与“引用”有关。
在JDK 1.2以前, Java中的引用的定义很
传统: 如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址, 就称这块
内存代表着一个引用。 这种定义很纯粹, 但是太过狭隘, 一个对象在这种定义下只有被引用
或者没有被引用
两种状态, 对于如何描述一些“食之无味, 弃之可惜”的对象就显得无能为
力。 我们希望能描述这样一类对象: 当内存空间还足够时, 则能保留在内存之中; 如果内存
空间在进行垃圾收集后还是非常紧张, 则可以抛弃这些对象。 很多系统的缓存功能都符合这
样的应用场景


在JDK 1.2之后, Java对引用的概念进行了扩充, 将引用分为强引用( StrongReference) 、 软引用( Soft Reference) 、 弱引用( Weak Reference) 、 虚引用( PhantomReference) 4种, 这4种引用强度依次逐渐减弱。
这里介绍前两者:

强引用就是指在程序代码之中普遍存在的, 类似“Object obj=new Object( ) ”这类的引
用, 只要强引用还存在, 垃圾收集器永远不会回收掉被引用的对象。


软引用是用来描述一些还有用但并非必需的对象。 对于软引用关联着的对象, 在系统将
要发生内存溢出异常之前, 将会把这些对象列进回收范围之中进行第二次回收。 如果这次回
收还没有足够的内存, 才会抛出内存溢出异常
。 在JDK 1.2之后, 提供了SoftReference类来实
现软引用。
 

 注:即使在可达性分析算法中不可达的对象, 也并非是“非死不可”的, 这时候它们暂时处于“缓刑”阶段, 要真正宣告一个对象死亡, 至少要经历两次标记过程----------------------略------------------------

5.回收方法区:略!

 

6.垃圾收集算法:

------------------------------略~具体看P90 / 470---------------------------------

关于内存泄露内存溢出的一些概念以及引起原因

 

7.垃圾收集器:

如果说收集算法是内存回收的方法论, 那么垃圾收集器就是内存回收的具体实现。
-------------------------------略~详情请看98/470--------------------

 

8.内存分配与回收策略

好枯燥啊~~~~~~~~~ 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值