JVM 小白学习之四 :Java虚拟机内存管理

Java 虚拟机内存管理

  1. java运行时JVM中的数据区总览图。
    JVM运行时数据分配图

1.1 程序计数器

  1. 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。
  2. 程序计数器处于线程独占区。
  3. 如果线程执行的是Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是native方法,这个计数器的值为undefined
  4. 此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemory情况的区域,(因为开发者不需要去操作这一块内存)
  5. 每个线程都有其自己的程序计数器。
  6. java中现在暂时不能使用goto,其是java中的保留字

1.2 虚拟机栈

  1. 虚拟机栈描述的是Java方法执行的动态内存模型
  2. 栈帧
    1. 每个方法执行,都会创建一个栈帧,伴随着方法从创建到执行完成。用于存储局部变量表,操作数栈,动态链接,方法出口等。
  3. 局部变量表
    1. 存放编译器可知的各种基本数据类型,引用类型,returnAddress类型
    2. 局部变量表的内存空间在编译器完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的,在方法运行期间是不会改变局部变量表的大小的。因为其只存 引用
  4. 大小
    1. 虚拟机栈不够存放栈帧,则会出现StackOverflowError,递归中常出现这种错误。
    2. 如果设置栈的空间非常大,则可能出现OutOfMemoryError

1.3 本地方法栈

  1. HotSpot内存区域不区分虚拟机栈和本地方法栈,但大多都是有区分
  2. 虚拟机栈是为虚拟机执行Java方法服务
  3. 本地方法栈为虚拟机执行native方法服务
  4. 其他方法虚拟机栈相同类似

1.4 Java堆

  1. 存放对象实例
  2. 垃圾收集器管理的主要区域
  3. 新生代,老年代,Eden空间
  4. Java虚拟机中管理的最大的内存区域(内又分为几个区域)
  5. OutOfMemory
  6. 两个重要的参数 -Xms -Xmx 调整虚拟机内存的初始值最小值和最大值。

1.5 方法区

  1. 存储虚拟机加载的类的信息,常量,静态变量,即时编译器编译后的代码等数据。
    1. 类的版本
    2. 字段
    3. 方法
    4. 接口
  2. 方法区和永久代,在总多使用HotSpot的人中,很多人都原意把方法区称之为永久代。因为HotSpot把GC扩展到方法区,也就是使用永久代来时实现方法区。好处就是重复使用堆的GC去管理方法。而许多虚拟机没有永久代的概念。
  3. 垃圾回收在方法区的行为,回收效率低,且消费大
  4. 异常的定义
    1. OutOfMemoryError

特殊内存区域

2.1 运行时常量池

  1. 属于方法区的一部分。
  2. 用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。
  3. 字符串就是一个典型的例子哩。其在方法区中会以一个区SET存在,SET的特性就是无序不重复。
  4. OutOfMemoryError

2.2 直接内存

  1. 并不是虚拟机运行时数据区的一部分
  2. 能分配堆外内存
  3. 受物理内存的限制,可能报 OutOfMemoryError
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值