本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

JVM内存模型(运行时数据区)

发布于2021-03-10 18:38     阅读(910)     评论(0)     点赞(27)     收藏(2)


一、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全家桶、设计模式、分布式及面试资料、开源项目,助力开发者成长!

详细的java系统视频免费学习地址

欢迎关注微信公众号:码邦主

原文链接:https://www.cnblogs.com/hehe199316/p/14484432.html



所属网站分类: 技术文章 > 博客

作者:天使的翅膀

链接:http://www.javaheidong.com/blog/article/112239/cfb4fa5807a573cbc769/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

27 0
收藏该文
已收藏

评论内容:(最多支持255个字符)