java运行时数据区域和垃圾收集算法

来源:互联网 发布:知秋新书王剑仁 编辑:程序博客网 时间:2024/05/19 19:32

java虚拟机在执行java程序的时候会把内存划分为多个不同的内存区,它们都有着不同的功能,并且生命周期也有不同。

这里写图片描述

程序计数器
程序计数器是一个很小的内存区域,简单来说就是记录字节码行号的标记(指示器),程序就是根据指示器进行执行,循环,跳转等。为了让多线程的执行和切换,多线程中会有一个独立的计数器,保证线程之间不会相互影响。

java虚拟机栈
与程序计数器一样也是线程私有的。虚拟机栈描述的是java方法执行的内存模型,每个方法在执行都会创建一个栈楨,用来存储局部变量,操作数等信息。
本地方法栈

本地方法栈和虚拟机栈非常类似,不同的是虚拟机栈是为虚拟机执行字节码提供服务,本地方法栈是为虚拟机执行程序使用到的native方法服务。

java 堆
java堆是java虚拟机管理内存最大的一块区域,是所有线程共享区域。主要就是存放对象内存,每一个对象在这里都会分配一块内存。gc堆所管理的主要区域也是这个区域,gc根据独特的算法对java堆进行回收。

方法区
方法区和java堆一样也是一个所有线程共享区域,主要存储虚拟机加载类的信息,常量,静态变量等。

java的四种引用:强引用、软引用、弱引用、虚引用的概念

强引用(StrongReference)
强引用就是指在程序代码之中普遍存在的,比如Object obj = new Object()是强引用,JVM宁愿抛出OutOfMemory错误也不会回收这种对象

软引用(SoftReference)
软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference类来表示,在内存将要发生溢出的时候将对象加入到回收的范围,进行第二次回收,如果还是内存不够那么就会抛出oom异常

弱引用(WeakReference)
弱引用也是用来描述非必需对象的,当JVM进行垃圾回收时,无论内存是否充足,都会回收被弱引用关联的对象。

虚引用(PhantomReference)
虚引用和前面的软引用、弱引用不同,它并不影响对象的生命周期
如果一个对象与虚引用关联,则跟没有引用与之关联一样,在任何时候都可能被垃圾回收器回收。

java的垃圾收集算法
标记-清除算法
最基础的收集算法,过程分为标记和清除两个阶段,先将对象进行标记,后面对已经标记的对象进行回收,但是这中方式很多缺点,内存碎片化严重,内存零散不连贯,对分配大内存的时候,比较被动;效率本身也比较低。

复制算法
将内存分为两片,没次只使用其中的一片区域,当这一块内存使用完了,将还存活的对象复制到另一块区域,再将第一块内存区域清除。这种效率很高,但是太耗内存,因为每次只使用了一半的内存。现在商业的虚拟机都是采用这种方法收集新生代,

标记-整理算法
这个和标记-清除算法差不多,先是对对象进行标记,然后整理对象,让活的对象向一端进行移动,然后直接清理掉边界外的对象,这样就清理出大片的内存空间。

分代收集算法
当前商业虚拟机垃圾收集都采用分代,这种是根据对象的存活周期不同将内存划分几块。一般分为新生代和老年代,在新生代中由于有大批对象死去,只留下少部分对象,因此采用复制算法,效率高。在老年代中,大批对象都是存活的,没有更多的空间进行分配,因此采用”标记-清理”或者”标记-整理”进行回收。

原创粉丝点击