Java虚拟机 内存管理与垃圾回收

java和C++之间有一堵由内存自动分配与垃圾回收所围成的高墙,外面的人想进来,里面的人想出去

主要内容

内存分布

垃圾回收机制

垃圾收集器

Java内存分布

当java虚拟机运行程序时,会把由虚拟机管理的内存划分为不同的区域,他们的作用不同,创建和销毁时间也不同,有的是虚拟机完全控制,有的是依赖用户的启动和结束而建立和销毁。


仅仅是组成图,并不代表实际占用大小。比如程序计数器只占很小空间

线程隔离就是不同线程之间都是独立的不可以共享(虚拟机栈,本地方法栈,程序计数器)

程序计数器:当前线程执行的字节码(编译后的代码)的行号指示器。java虚拟机的多线程是通过处理器快速切换并执行不同线程代码来实现的,程序计数器就相当于你同时看多本书时候的书签。此外,当执行native方法(非java代码接口)时候计数器为空(undefined)。

java虚拟机栈:线程私有且与线程生命周期相同。虚拟机栈描述的是java方法执行的内存模型:每个方法在执行时都会创建一个栈帧(栈中的一个元素),用于储存方法的一些信息。每一个方法执行过程就相当于入栈出栈。当栈超出虚拟机允许范围,以及栈扩展时内存不足都会抛出异常。

本地方法栈:与虚拟机栈类似,只不过虚拟机栈作用于执行java方法,而本地方法栈作用于native方法。

java堆:堆是虚拟机管理的内存中最大的一块,所有线程共享并虚拟机启动时就创建,唯一的目的就是用于存放对象实例。java堆是垃圾回收的主要对象。

方法区:线程共享,用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

运行时常量池:是方法区的一部分。class文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池,用于存放编译器存放的各种字面量和符号引用,这部分内容将在类加载后存放到方法区的运行时常量池。运行时常量池不同于class文件常量池,可以在运行期间更改比如String类的intern()方法。

直接内存:即不归虚拟机管理的内存。在有些场合能显著提高性能,避免了在java堆和native堆中来回复制数据,比如nio中通道与缓冲区的应用。

垃圾回收

垃圾回收主要处理的是堆内存,堆不像方法区一样内存的分配和回收都具有确定性,一个接口中多个实现类需要的内存可能不一样,一个方法中多个分支需要的内存也可能不一样,只有在程序运行时候才知道会创建哪些对象,这部分内存的分配和回收具有动态性,即垃圾回收主要关注的部分。

确定回收对象

引用计数法:给对象中添加一个计数器,每当对象被引用时计数+1,引用失效时计数-1,且当计数器为0时就是不再被使用的。但是Java中没有用这种办法来管理内存,原因是很难解决对象互相引用的问题。

引用:为了达到更好的效果引用不是一个非黑即白的概念,java1.2后将引用分为强引用、软引用、弱引用、虚引用,强度逐一减弱。即当内存不足时优先处理弱的引用。

回收方法区:方法区(永久代)的垃圾收集主要回收两类:废弃常量和无用的类。

垃圾收集算法

标记-清除:标记处所有需要回收的对象,标记完成后统一回收被标记的对象。缺点是标记和清除时效率都不高,而且清理完成后会产生大量不连续的内存空间。

复制算法:为了提高效率而出现,将内存按容量分为大小相等的两块,每次只使用一块,当一块的内存满了的时候把还存活的对象复制到另一个块中,并清除之前块的内存。现在大部分虚拟机都采用这种方法收回新生代内存,由于新生代对象98%都是朝生夕死的,所以把内存分为一块较大的Eden空间和两块Survivor空间(8:1),每次使用Eden和其中一块Survivor空间,回收时把存活的对象复制到另一个Survivor空间中并回收掉刚才用的空间。当Survivor空间不够用时需要依赖其他内存(老年代)进行担保分配,即直接进入老年代。

标记-整理:与标记-清除类似,但不是直接对可回收对象进行清理,而是将将所有存活对象移到一端,清除这端边界之外的。

分代收集算法:堆内存分为新生代和老年代;新生代复制算法,老年代使用标记-清除/整理算法。

《深入理解Java虚拟机:JVM高级特性与最佳实践》复习笔记

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值