Java技术文章Java · 成长之路java学习

JVM内存模型的相关概念

2017-05-19  本文已影响423人  lanceJin

1.前言


Android的虚拟机是根据移动设备的特点基于Java虚拟机(JVM)改进而来,虽然没有保留规范,但作为Java语言的使用者,了解一下JVM的规范还是有必要的。

2.JVM内存模型


JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。如下图所示,可以分为两大部分,线程私有区和共享区:


Memory.png
2.1.线程私有区
2.2.线程共享区

此区域是用来存储被各线程共享的数据的。

2.3.注意事项

栈是运行时单位,代表着逻辑,内含基本数据类型和堆中对象引用,所在区域连续,没有碎片;堆是存储单位,代表着数据,可被多个栈共享(包括成员中基本数据类型、引用和引用对象),所在区域不连续,会有碎片。

3.垃圾回收


我们都知道调用 System.gc() 方法只是通知系统去回收,是否回收不能确定。

3.1.回收的判断

JVM中,将一个对象真正回收需经历两次标记过程,每次都是先判断对象有没有被持有引用,再判断对象是否必要执行 finalize() 方法。

3.2.垃圾收集算法

当确定哪些垃圾可以被回收后,需要做的就是高效地进行垃圾回收。由于JVM没有给出明确的规定,各厂商实现方式不同,这里只讨论常见垃圾收集算法的核心思想。

3.3.垃圾收集器

垃圾收集算法是理论,而垃圾收集器是实现。下面根据海子的文章列出HotSpot(JDK 7)提供的几种垃圾收集器。

4.内存分配


内存分配主要是在堆上分配,由于涉及到分配时某区域空间不足等问题,需结合垃圾收集器和JVM相关参数,所以规则不是固定的。

5.总结


到这里,基本上可以在写代码时大致知道对象的内存情况,所以一定要注意避免内存泄露及其导致的内存溢出问题。由于内容较深,大家可以参考这个系列文章

上一篇下一篇

猜你喜欢

热点阅读