在了解jvm内存模型前我们先回顾下,java程序的执行过程
java文件在通过java编译器生产.class 字节码文件,然后由jvm中的类加载器加载各个类中的字节码文件,加载完成后由jvm执行引擎执行,在整个加载过程中,jvm用一段空间来存储程序执行期间需要的数据和相关信息,这个空间就叫做jvm内存
入下图将展示jvm内存模型
下面我们来简要分析上图各个模块
上图所示就是我们经常会看到的JVM内存模型
1:本地方法栈:线程私有的对于java虚拟机来说,本地方法栈主外,而虚拟机栈主内,因为本地方法栈为native方法提供服务,线程开始调用本地方法时,会进入一个不再受JVM约束的世界。
2:虚拟机栈:是一个fifo的数据结构,JVM中虚拟机栈是描述java方法执行的内存区域,它是线程私有的,栈中的元素用于支持虚拟机进行方法调用,每个方法从开始调用到执行完成的过程,就是栈帧从入栈到出栈的过程。
包括这些:局部变量表,操作栈,动态链接,方法返回地址
局部表量表:是存放方法参数和局部变量的区域。相对于类属性变量的准备阶段和初始阶段
操作栈:是一个初始状态为空的桶试结构栈
动态链接:每个栈帧中包含一个在常量池中对当前方法的引用,目的是支持方法调用过程的动态链接
方法返回地址:方法执行时有两种退出情况:第一,正常退出,即正常执行到任何方法的返回字节码指令,入return等;第二:异常退出。无论哪种方式退出,都将返回至方法当前被调用的位置。
3:程序计数器:每个线程运行时都有自己的程序计数器和栈帧,程序计数器用来存放执行指令的偏移量和行号指示器等,线程的执行或者恢复执行都需要依赖程序计数器
4:方法区(jdk1.7以前叫做永久代,jdk1.8变成元空间的叫法了):包含了类信息,静态属性,常量等
永久代的缺点是:在启动时固定大小,不利于jvm调优。并且fullGC时会移动类元信息。在某些场景下,如果动态加载类过多,容易产生Perm区的OOM
jdk8版本及以上:将永久代替换为元空间,区别于永久代,元空间子在本地内存,所有的内容中字符串常量移至堆内存
5:堆:存储所有实例化的对象,堆由垃圾收集器自动回收。(昨天那篇文章讲过垃圾收集器)
------------------------------------------
希望能帮助初学者,如果有不同的看法可以留言讨论!
留言与评论(共有 0 条评论) |