目录
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文件中有所体现(除了注释)
区分一个变量在哪个区域中,主要是看变量的形态(局部变量,成员变量,静态成员变量)