jvm内存模型-学习笔记


初学JVM内存模型 学习笔记。

运行流程

当我们编写的.java文件,经编译器编译成.class文件,通过类加载器将其加载到JVM内部。在运行时数据区进行对数据存储,业务的处理。执行完成后通过执行引擎翻译成二进制的机器码再交给操作系统去执行。
在这里插入图片描述

运行时数据区 Runtime Data Area

方法区 Method Area

方法区是一种规范,是一个抽象的概念,在虚拟机当中并不是一块实际的区域。(方法区是各个线程共享的)

 在JDK 7以及之前的版本 永久代则是方法区的实现。JDK8 删除永久代,使用元空间来替代永久代。
 
 元空间Metaspace 和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此默认情况下元空间的大小仅受本地内存限制。
 
 另外JDK 7之前版本的字符串常量池存放在永久代中 ,JDK7 将字符串常量池移动到堆 。

方法区的实现是 用于存储被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

本地方法栈 Native Method Stack

Java是基于应用层的高级编程语言,无法访问操作系统的底层信息;如果说有需要访问底层信息的需求,就需要使用其他可以访问底层的编程语言来完成,如:c++;再通过java来调用就可以实现需求;

本地方法就是帮助java实现对底层的操作。它是线程私有
native修饰的方法

本地方法栈与java Stack类似 ,它是用来执行本地方法的。本地方法栈存放的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。

本地方法的实现原理:

1、在java程序中声明native修饰的方法,只有方法定义,没有方法实现,将java编译成字节码文件。

2、用javah编译字节码文件,生成一个后缀为.h的文件。

3、写一个.cpp(c++ /c plus plus)文件实现.h文件中的方法;

4、将.cpp文件编译成动态链接库文件.dll。

5、使用System.loadLibrary() 加载动态链接库,从而实现本地的调用;

利用反射机制,运行时找到dll文件,并解析,根据动态链接库的文件名创建对象和方法,从而实现通过对象调用方法的过程。

程序计数器 Program Counter Register

占用内存空间较小,是当前线程所执行的字节码行号指示器(记录当前线程执行到哪了);多个线程之间的程序计数器是相互独立的,互不影响,为了保证每个线程恢复后都可以找到具体的执行位置。(并发 )

JVM中的并发是通过线程切换并分配时间片执行来实现的. 在任何一个时刻, 一个处理器内核只会执行一条线程中的指令. 因此, 为了线程切换后能恢复到正确的执行位置, 每条线程都需要有一个独立的程序计数器。所以它是线程私有的。

堆 Heap

java中所有的对象都是存放在堆中

java堆是用来存储实例化对象的,java中所有的对象一定都是存储在堆中的,java堆被所有的线程共享。在虚拟机启动时创建的,用来存储对象的实例,是java内存结构中占比最大的一块区域,也是GC垃圾回收机制主要管理的区域。

Java堆从GC的角度还可以细分为 年轻代,老年代。
年轻代:
1、Eden
2、Survivor(存活):分为Survivor From、Survivor To;这两个区主要是在GC(垃圾回收)时使用
老年代
存放生命周期较长的对象,经过多次GC还没有被回收的对象,或者是引用次数很多、引用链比较长的对象,都是存放在老年代中。

虚拟机栈 Java Stack

虚拟机栈是java方法执行的内存模型,java栈中存放最多的是栈帧,每一个栈帧对应一个被调用的方法;
栈帧中包括:局部变量表,操作数栈,运算符栈,动态链接,方法的返回地址(方法出口);
每一个方法的执行,JVM都会创建一个栈帧,并且将该栈帧压入java栈,方法执行完毕,该栈帧出栈;

局部变量表:存储方法执行过程中的所有变量,包括方法声明的局部变量和形参;

操作数栈:方法中的计算过程都是借助操作数栈来完成的、将参与计算的数据压入到操作数栈中;

运算符栈:方法运算过程中用到的运算符,全部压入到运算符栈中;

方法的返回地址:一个方法调用结束后要返回到调用它的地方,所以栈帧中要保存能够返回到方法调用出的地址;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值