当前位置:网站首页>【JVM】内存模型
【JVM】内存模型
2022-06-10 22:53:00 【翔哥学大数据】
目录
jvm内存模型
jvm内存模型可以分为两个部分,如下图所示,堆和方法区是所有线程池共有的,而虚拟机z虚拟机栈,本地方法栈和程序计数器是线程私有的

1.堆(Heap)
堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。下图中的Perm代表永久代,但是注意永久代并不属于堆内存中的一部分,同时jdk1.8过后用永久代也将被移除。

堆是java虚拟机所管理的内存中最大的一块内存区域,也是被各个线程共享的内存区域,该内存区域存放了对象实例及数组(但不是所有的对象实例都在堆中)。其大小通过-Xms(最小值)和-Xmx(最大值)参数设置(最大最小值都要小于1G),前者为启动时申请的最小内存,默认为操作系统物理内存的1/64,后者为JVM可申请的最大内存,默认为物理内存的1/4,默认当空余堆内存小于40%时,JVM会增大堆内存到-Xmx指定的大小,可通过-XX:MinHeapFreeRation=来指定这个比列;当空余堆内存大于70%时,JVM会减小堆内存的大小到-Xms指定的大小,可通过XX:MaxHeapFreeRation=来指定这个比列,当然为了避免在运行时频繁调整Heap的大小,通常-Xms与-Xmx的值设成一样。堆内存 = 新生代+老生代+持久代。在我们垃圾回收的时候,我们往往将堆内存分成新生代和老生代(大小比例1:2),新生代中由Eden和Survivor0,Survivor1组成,三者的比例是8:1:1,新生代的回收机制采用复制算法(当一次GC发生时把Eden和一个survivor中存活的对象放到另一块survivor中),在Minor GC的时候,我们都留一个存活区用来存放存活的对象,真正进行的区域是Eden+其中一个存活区,当我们的对象时长超过一定年龄时(默认15,可以通过参数设置),将会把对象放入老生代,当然大的对象会直接进入老生代。老生代采用的回收算法是标记整理算法。
2.方法区
方法区也称”永久代“,它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB(64位JVM由于指针膨胀,默认是85M),可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。它是一片连续的堆空间,永久代的垃圾收集是和老年代(old generation)捆绑在一起的,因此无论谁满了,都会触发永久代和老年代的垃圾收集。不过,一个明显的问题是,当JVM加载的类信息容量超过了参数-XX:MaxPermSize设定的值时,应用将会报OOM的错误。参数是通过-XX:PermSize和-XX:MaxPermSize来设定的。
3.虚拟机栈
描述的是java方法执行的内存模型:每个方法被执行的时候都会创建一个”栈帧”,用于存储局部变量表(包括参数)、操作栈、方法出口等信息。每个方法被调用到执行完的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。声明周期与线程相同,是线程私有的。栈帧由三部分组成:局部变量区、操作数栈、帧数据区。局部变量区被组织为以一个字长为单位、从0开始计数的数组,和局部变量区一样,操作数栈也被组织成一个以字长为单位的数组。但和前者不同的是,它不是通过索引来访问的,而是通过入栈和出栈来访问的,可以看作为临时数据的存储区域。除了局部变量区和操作数栈外,java栈帧还需要一些数据来支持常量池解析、正常方法返回以及异常派发机制。这些数据都保存在java栈帧的帧数据区中。
局部变量表: 存放了编译器可知的各种基本数据类型、对象引用(引用指针,并非对象本身),其中64位长度的long和double类型的数据会占用2个局部变量的空间,其余数据类型只占1个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在栈帧中分配多大的局部变量是完全确定的,在运行期间栈帧不会改变局部变量表的大小空间。
4.本地方法栈
与虚拟机栈基本类似,区别在于虚拟机栈为虚拟机执行的java方法服务,而本地方法栈则是为Native方法服务。(栈的空间大小远远小于堆)
5.程序计数器
是最小的一块内存区域,它的作用是当前线程所执行的字节码的行号指示器,在虚拟机的模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能都需要依赖计数器完成。
直接内存
直接内存并不是虚拟机内存的一部分,也不是Java虚拟机规范中定义的内存区域。jdk1.4中新加入的NIO,引入了通道与缓冲区的IO方式,它可以调用Native方法直接分配堆外内存,这个堆外内存就是本机内存,不会影响到堆内存的大小.
转载于
https://www.cnblogs.com/itsharehome/p/11290907.html
常见面试题
1.说明一下一个对象从new开始与内存的交互
边栏推荐
- 【无标题】
- [turtle confessions collection] "the moon at the bottom of the sea is the moon in the sky, and the person in front of us is the sweetheart." Be happy for the rest of your life, and be safe for ever ~
- From the perspective of Confucius Temple IP crossover, we can see how the six walnuts become "butterflies" for the second time
- When leaving the web page, the website displays 404 Not found- starze V Club
- 【Pygame小游戏】来了来了它来了——这款五子棋小游戏超A的,分享给你的小伙伴儿一起pk吧~
- MP框架基本操作(自用)
- CSDN daily practice -- half search of ordered table
- Bluetooth development (2) -- initialization
- CSDN daily practice - find the closest element and output the subscript
- LabVIEW uses the visa read function to read USB interrupt data
猜你喜欢

Leetcode-209 minimum length subarray

【漫天烟花】绚烂烟花点亮夜空也太美了叭、某程序员携带烟花秀给大家拜年啦~

示波器和频谱分析仪的区别

SystemVerilog (x) - user defined type

How to measure the refresh rate of oscilloscope

LabVIEW programming specification

Bluetooth development (7) -- L2CAP layer connection process

Kubernetes 基本介绍及核心组件

How to check the variable waveform when debugging the program? Look here

Things about Bluetooth development (1) -- starting with packet capturing data
随机推荐
Insert sort
【Pygame小游戏】这款“打地鼠”小游戏要火了(来来来)
About optimizing API interface response speed
[turtle confessions collection] "the moon at the bottom of the sea is the moon in the sky, and the person in front of us is the sweetheart." Be happy for the rest of your life, and be safe for ever ~
MultipartFile重命名上传
【数学】【连续介质力学】流体力学中的对称张量、应变张量和应力张量
Error 1046 when LabVIEW uses MathScript node or matlab script
[pyGame] this "groundhog" game is going to be popular (come on, come on)
In the month of safety production, Huangpu launched a publicity campaign for gas safety in shops
Basic introduction and core components of kubernetes
Select sort
Deepin20菜单启动选项后自检到iwlwifi停机
[pyGame collection] memory killing - "Childhood Games", how many shots did you get? (attach five source codes for self access)
Wireshake introduction learning notes
OpenResty安装
Redis installation and common problem solving based on centeros7 (explanation with pictures)
Website online customer service system Gofly source code development log - 5 Gin framework integration daemon
【Pygame小游戏】别找了,休闲游戏专题来了丨泡泡龙小程序——休闲游戏研发推荐
【Opencv实战】寒冷的冬季,也会迎来漫天彩虹,这特效你爱了嘛?
插入排序