Java虚拟机内存管理该怎么理解
今天就跟大家聊聊有关Java虚拟机内存管理该怎么理解,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
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 回收器
看完上述内容,你们对Java虚拟机内存管理该怎么理解有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341