jvm内存模式详解

java内存模式详解

1.java内存主要由五部分组成,分别是程序计数器、jvm栈、本地方法栈、堆以及方法区。

2.程序计数器:线程私有,生命周期随着线程的创建而创建,随着线程的销毁,占用很少的内存空间,不会出现内存溢出。作用是标示下一条需要执行的指令的位置,分支、循环、跳转、异常处理、线程恢复等基础功能都是依赖程序计数器完成的。

3.jvm栈:java方法运行时分配的内存,jvm栈会为每个即将运行的java方法分配一个叫帧栈的区域,用来存储方法运行时所需的信息,信息主要包括局部变量表、操作数栈、动态链接以及方法出口信息,线程私有的,生命周期随着线程的创建而创建,随着线程的销毁。

4.本地方法栈:功能与jvm栈类型,只不过是java本地方法(native关键字修饰的方法,通常比较底层,用于链接操作系统与java)时分配的内存模型。

5.堆:垃圾回收的主要内存。用来存放实例化的对象以及数组等。JVM堆内存分为2块:Permanent Space 和 Heap Space。又分为三代,新生代,年老代以及永久代。年轻代包括一个eden和两个survior,往往使用复制垃圾回收算法(Young GC)进行回收。年老代存放生命周期比较长的数据(通过反射产生的class对象),年老代采用标记-清除Gc算法跟标记-整理GC算法(FULL GC)。永久代用来存放静态变量以及通过java反射产生的class对象。
jvm对内存模型图:
这里写图片描述

上图中,刻画了Java程序运行时的堆空间,可以简述成如下2条
1.JVM中堆空间可以分成三个大区,新生代、老年代、永久代
2.新生代可以划分为三个区,Eden区,两个幸存区
在JVM运行时,可以通过配置以下参数改变整个JVM堆的配置比例
1.JVM运行时堆的大小
-Xms堆的最小值
-Xmx堆空间的最大值
2.新生代堆空间大小调整
-XX:NewSize新生代的最小值
-XX:MaxNewSize新生代的最大值
-XX:NewRatio设置新生代与老年代在堆空间的大小
-XX:SurvivorRatio新生代中Eden所占区域的大小
3.永久代大小调整
-XX:MaxPermSize
4.其他
-XX:MaxTenuringThreshold,设置将新生代对象转到老年代时需要经过多少次垃圾回收,但是仍然没有被回收
在上面的配置中,老年代所占空间的大小是由-XX:SurvivorRatio这个参数进行配置的,看完了上面的JVM堆空间分配图,可能会奇怪,为啥新生代空间要划分为三个区Eden及两个Survivor区?有何用意?为什么要这么分?要理解这个问题,就得理解一下JVM的垃圾收集机制(复制算法也叫copy算法),步骤如下:
6.方法区:属于堆内存的一部分

这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42925196/article/details/81701112