`
cnetwei
  • 浏览: 174457 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Java内存及GC的基础知识备忘

阅读更多

1、堆与栈

在Java中除堆与栈之外 还有:方法区、常量池、本地方法栈等内存区域,但堆和栈是最重要的两个内存区域。

是JVM启动是统一分配的;而 是每一个线程所独有的,而堆是所有线程共享的。

栈: 其实应该叫线程栈。所有原生类型变量的内存分配都是在栈上进行,当程序退出该变量的作用范围时内存会被自动释放;

堆: 所有对象(非原生类型,即通过new关键子创建的对象)需要的内存都是在堆上分配,而堆上的内存回收由GC依据某种算法来进行回收和整理。

 

2、GC,垃圾收集器(Garbage Collector),其实更准确的说法应该是Java内存管理系统;它是一个独立的线程,在必要时使用某种算法对堆上的内存进行回收和整理。那么Java都提供哪些不同的内存回收算法呢?

 

3、分代复制收集算法:将堆上的内存进一步细分为年轻代区域(该去被称为edan---伊甸园的意思? )和年老代区域,并根据对象的生存时间将他们分别置于相应的区域。这一算法基于这样一个假设——即大约95%的对象的生成周期都非常短暂。 分代复制算法将刚刚新创建的对象归类为年轻代,并置入年轻代区域,直到年轻代区域空间已满,该算法将会对年轻代区域进行一次垃圾收集:将还被引用的对象升级为年老代,并copy到年老代区域,然后清空年轻代区域,等到年老代区域空间也满时,则启动其它回收算法(通常是标记算法);如此则进一步提高了内存回收效率。  

 

3、标记收集算法:该算法会从内存区域中找到还被引用的对象,并以此对象为根遍历其它被引用的对象,为它们都打上“存活”标记。未被标记的对象即“死亡”对象,会被清理掉。根据对存活对象处理方式的不同,又会细分为两类:

标记紧缩算法 :将所有存活对象copy到一块连续的内存区域中,有整理内存,减少内存碎片的效果。

标记清除算法 :保留存活对象不动,将死亡对象的内存空间记录下来,准备分配给后面新来的对象,这一算法会导致内存碎片,但却没有copy存活对象的开销。

 

以上两种收集算法(尤其是标记收集算法)运行是会停止JVM中的其它程序线程,而且会对整合区域进行扫描收集,因此程序停顿的时间不可预测,运行过程有明显停顿。于是就有了以下算法:  

4、增量收集算法:该算法是一种被改良的垃圾收集程序运行机制,它以固定时间间隔运行收集程序,每次仅收集很小一部分空间。而且固定时间间隔短到用户不能觉察,因此不会产生明显停顿。

 

主要垃圾收集和次要垃圾收集 :以上不同的算法被分别用来执行主要和次要的垃圾收集。通常主要是指对年老区执行标记压缩算法,而次要是指对edan区域执行分代复制算法。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics