-
JVM内存模型(运行时数据区)
一、JVM的运行制概要
如果要运行Java程序,首先要编写Java的源文件(*.java)之Java的编译器将源文件编译成对应的字节码文件(*.class文件),之后再通过类加载器将字节码文件(*.class)加载到jvm中,其中在 jvm 中与程序运行最密切的是运行时数据区( Runtime data area)。
要把class文件加载到jvm中的运行时数据区进行处理。
二、运行时数据区(JVM内存模型)
程序的运行最为重要的一块区域就是运行时数据区,其中运行时数据区可以分为如下几个子区域:
- 程序计数器:
程序计数器是用于存放下一条指令所在单元的地址的地方。
程序执行必须知道指令(计算机要通过指令才能执行),此时就需要从程序计数器中读取即将执行的指令的地址,通过这个地址就可以得到指令从而执行。
比如线程即将执行一个Java方法,此时要先从程序计数器中取得即将执行的虚拟机字节码指令的地址。
- 虚拟机栈:
该区域是线程私有的,虚拟机栈的生命周期和线程相同,在执行一个Java方法的时候会在该区域创建一个栈帧,栈帧用来保存局部变量表(在方法中定义的变量或者方法的参数都是方法的局部变量)、动态链接、方法出口、操作数栈等等信息,其实每个方法从执行到执行完毕就是一个入栈与出栈的过程。当入栈的速度大于出栈的速度的时候会出现栈内存溢出( Exception in thread "main" java.lang.StackOverflowError)。
- 本地方法栈:
本地方法栈和虚拟机栈的作用很相似,不同点是虚拟栈是为Java方法服务的,本地方法栈是为native方法服务的(这种本地方法是没有方法体的,可以算是一个抽象方法,具体的实现是本地操作系统的c语言写的一些函数库中的方法实现的)
- 堆:
堆是运行时数据区中最大的一块子区域,创建的实例对象和数组都需要在堆内存开辟空间,堆空间是线程共享的区域,该区域也是gc (垃圾回收)重要从狸的一个区,所以堆又被称为“GC堆”。
- 方法区:
永久代实现了方法区,永久代是在JDK1.8之前出现的概念,在JDK1.8开始就没有了永久代,而是使用了元空间代替了。
方法区也是一块线程共享的区域,该区域主要保存的是已经加载到jvm 中的类的信息、常量、静态变量等等。
有完整的Java初级,高级对应的学习路线和资料!专注于java开发。分享java基础、原理性知识、JavaWeb实战、spring全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!
原文:https://www.cnblogs.com/hehe199316/p/14484432.html