浅析浅析Java内存模型与垃圾回收内存模型与垃圾回收
下面小编就为大家带来一篇浅析Java内存模型与垃圾回收。小编觉得挺不错的,现在分享给大家,也给大家做
个参考。一起跟随小编过来看看吧,祝大家游戏愉快哦
1、、Java内存模型内存模型
Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示:
程序计数器:一块较小内存区域,指向当前所执行的字节码。如果线程正在执行一个Java方法,这个计数器记录正在执行的
虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空。
Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈、
动态链接、方法出口等信息。
本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的Native方法服
务。
Java堆:是虚拟机管理内存中最大的一块,被所有线程共享,该区域用于存放对象实例,几乎所有的对象都在该区域分配。
Java堆是内存回收的主要区域,从内存回收角度看,由于现在的收集器大都采用分代收集算法,所以Java堆还可以细分为:
新生代和老年代,再细分一点的话可以分为Eden空间、From Survivor空间、To Survivor空间等。根据Java虚拟机规范规
定,Java堆可以处于物理上不连续的空间,只要逻辑上是连续的就行。
方法区:与Java一样,是各个线程所共享的,用于存储已被虚拟机加载类信息、常亮、静态变量、即时编译器编译后的代码
等数据。
运行时常量池,运行时常量池是方法区的一部分,Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项
信息是常量池,用于存放编译期生成的各种字面量和符号引用。运行期间可以将新的常量放入常量池中,用得比较多的就是
String类的intern()方法,当一个String实例调用intern时,Java查找常量池中是否有相同的Unicode的字符串常量,若有,则返
回其引用;若没有,则在常量池中增加一个Unicode等于该实例字符串并返回它的引用。
2、垃圾对象如何确定、垃圾对象如何确定
Java堆中存放着几所所有的对象实例,垃圾收集器在对堆进行回收前,首先需要确定哪些对象还"活着",哪些已经"死亡",也
就是不会被任何途径使用的对象。
引用计数法引用计数法
引用计数法实现简单,效率较高,在大部分情况下是一个不错的算法。其原理是:给对象添加一个引用计数器,每当有一个地
方引用该对象时,计数器加1,当引用失效时,计数器减1,当计数器值为0时表示该对象不再被使用。需要注意的是:引用计
数法很难解决对象之间相互循环引用的问题,主流Java虚拟机没有选用引用计数法来管理内存。