ITPub博客

首页 > 应用开发 > Java > 带你清晰认识,Java虚拟机内存管理!

带你清晰认识,Java虚拟机内存管理!

Java 作者:陕西优就业 时间:2019-01-03 11:38:58 0 删除 编辑

Java虚拟机规范将物理内存(主内存和CPU中的缓存、寄存器)划分为程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区五个区域,但并没有规定这些区域的具体实现,在其他地方听到的一些名词(如永久代、元空间等,这些都是方法区的具体实现)可能都是这些区域具体的实现,这点要特别注意,别被这些概念搞晕。

接下来,就和 陕西优就业 小编详细了解一下吧!

1、类加载器:

类加载器分为 Bootstrap 、 Extension ClassLoader (Java9 中是 Platform ClassLoader)、 Application ClassLoader,级别也是从低到高。

可以调用类加载器对象的 getParent() 方法查找该级加载器的上一级加载器,也成为父类加载器。

可以根据需要继承 Application ClassLoader 实现自定义类加载器,隔离加载器、修改类的加载方式、扩展加载源、防止源码泄露。

2、类加载的过程:

类加载是将字节码文件实例化成 Class 对象并进行相关初始化的过程。类加载包括类的 加载 (Load)、类的 链接(Link)、类的 初始化 (init)三个步骤。

类的加载是将字节码文件以二进制流的方式读取到内存中并转化为特定的数据结构,检查 cafe baby 这个魔法数(是不是Java文件的标志),是否有父类等,创建类对应的 Class 对象。

类的链接又分为 验证 、 准备 、 解析 三个阶段,验证阶段是进行更加详细的校验,如类型是否正确,静态变量是否合理等;准备阶段是为类的静态变量分配内存空间,并设定默认值;解析阶段是保证类和类之间相互引用的正确性,完成类在内存中的结构布局。

3、访问对象的两种方式:

Java虚拟机栈中的局部变量表存放的数据除了基本的数据类型外,还有对象的引用类型(reference),这关系到如何访问一个对象。

在不同的虚拟机中,对象的访问方式也是不同的,主流的访问方式有 使用句柄 和 直接指针 两种。

4、判断对象是否可以回收的算法:

垃圾回收之前需要判断对象是否可以回收,常见的判断算法有引用计数算法和可达性分析算法。

引用计数算法:

每个对象都有对应的引用计数器,当有一个地方引用该对象时,就将引用计数器的值加1,当引用失效时,就将引用计数器的值减1,当计数器的值为0时,表示对象没有引用,可以被回收了。

缺点:看起来简单高效,但是有循环引用问题。如果两个对象中包含对方的引用就会产生循环引用问题,导致垃圾收集器不能回收对象。

可达性分析算法:

如果对象与GC Roots 之间没有直接或间接的应用关系,就可以被回收了。常见的 GC Roots 对象包括虚拟机栈(栈帧本地变量表)中引用的对象、方法区中静态属性引用的对象、方法区常量引用的对象、本地方法栈中(Native 方法)引用的对象。GC Roots,是一个特殊的对象,且绝对不能被其他对象引用,不然也会像引用计数算法那样有循环引用的问题。

5、常见的垃圾回收算法:

标记-清除算法

最基本的垃圾回收算法,后续的算法都是对它的改进。

首先标记出需要回收的对象,再将标记出的区域内容清除。

缺点是:标记时的查找效率,清除时产生内存碎片。

6、常见的垃圾回收器:

Serial 回收器

Serial Old (PS MarkSweep)回收器

ParNew 回收器

Parallel Scavenge 回收器

Parallel Old 回收器

CMS 回收器

G1 回收器


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69902581/viewspace-2295415/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2018-12-13

  • 博文量
    92
  • 访问量
    70138