2 | 您所在的位置:网站首页 › jvm内存划分哪些区域 › 2 |
问题1:jvm为啥会划分不同的内存区域?
(首先必须要有一块区域来存放jvm加载进来的类,必须要有一块区域来存放变量和对象)所以划分为不同的内存区域就是为了在运行过程中可以根据需要来使用。 问题2:那jvm的内存区域都有哪些呢? 2.1 方法区(在1.8以后,这块区域的名字改为metaspace,–元数据空间) :这块区域**主要存放.class文件里加载进来的类 ,还有一些类似常量池的东西 ** 2.2 程序计数器1)当代码被jvm加载到内存后,就需要被执行,而计算机并不认识这些代码,需要把java代码编译成字节码 ,就会对应各种字节码指令。 2)而如何来执行这些字节码指令呢?就需要用到jvm的字节码执行引擎 ,去执行这些字节码指令 。 3)而执行这些字节码指令的时候,就需要一个特殊的内存区域,即程序计数器。 程序计数器的作用就是记录当前执行的字节码指令的位置,也就是记录当前执行到了哪一条字节码指令 4)同时jvm支持多个线程 ,所以写好的代码可以开启多个线程并发执行不同的代码,所以就会有多个线程并发执行不同的代码指令; 所以每一个线程都会对应 一个程序计数器,专门记录当前这个线程目前执行到了哪一条字节码指令 2.3 java虚拟机栈在方法中,经常会定义一些局部变量。而java虚拟机栈主要是用来保存每个方法内的局部变量等数据的 。每个线程都有自己的Java虚拟机栈,而比如main线程就会有自己的java虚拟机栈, 用来存放自己执行的那些方法的局部变量 2) 而同理如果loadReplicasFromDisk也调用了别的方法,而别的方法里面也有局部变量,那么同样会把对应的局部变量压入java虚拟机栈中 堆内存用于 存放我们在代码中创建的各种对象; 同时因为在方法中创建了这个对象,而java虚拟机栈会将这个对象的局部变量存放到局部变量表中,所以从java虚拟机栈中的这个引用变量指向java堆内存 ![]() 答案:一个对象对内存空间的占用大致分为两块:1.对象本身的一些信息; 2 对象的实例变量作为数据占用的空间。比如说对象头,在64位的linux系统中会占用16个字节,而如果实例对象的内部有int类型的变量,会占用4个字节;有long类型的变量会占用8个字节,如果有数组或者map之类的,还会占用更多的空间 |
CopyRight 2018-2019 实验室设备网 版权所有 |