【Java】关于JVM运行时内存空间、JVM垃圾回收机制
参考的优秀文章
- 《深入理解Java虚拟机 JVM高级特性与最佳实线》(机械工业出版社)
- Java虚拟机的堆、栈、堆栈如何去理解?
- 聊聊JVM的年轻代
前言
本文是《深入理解Java虚拟机 JVM高级特性与最佳实线》(机械工业出版社)的读书笔记,记录阅读后的部分理解。推荐这本书,深入浅出讲解了Java虚拟机的知识。
疑问及解答
Java运行时有哪几个常用的内存空间?
- PC寄存器
- Java虚拟机栈
- 本地方法栈
- Java堆
- 方法区
PC寄存器
PC为Program Counter的意思,用于记录代码执行的位置。Java是支持多线程的,同时可能有多处代码同时执行,每个线程都需记录各自代码执行的位置,因此,PC寄存器是线程私有的。
用栈来存储什么信息?
Java栈是执行方法时用来存放方法执行所需的信息。一个方法的信息存放为一个栈帧(栈的元素)。一个栈帧包含一个方法所需的信息,包括属性,如8大基本类型、引用类型(栈中只存放引用,实际的对象存放在堆中,后面介绍)和返回地址。
为什么使用栈的数据结构来存储?
因为栈的后进先出特性与方法调用的生命周期特性相吻合。看下图,会让你有所启示。
sequenceDiagram
1方法->>2方法: 调用2方法,入栈(先入栈)
2方法->>3方法: 调用3方法,入栈(后入栈)
3方法->>2方法: 3方法执行完毕,出栈(先出栈)
2方法->>1方法: 2方法执行完毕,出栈(后出栈)
堆空间分布的宏观了解
堆的空间分为:
- 新生代区。主要存放新生代的对象,又可以进一步分为Eden、From Survivor、To Survivor,区如其名,Eden意为“伊甸园”,Survivor意为“幸存者”,他们存放的对象特点相信大家通过其名称能够理解。对象优先在伊甸园分配,对象熬过了一次Minor GC后,可移到幸存区,对象的年龄(age)会加1。
- 老年代区。一般情况下存放长期存活的对象。
- 永久代区。用来存放类信息,想想方法区。
有哪些内存回收算法,及其特点
- 标记-清除算法。标记垃圾对象,然后统一清除。这个算法一个明显的缺点是会造成内存空间不连续。一般用在老年代区。
- 标记-整理算法。标记垃圾对象,然后整理内存空间,整理出连续的内存空间。此算法为标记-清除算法的优化。一般用在老年代区。
- 复制算法。将内存中存活对象复制到To survivor区,然后清空该空间,这样就获得了一块连续的内存空间。鉴于此算法的特点,它不适用于存活对象较多的内存空间,所以一般用在新生代区中。
To survivor与From survivor的区别
使用复制算法对新生代区垃圾回收时,首先将Eden中存活对象复制到To survivor(To survivor此时应该是空的),将From survivor超过年龄阀值的对象复制到老年代区,其他未到年龄的存活对象复制到To survivor,然后清空Eden和From survivor空间,这样就得到了连续可用的内存空间了。然后,From survivor和To survivor对换,这样,From survivor装的是幸存对象,To survivor是空的。
附:
- Eden与Survivor的空间比例默认是8:1,此比例可通过“-XX:SurvivorRatio”参数设置。
- 对象优先分配到Eden(Eden是“伊甸园”的意思,而伊甸园是人类诞生的地儿),熬过一次Minor GC后,对象被移动到Survivor,对象的年龄加1,到达一定年龄阀值可晋升老年代。年龄阀值可通过“-XX:MaxTenuringThreshold”参数配置。
- 复制算法一般适用于新生代区的Minor GC,将存活对象复制到To survivor时,如果存活对象较多较大,会出现To survivor空间不足的情况,需要老年代区作担保,所谓担保,就是由老年代区装这些溢出的对象。极端情况下,连老年代区也有可能不够空间,有一个参数“-XX:-HandlePromotionFailure”设置是否允许担保失败。Minor GC前,如果老年代区的空间大于新生代区,则Minor GC是无空间风险的,可以直接进行Minor GC;否则查看参数是否允许担保失败,如果允许,并且老年代区最大可用空间大于历次晋升到老年代区对象的平均大小,则Minor GC;如果不允许,则进行Full GC。
【Java】关于JVM运行时内存空间、JVM垃圾回收机制的更多相关文章
- JVM运行时数据区和垃圾回收机制
最近参考各种资料,尤其是<深入理解Java虚拟机 JVM高级特性和最佳实践>,大牛之作.把最近学习的Java虚拟机组成和垃圾回收机制总结一下. 你不会的都是新知识,学无止境,每天进步一点点 ...
- Java运行时内存划分与垃圾回收--以及类加载机制基础
----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字 ...
- JVM 运行时内存结构
1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持久带=方法区+其他 堆=Old Space ...
- JVM运行时内存结构
原文转载自:http://my.oschina.net/sunchp/blog/369707 1.JVM内存模型 JVM运行时内存=共享内存区+线程内存区 1).共享内存区 共享内存区=持久带+堆 持 ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- [转]JVM运行时内存结构
[转]http://www.cnblogs.com/dolphin0520/p/3783345.html 目录[-] 1.为什么会有年轻代 2.年轻代中的GC 3.一个对象的这一辈子 4.有关年轻代的 ...
- JVM02——JVM运行时内存
在上一篇文章中,我们介绍了 JVM 的内存区域,本文我们将继续围绕 JVM 展开话题,介绍 JVM 运行时内存.关注我的公众号「Java面典」了解更多 Java 相关知识点. Java 堆从 GC 的 ...
- 基础篇:JVM运行时内存布局
目录 1 JVM的内存区域布局 2 JVM五大数据区域介绍 3 JVM运行时内存布局和JMM内存模型区别 4 JMM内存模型交互操作 欢迎指正文中错误 关注公众号,一起交流 参考文章 1 JVM的内存 ...
- 详细了解JVM运行时内存
详细了解JVM运行时内存 1.程序计数器 概念 程序计数器也叫作PC寄存器,是一块很小的内存区域,可以看做是当前线程执行的字节码的行号指示器.字节码的解释工作就是通过改变程序计数器里面的值来获得下一条 ...
随机推荐
- Total Commander 常用快捷键(并附快捷键大全)
Total Commander 常用快捷键 喜欢用Total Commander的人,都会记住它的一些快捷键,这会给你的操作带来很大的方便,以下是经常会用到的快捷键,大家可以记住一些自己用得最多的操作 ...
- MBR(Master Boot Record)主引导记录分析
root@ubuntu1404:/home/chen# fdisk -l /dev/sda1 Disk /dev/sda1: MB, bytes heads, sectors/track, cylin ...
- 【iCore3 双核心板】例程八:定时器PWM实验——呼吸灯
实验指导书及代码包下载: http://pan.baidu.com/s/1dEnH5dB iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore3 双核心板_FPGA】实验十七:基于I2C总线的ARM与FPGA通信实验
实验指导书及代码包下载: http://pan.baidu.com/s/1dFqddMp iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- JS中的_proto_
var grandfather = function(){ this.name = "LiuYashion" ; } var father = function(){}; fath ...
- WordPress 添加面包屑导航
所谓面包屑,就是类似这种:首页 > 公司简介 > 发展历史 展示网站树型结构,并让网站访问者随时知道自己所处的位置,方便返回上几级. 将下面的代码添加到主题的 functions.php ...
- iOS cocospods Updating local specs repositories
pod install --verbose --no-repo-update (在安装的时候) pod update --verbose --no-repo-update (在更新库的时候) 如果长时 ...
- 如何用按钮的click事件去触发a标签的click事件
在jQquery中,可以用如下方式触发input.a标签的click事件: <input id="my_input" /> <a id="my_a&qu ...
- MySql超新手入门
https://www.kancloud.cn/thinkphp/mysql-tutorial/36457
- 用nstimer实现倒计时
用nstimer实现倒计时 // [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFir ...