JVM学习总结一——内存模型
来源:互联网 发布:淘宝api推广 编辑:程序博客网 时间:2024/06/06 01:33
一、JVM内存模型
JVM典型的内存模型如下图:
程序计数器
线程私有学过组成原理的对这个一定很亲切,这里相当于JVM版的,作用是当前线程所执行的字节码的行号指示器,通俗讲就是记录当前正在执行字节码的位置,以便解释器能获取下一行字节码。
虚拟机栈
线程私有
用于存储局部变量表(包括参数)、操作数栈、方法出口等信息,栈解决程序的运行问题,即程序如何执行,或者说如何处理数据,代表了处理逻辑
堆线程共享
存放了对象实例及数组(所有new的对象),也是我们做GC处理的最为关注的一部分内存区域,堆解决的是数据存储的问题,即数据怎么放、放在哪儿,代表了数据
方法区线程共享
存储虚拟机加载的类信息、常量、静态变量,在分代回收中也可认为永久代(不同虚拟机实现不同,这里只是为了方便理解)
本地方法栈线程私有
作用与虚拟机栈类似,但是调用方法都为Native本地方法,如调用C的DLL库方法等直接内存线程共享
这部分内存并不在JVM内存分区之内,主要是调用Native方法分配的内存,由于这些方法不是有JVM执行的,其内存也不归JVM管理
我们讨论JVM分区时,经常也会提到GC(垃圾回收)内存划分,对于很多不熟悉的人来说,经常搞不清两者的区别。JVM分区主要是JVM运行时对物理内存根据用途划分区域,而GC分区主要是针对分代垃圾回收机制对JVM相关分区(主要是堆内存)进行划分。为了解释这一问题,我们先来提前了解下分代来及回收机制。
分代垃圾回收主要是为了使不同生命周期的对象可以采取不同的收集方式,以便提高回收效率,我们知道对象有可能很快该释放,也可能很长时间一直存活,如果在回收时采用一样的策略,往往会顾此失彼(原因在回收算法部分会详解),因此应该采用不同策略:对于生命周期较短的区域可以gc频繁一点,而较长的少一点。我们先来看下GC内存划分:
可以看到该部分分为三大块:年轻代(young generation),年老代(old generation)和持久代(permanent generation),其中年轻代分成三个区域,其中一个是Eden区,另外的两个From和To都是Survivor区(From和To只是为了说明,两者实质上一样,方向可互换)。现在我们来看一个对象简单的处理过程(图解参考):
- 对象会创建在Eden区
- 进行gc的时候,如果对象仍然存活,则复制到From区
- 当From区满的时候,该区存活对象将复制到To区,然后From清空,之后From和To角色互换
- 重复3到指定次数(可通过JVM参数指定)后,存活对象将会被复制到年老代
JVM内存模型介绍完毕,如有错误,望不吝指教。下一篇计划整理JVM垃圾回收算法部分。
0 0
- JVM学习总结一——内存模型
- JVM学习笔记(一)——Java内存模型
- JVM学习笔记(一)——内存模型
- JVM 学习笔记(一) JVM内存模型
- JVM(一)—Java内存模型
- 深入理解JVM(一)——JVM内存模型
- 深入理解JVM(一)——JVM内存模型
- 深入理解JVM(一)——JVM内存模型
- 深入理解JVM(一)——JVM内存模型
- 深入理解JVM(一)——JVM内存模型
- 浅谈JVM(一)——JVM内存模型
- JVM内存模型学习(一、什么是内存模型)
- 一 JVM内存模型
- jvm内存模型总结
- JVM内存模型学习
- 读书笔记(一)——JVM内存模型分析
- JVM内存管理学习总结(一)
- 深入理解JVM—JVM内存模型
- UGUI学习笔记(四)UGUI事件系统简述及使用方法总结
- IOS-AppStore上架审核各个屏幕截图尺寸
- 记录 十进制转换为二进制并输出奇数位和偶数位序列
- x265 命令行参数大全(比较详细)
- Git
- JVM学习总结一——内存模型
- 避免表单重复提交
- java设计模式之单例模式
- iOS开发中@synthesize obj=obj的意义详解
- 卡片游戏
- SNMP报文抓取与分析(一)
- 系统学习深度学习(二十五)--CNN调优总结
- 转:使用Maven创建多module工程时,子module的pom文件报 must be "pom" but is "jar" 错误。
- 语料预处理的坑