JVM-内存模型
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- JVM-内存模型
- 一、JVM内存模型?
-
- 1.1线程共享的
-
- (1)堆
- (2)方法区
-
- 1 运行时常量池
- (3)常用参数
- (4)为什么要元空间取代永久代呢?
- 1.1线程私有
-
- (1)虚拟机栈
- (2)本地方法栈
- (3)程序计数器
- 总结
提示:以下是本篇文章正文内容,下面案例可供参考
一、JVM内存模型?
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwIzXlpXazxSP9cmYwFjMitUNwEVQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2ATZkNmYyYjNxImZwUTZhFmYmRjMxI2YyUTO4kzNxQ2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.1线程共享的
堆、方法区
(1)堆
- Head,java虚拟机管理内存区域最大的一块区域,java堆是所有线程共享的一块区域,此区域唯一目的就是存放实例对象,几乎是所有实例对象以及数组都存在这里。
- java堆是垃圾回收器管理的主要区域,因此被称为GC堆。java堆还可以细分为:新生代和老年代:再细致一点就是:Eden、S0、S1、tentired。大多数情况下,对象都会率先存在Eden区域分配,在一次新生代垃圾回收后,如果对象还活着则会进入S0或S1,并且对象的年龄会+1(Eden区->Survivor区后对象的初始年龄变为1),当默认年龄到达15之后,会被加到老年代。对象晋升的阈值可以通过参数:-XX:MaxTenuringThreshold来设置。
JVM-内存模型JVM-内存模型一、JVM内存模型?总结
(2)方法区
线程的共享区域,用于存储已被虚拟机加载的类信息、常量、静态变量等。方法区也被称为永久代,但是实质上永久代是方法区规范的实现。
1 运行时常量池
运行时常量池是方法区的一部分,Class文件除了有类的版本、字段、方法、接口等描述信息之外,还有常量池信息。JDK1.7之后已经将常量池从方法区中移除出来,在堆中开辟了一块区域存放运行时常量池。
(3)常用参数
- JDK1.8移除了永久代,取而代之的是元空间,元空间使用的是直接内存。与永久代很大不同的是,永久代如果不指定大小的话会随着类对象的创建,虚拟机会耗尽所有可用的内存。
-XX:MetaspaceSize=N//设置MetaspaceSize大小
-XX:MaxMetaspaceSize=N//最大值
(4)为什么要元空间取代永久代呢?
整个永久代有一个JVM本身设置固定值大小上线,无法进行处理。元空间使用的是直接内存,受本机可用内存的限制,并不会内存溢出。当然可以设置元空间大小在一个区间。这只是其中一个原因。。。
1.1线程私有
虚拟机栈、本地方法栈、程序计数器
(1)虚拟机栈
java虚拟机栈是由一个栈帧组成,每个栈帧中都拥有:局部变量表、操作数栈、动态链表、方法出口信息等。java虚拟机栈是线程私有的。局部变量表中存放了编译期存放的各种数据类型(Boolean、byte、char、short、int、float、long、double);对象引用可能是一个指向对象起始地址的引用地址,也可能是指向代表对象句柄或者对象相关的位置。
(2)本地方法栈
虚拟机栈和本地方法栈作用相似,区别在于虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为了虚拟机使用到的本地方法服务。
(3)程序计数器
字节码解析器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、异常处理、线程恢复等功能都需要这个程序计数器完成。每条线程都需要有一个独立的程序计数器,互相之间不影响,独立存储。有两个作用:
- 字节码通过解析器改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。
- 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到那里。
总结
例如:JVM内存模型的简单介绍