JVM内存区域--堆栈方法区等概念理解

来源:互联网 发布:湖南有色行情分析软件 编辑:程序博客网 时间:2024/05/21 07:48

首先,我们来了解一下jvm的作用,JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。首先有一点需要纠正的是,java虚拟机并非只能用于java语言的运行,他们的共识是将文件编译成.class文件进行执行,jvm分为很多种,比较主流的jvm有oracle公司收购而来的HotSpot和IBM公司的J9 VM,值得一提的是HotSpot当初是为了运行strongerTalk语言而开发的,随着oracle收购了HotSpot开发团队,HotSpot开始与oracle收购sun公司得来的java进行结合,形成了经久不衰的hotspot jvm虚拟机。java内存的组成可以由Heap和NO-Heap组成,但是更加准确一点的解释却是分为线程内存和共享内存,共享内存在维基百科上的解释是:

   在软件中,术语共享内存指可被多个进程存取的内存,一个进程是一段程序的单个运行实例。在这种情况下,共享内存被用作进程间的通讯。

共享内存有一个最大的特点是它是随着JVM的开启而产生,在JVM结束时而消失的,生命周期和jvm一致

java运行时内存可分为以下五种:


如图所示:jvm运行时数据区可分为线程私有内存和共享内存,线程私有内存分为java虚拟机栈、本地方法栈、程序计数器,

而jvm共享内存可分为java堆和方法区,下面我们将进入今天的主题,为大家一一讲解一下关于这几种内存的特点以及怎样

快速的区分这几种内存:

       首先,看一遍就能直接记下来的当然就是我们的程序计数器了,首先我们先写一个java文件Test.java,然后在我们的

命令行中对Test.java编译(即命令为javac Test.java),然后查看编译后的.class的文件(即命令为javap -verbose Test),


             图一


                           图二

此时这就是我们的程序计数器在jvm工作时指向的行号,没错,程序计数器在这里的理解就是jvm运行

过程中程序行号的记录,其存储的是java文件的行号,当程序运行到第一行的时候程序计数器存储的是

行号为0,此时存储进去的行号为0,现在很多java虚拟机会将本地方法栈和java虚拟机栈进行合并实现,

像我们主流的HotSpot就是这样子实现的,java栈帧在运行过程中可能抛出的异常有OutOfMemoryError

和StackOverFlow异常,栈的一个最主要的特点是后进先出,java虚拟机栈可分为,局部变量表和操作数

栈两种,局部变量表是由若干个Slot(槽)组成的,组成结构类似我们的redis,单个槽可以存储boolean、byte、

char、int、short等数据类型,像double和float等数据类似我们则使用两个slot进行存储,如图二所示,

局部变量表用于存储jvm运行时变量如1000,2,3等数据,而操作栈的栈顶是存储数据在运行数据相加和相乘时的

数据,数据从1000运行第一条相加指令完成后变为2000,然后进行第二条指令完成之后变成3006,并将栈顶数据

即运算结果进行输出。

       下面,我们来讲解一下我们的方法区和java堆,我们在进行实例化一个对象时如:Object obj = new Object();
此时,的Obect()是存储于java虚拟机堆里面的,而obj是在java虚拟机栈里面的,java栈里面的本地变量表会预存一个

slot用于存储reference类型数据,通过一个reference我们至少可以查找到java对象的实例数据和类型数据,

java虚拟机中最大的一块内存区域

是java堆,JVMS明确要求该区域需要实现自动内存管理,即常见的GC,java堆的内存分为JMS和JMX,即java堆最小

堆内存和最大堆内存,java堆可以分为新生代,年老代和永久带,这种分发是基于java内存的经典算法和内存算法进行

划分的,java堆内存超出时会抛出OutOfMemoryError异常。方法区用于存储Java类的结构信息,

类的实例信息用于存储java类的实例变量以及实例变量的值,而类的类信息指的是java类的常量,

静态变量,以及在java中声明的各种方法,以及编译器编译产生的class文件。





1 0
原创粉丝点击