JVM(二)内存区域的理解

一 JVM的内存区域结构

1.1

由前面文章所述JVM是用来将编译后的java指令生成.class文件然后在不同的平台上解释为不同的平台指令,然而这一切是怎样实现的呢?
首先我们需要知道JVM的内存区域结构:
在这里插入图片描述
由上节所知上面会有类加载器,通过类加载器执行(加载-连接(验证-准备-解析)-初始化)到它的内存区域然后通过内存区域进行一系列操作。

2.2

运行时数据区就是JVM运行期间对JVM内存空间的划分和分配,数据存储被划分为五个区,通过类加载器的程序都被分配在运行时数据区根据类别分配到这五个区:
1堆 2方法区 3虚拟机栈 4 程序计数器 5本地方法栈

二. 五个区域详解

2.1 方法区

从上图可以看出,方法区是被所有线程共享的区域,它主要用来存储静态变量,已被加载的类的信息,常量,和即时编译器(就是将字节码文件解释为不同平台指令)编译后的代码,方法区主要存储每个类的结构信息,例如成员变量,方法数据,和构造函数和普通函数的代码块内容。包括类,接口,实例初始化特殊方法。
运行时常量池也是方法区的一部分,常量池主要是用来存放编译器生成的各种字面变量和符号引用,直接应用也会存储在运行时常量池中。

2.2 堆

  1. 堆是JVM内存区域中最大的一部分,队也是所有的线程所共享的内存区域。
  2. 此内存的目的就是为了存放对象实例,几乎所有的对象的实例和数组都存放在堆中
  3. java的堆也是垃圾收集器管理的主要区域,从内存回收的角度看,java堆会被划分为新生代和老年代,从内存分配的角度来看,线程共享的java堆划分为多个线程的私有的分配缓冲区。

2.3 程序计数器

  1. 程序计数器占用很小的一块内存,它是属于线程的私有空间,是执行当前字节码的行号指示器,字节码解释器的解释工作就是通过选择这个程序计数器的行号来进行的,选取下一条要进行的指令。比如循环,跳转,分支,异常处理等,
  2. 由于java虚拟机多线程是并发进行的,所以每个线程都需要自己的独立的程序计数器,这样才能保证多线程的并发进行(轮流切换并分配处理器执行时间,这样就能保证一个线程正在执行,另一个线程执行,恢复时有自己的程序计数器这样就能恢复到原来的地方,所以每个线程的程序计数器都是独立存在的,互不影响。
    6.若线程正在执行一个java方法,则程序计数器存储的是下一步指向的指令,若是native方法则存储的是空。

2.4 java虚拟机栈

  1. java虚拟机栈和程序计数器是相同的,都是线程的私有空间,它和线程有着相同的生命周期,它描述的是java方法的执行的内存模型,每个方法运行时都会创建一个栈帧存放与方法有关的变量,如局部变量,操作数帧,动态链接,方法出口等,每个方法运行到结束,其实也就是栈帧在虚拟机中从入栈到出栈的过程。
  2. 局部变量表中存放的是基本数据类型或者对象引用类型或者returnAddress(字节码指令的地址)
  3. 局部变量空间分配:long和double是占用两个局部变量空间大小,其它的数据类型都只占用一个局部变量空间,而且这些空间实在编译期间都已经分配好了,在后面的方法运行时期是不会在改变局部变量表的大小。
  4. 这个区域会有两种异常:stackOverFlowError:线程请求的栈的深度大于虚拟机所允许的深度就会出现这个错误;现在的大多数虚拟机都是支持动态扩展的(多个线程申请内存),若是扩展时也无法申请到足够的内存,就会出现OutofMemory
  5. 操作系统对每个进程分配的内存有大小限制(windows64位系统中最大是2G内存),对于java虚拟机,最大是2G的内存,不算java虚拟机进程启动时占的内存,剩下的内存都分配给了共享区和线程独享区,也就是堆内存+方法区内存+线程栈内存(程序计数器忽略不及),那么不论堆内存和方法区内存占的内存空间有多小,线程栈内存的大小总是有限制的,由于java虚拟机会为每个线程分配一块内存,如果线程数量足够多,当再申请新的内存时,发现无内存可用了,就会抛出OutofMemoryError。

2.5 本地方法栈

本地方法栈和JVM虚拟机栈的作用非常相似,只不过虚拟机栈主要是执行java方法,而本地方法栈执行的是native方法。他也会抛出OutOfMemory和StackOverFlow异常

阅读《深入了解JVM》 综合另外一些博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值