JVM内存划分

JVM,即Java虚拟机,是通过软件模拟的具有完整硬件功能,运行在完全隔离环境中的计算机系统.它通过软件模拟Java字节码指令集,JVM只保留了PC寄存器,而普遍的虚拟机有很多寄存器.

Java内存划分

Java内存区域一共划分为6块,如下图:
在这里插入图片描述

其中,线程私有内存:

1. 程序计数器

程序计数器是比较小的内存空间,它是当前线程所执行的字节码的行号指示器.
若当前线程执行的是Java方法,计数器记录的是正在执行的JVM字节码指令地址.
若当前线程执行的是Native方法,计数器为空
它是唯一一块不会产生OOM(OutOfMemory)的区域.

2. 虚拟机栈

描述Java方法执行的内存模型.
每个方法执行的同时都会创建一个栈帧存储局部变量表,操作数栈,方法出口等信息.每个方法从调用到执行完毕的过程,对应一个栈帧在虚拟机栈的入栈与出栈过程.生命周期与线程相同:在创建线程时同时创建此线程的虚拟机栈,线程执行结束,虚拟机栈与线程一同被回收.此区域一共有两种异常:

  • 若线程请求的栈深度大于JVM允许的深度(-xss设置栈深度)抛出StackOverFlowError(常见于单线程)
  • 虚拟机在进行栈的扩展时,若无法申请到足够内存,抛出OOM异常.(常见于多线程)

3. 本地方法栈

本地方法(Native方法)执行的内存模型,和虚拟机栈相同,HotSpot虚拟机中,本地方法栈与虚拟机栈是同一块内存区域

线程共有内存:

1. 堆(GC堆):

Java堆是JVM管理的最大的内存区域,在JV,启动时创建,所有线程共享此内存,此内存存放的都是对象的实例和数组.Java堆是垃圾回收期管理的最主要的内存区域,Java堆可以是物理上不连续的内存空间.使用-Xmx设置堆的最大值.-Xms设置最小值.若在堆中没有足够的内存完成对象实例分配并且堆无法再次扩展时,抛出OOM异常.

2. 方法区

用于储存已被JVM加载的类信息,常量,静态变量.方法区无法满足内存分配需求时抛出OOM异常.

3. 运行时常量池

运行时常量池是方法区的一部分,存放字面量和符号引用.
(字面量:字符串常量(JDK1.7移动到了堆中),final常量,基本数据类型
符号引用:类,字段,方法的完全限定名,名称,描述符)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值