JVM---内存分配及初入垃圾回收

上一篇文章中《jvm--类加载》中,了解了编写的java文件是如何被jvm识别的。部署项目的时候,内存是比较昂贵的资源,.jar包或者.war包中的class文件,在jvm中针对其中运行的方法和创建的对象是如何分配内存和工作的呢。

1、方法区

      方法区主要存放“.class”文件里加载进来的类,以及常量池,类变量。jdk1.8以后,改名字叫“Metaspace”.

2、程序计数器

     .class文件中对应的字节码指令,是一条条的机器指令。当.class文件加载到内存后,jvm会用自己的字节码执行引擎,去执行我们编译出来的代码。在这个过程中,jvm中分配了一个特殊的内存区域叫程序计数器,来记录当前执行的字节码指令的位置

      在多核时代,而且jvm支持多个线程,代码里面也可能开启多个线程,程序中会出现多个线程并发执行不同的代码指令。所以,每一个线程都会有一个自己的程序计数器

3、java虚拟机栈

      java代码执行的过程中,一定是线程来执行某个方法中的代码。jvm中会有一块区域,保存每个方法内的局部变量等数据,也就是java虚拟机栈。每个线程都有自己的java虚拟机栈,调用方法时会创建栈帧(栈帧里存放着方法的局部变量表、操作数栈、方法出入口等信息)。方法的调用对应着入栈和出栈

4、堆内存

     堆内存中存放代码中创建的各种对象。比如java虚拟机栈的一个ClassA instance = new ClassA().创建出来的new ClassA()会放在jvm中的堆内存中,而instance持有它的一个引用。

5、本地方法栈

     native方法调用的时候 ,jvm中会分配出一块区域,存放native方法的局部变量表数据,这块区域就叫做本地方法栈。

-----------------------------------------------------华丽的分割线-----------------------------------------------------------------------------------

方法调用的时候,java虚拟机栈中的局部变量会引用堆内存的对象。方法调用完,堆内存的对应已经没有引用指向。对于jvm来说 就是一些暂用了内存空间却没有用的垃圾,需要进行清理-------------垃圾回收。

         

你可能感兴趣的:(jvm)