JVM的内存区域划分

目录

1.什么是JVM

2.JVM内存区域划分

2.1各区域详解

2.2经典笔试题:


1.什么是JVM

  JVM也称为Java虚拟机,它是Java代码的运行环境,Java属于半编译半解释形的语言.它的运行环境在虚拟机上,而不是物理设备.Java这么设定主要是为了跨平台,即一套代码,多处使用.我们只需要编译出一套Java代码, 就可以部署到不同的操作系统中去.Java不想重新编译,而是期望能够直接执行,先通过Javac把.Java文件=>.class文件.字节码文件就是Java字节码.是它自搞得一套cpu指令,因因此.我们编写和发布一个Java程序,只需要发布.class文件即可.

  虽然不同平台的JVM存在差异,但是对上(Java层面上提供的内容)是统一一致的,JVM本身是一个复杂的东西,它对上统一一致,对下有自己的差异.对于程序员来说,我们不需要关心对下是什么样子,只需要编译对上的Java代码即可.这也是Java的优越性.

2.JVM内存区域划分

  JVM实际上也是一个进程

在系统中和的进程是一样的,需要从系统中申请调用资源.(比如内存)这些内存空间,就支持了后续Java程序的运行,比如在Java中定义变量(就会申请内存),内存实际上就是JVM从系统中申请的内存,JVM实际上就相对于是二房东.JVM申请的内存空间,会被划分成好几个不同的区域.,每个区域都有不同的作用.

2.1各区域详解

我们来详细的介绍一下这些区域.

1.堆区:Java中new出来的对象,比如数组等,都在这个区域里面,还有对象中持有的非静态成员变量也在堆里

2.栈区:分为本地方法栈和虚拟机栈包含了方法的调用关系,和局部变量.

3.程序计数器,这块空间比较小,专门用来存储下一条要执行的Java指令的地址

(栈区和程序计数器是每个线程都有一份)

4.元数据区,也叫做方法区,里面往往是一些辅助性质的属性.有类的信息和方法的信息,也就是哪些字节码在程序运行的时候就会被JVM加载到内存中,放到元数据区里面.此时,当前程序要如何执行,要做那些事,就会按照上述元数据区里记录的字节码依次执行就可以了.

(堆,元数据区是线程共享的)

2.2经典笔试题:

class Test{

   prviate int n;

   prviate static int m;

}

main() {

Test t = new Test();

}  问上述代码的t,n,m分别在jvm内存的哪些区域

 t是一个局部变量的引用,自然是在栈区中,而new出来的Test()对象在堆区中

n是Test的非静态成员变量所以在堆中

m则是静态成员变量,即类变量,就存放在元数据区中.

在上述带有static修饰的变量,也就是在内对象中

内对象(Test,class, jvm把.class文件加载到内存中以后,就会把这里的信息使用对象来表示,此时这里的对象就是类对象,类对象包含了一系列属性,包括但不限于(类名,继承于哪个类,实现了哪些接口,有哪些属性,叫啥名字,啥类型,啥权限.哪些方法,叫啥名字,啥参数,啥权限)

.java文件涉及到的的信息都会在.,class文件中有所体现(除了注释)

区分一个变量在哪个区域中,主要是看变量的形态(局部变量,成员变量,静态成员变量)

  • 20
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老cu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值