JVM的内存管理

news/2024/7/20 13:36:18 标签: 内存管理, java
所有的数据和程序都是在运行数据区存放,它包括以下几部分:
Stack 栈
栈也叫栈内存,是Java程序的运行区,是在线程创建时创建,它的生命期是跟随线程的生命期,线程结束栈内存也就释放,对于栈来说不存在垃圾回收问题,只要线程一结束,该栈就Over。问题出来了:栈中存的是那些数据呢?又什么是格式呢?
栈中的数据都是以栈帧(Stack Frame)的格式存在,栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“先进后出”原则。
那栈帧中到底存在着什么数据呢?栈帧中主要保存3类数据:本地变量(Local Variables),包括输入参数和输出参数以及方法内的变量;栈操作(Operand Stack),记录出栈、入栈的操作;栈帧数据(Frame Data),包括类文件、方法等等。
Heap 堆内存
一个JVM实例只存在一个堆类存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分为三部分:
Permanent Space 永久存储区
永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。
Young Generation Space 新生区
新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分:伊甸区(Eden space)和幸存者区(Survivor pace),所有的类都是在伊甸区被new出来的。幸存区有两个: 0区(Survivor 0 space)和1区(Survivor 1 space)。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存0区。若幸存0区也满了,再对该区进行垃圾回收,然后移动到1区。那如果1区也满了呢?再移动到养老区。
[img=450,346]file:///C:\Users\ThinkPad\AppData\Local\Temp\ksohtml\wps_clip_image-3207.png
Method Area 方法区
方法区是被所有线程共享,该区域保存所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
PC Register 程序计数器
每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。
Native Method Stack 本地方法栈

转载于:https://www.cnblogs.com/vipwolf/p/4403299.html


http://www.niftyadmin.cn/n/1277681.html

相关文章

TCP/IP详解学习笔记(6)-UDP协议

1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议。 2.UDP协议头 2.1.UDP端口号 由于很多软件需要用到UDP协议&#…

python参数解析

为什么80%的码农都做不了架构师?>>> 这个例子不错,希望大家好好学习。哈! https://github.com/ceph/ceph/blob/master/src/ceph-disk 转载于:https://my.oschina.net/itfanr/blog/397592

TCP/IP详解学习笔记(7)-广播和多播,IGMP协议

1.单播,多播,广播的介绍 1.1.单播(unicast) 单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说,就是网卡的MA…

[ZooKeeper]纠正官网的Barrier的示例

Barrier接口 public interface Barrier { String enter() throws InterruptedException, BarrierException; void leave(String path) throws InterruptedException, BarrierException; } 单机版的Barrier两个CountDownLatch就可以实现 import java.util.concurrent.CountD…

把Jar包程序变成一个windows服务,随开机启动

下载 WinSW.NET4.exe文件 github下载地址 把下载的WinSW.NET4.exe文件和需要变成windows服务的jar放在一个目录下 把WinSW.NET4.exe 的名称和jar包的名称修改成一样的 新建一个和jar包名称一样的xml文件 xml文件的样例&#xff1a; <service><id>seatingLog<…

[ZooKeeper]纠正官网的Queue示例

Queue接口 public interface Queue<E> {boolean produce(E e) throws InterruptedException, QueueException;E consume() throws QueueException, InterruptedException;}单机版的队列用BlockingDeque或BlockingQueue就能实现 import java.util.concurrent.BlockingDequ…

搭建通用的SSM框架 (五) 集成page插件,实现分页查询

1.mybatis相关sql和非分页一样该怎么写就怎么写&#xff0c;不用改变 2.引入pageHelper插件的jar包 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>${pagehelp…

QQ连连看-外挂

QQ连连看-外挂 2014-11-06 参考 [1] [视频教程] c语言实践课程之qq连连看辅助开发 [2] CE工具下载 [3] [原创]qq连连看外挂制作详解转载于:https://www.cnblogs.com/Ming8006/p/4079961.html