深入理解JAVA虚拟机(三)内存分配与回收机制
来源:互联网 发布:常见文本文件格式知乎 编辑:程序博客网 时间:2024/05/29 13:17
一.JAVA内存
Java的内存通常分为堆内存和非堆内存,堆内存由 Java 对象使用,非堆内存则用于存放 JNI、Java 线程对象等非 Java 数据。示意图如下所示:
堆内存结构如下所示:
二.垃圾收集
JVM Generational Collecting(分代)原理是这样的:把对象分为年青代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的算法。(基于对对象生命周期分析)
如上图所示,为 Java 堆中的各代分布。
1. Young(年轻代)
年轻代分三个区。一个 Eden 区,两个 Survivor 区。大部分对象在 Eden 区中生成。 幸存者 0 区(Survivor 0 space)和幸存者 1 区(Survivor1 space):当伊甸园的空间用完时,程序又需要创建对象;此时 JVM 的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁工作。同时将伊甸园中的还有其他对象引用的对象移动到幸存者 0 区。幸存者 0 区就是用于存放伊甸园垃圾回收时所幸存下来的 JAVA 对象。当将伊甸园中的还有其他对象引用的对象移动到幸存者 0 区时,如果幸存者 0 区也没有空间来存放这些对象时,JVM 的垃圾回收器将对幸存者 0 区进行垃圾回收处理,将幸存者 0 区中不在有其他对象引用的 JAVA 对象进行销毁,将幸存者 0 区中还有其他对象引用的对象移动到幸存者 1 区。幸存者 1 区的作用就是用于存放幸存者 0 区垃圾回收处理所幸存下来的JAVA 对象。
2.Tenured(年老代)
年老代存放从年轻代存活的对象。一般来说年老代存放的都是生命期较长的对象。
3.Perm(持久代)
用于存放静态文件,如今 Java 类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些 class,例如 Hibernate 等, 在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类。持久代大小通过-XX:MaxPermSize=进行设置。
举个例子:当在程序中生成对象时,正常对象会在年轻代中分配空间,如果是过大的对象也可能会直接在年老代生成(据观测在运行某程序时候每次会生成一个十兆的 空间用收发消息,这部分内存就会直接在年老代分配)。年轻代在空间被分配完的时候就会发起内存回收,大部分内存会被回收,一部分幸存的内存会被拷贝至 Survivor 的 from 区,经过多次回收以后如果from区内存也分配完毕,就会也发生内存回收然后将剩余的对象拷贝至to区。等到 to 区也满的时 候,就会再次发生内存回收然后把幸存的对象拷贝至年老区。
通常我们说的 JVM 内存回收总是在指堆内存回收,确实只有堆中的内容是动态申请分配的,所以以上对象的年轻代和年老代都是指的 JVM 的 Heap 空间,而持久代则是之前提到的 Method Area,不属于 Heap。
补充:http://blog.csdn.net/wzy_1988/article/details/47722649
- 深入理解JAVA虚拟机(三)内存分配与回收机制
- 深入理解Java虚拟机 三、内存分配与回收
- 深入理解Java虚拟机笔记---内存分配与回收策略
- 深入理解java虚拟机-3 内存分配与回收策略
- 深入理解Java虚拟机笔记---内存分配与回收策略
- 深入理解java虚拟机-内存分配与回收策略
- Java内存区域分配、存储、垃圾回收策略与回收机制(深入JVM虚拟机)
- JAVA虚拟机内存分配与回收机制
- JAVA虚拟机内存分配与回收机制
- JAVA虚拟机内存分配与回收机制
- JAVA虚拟机内存分配与回收机制
- 《深入理解Java虚拟机》学习笔记(3)--内存分配与回收策略
- Java虚拟机(三):内存分配与回收策略
- 《深入理解Java虚拟机》——内存自动管理:内存分配与回收
- 深入理解java虚拟机(六):java垃圾收集分析实战(内存分配与回收策略)
- 深入理解java虚拟机(六):java垃圾收集分析实战(内存分配与回收策略)
- 《深入理解Java虚拟机》——垃圾回收与内存分配
- 《深入理解Java虚拟机》读书笔记——内存分配与回收策略
- [学习笔记]认识Android Service
- hdu 2612 Find a way ( 双bfs )
- 限制QLineEdit的数值输入范围(QT正则表达式方法),顺便简单介绍下QT正则表达式方法
- 【机房重构】配置文件
- spring框架一之属性值的初始化
- 深入理解JAVA虚拟机(三)内存分配与回收机制
- 标准C++中的string类的用法总结
- PID的快速理解与掌握
- 函数中的数组传递
- BZOJ 2306 [Ctsc2011] 幸福路径 [倍增+floyd做法]
- 机器学习的相关模块安装:pandas,numpy, scipy,scikit_learn(sklearn), matplotlib在winows系统下的安装问题
- swjtu2381(Matrix)
- Java过滤器与SpringMVC拦截器之间的关系与区别
- Hbase<踩过的坑--使用intellij idea调用JavaAPI创建预分区>