深入了解Java虚拟机(内存管理)

深入了解Java虚拟机(内存管理)

JDK、JRE与JVM之间的关系:

JDK全称为Java SE Development Kit(Java开发工具),提供了编译和运行Java程序所需的各种资源和工具,包括:JRE+java开发工具。
JRE全称为Java runtime environment(Java运行环境),包括:虚拟机+java的核心类库。
JVM是运行Java程序的核心虚拟机。

在这里插入图片描述

JVM的内存管理

在这里插入图片描述

程序计数器

**程序计数器(处于线程独占区)**是一个非常小的内存空间,它可以看成是当前线程所执行的字节码的行号指示器。此区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。如果线程执行的是java方法,这个计数器记录的是正在执行的虚拟字节码指令的地址。如果正在执行的是native方法,那么这个计数器的值为undefined。程序计数器的作用就是因为多线程可能会使线程挂起,然后挂起的线程恢复时,程序计数器找到运行的位置

虚拟机栈(线程栈)

虚拟机栈描述的是Java方法执行的动态内存模型。
栈帧: 每个方法执行都要创建一个栈帧,方法执行完毕,栈帧销毁。
用于存储局部变量表,操作数栈,动态链接,方法出口等。
**局部变量表:**存放编译期可知的各种基本数据类型,引用类型,局部变量表的大小在编译期便已经可以确定,在运行时期不会发生改变。
栈的大小:如果栈满了,StackOverFlowError,递归调用很常见
在这里插入图片描述
操作数栈:就是存储比如 int = 0,操作数栈存储数字0,然后局部变量表把数字赋值给变量。

本地方法栈

本地方法栈为虚拟机执行native方法

方法区

存储虚拟机加载的类信息(类的版本、字段、方法、接口),常量,静态常量,以及编译后的class文件都在方法区。

堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别名,或者代号。
  根据垃圾回收机制的不同,Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代。其中新声带存放新生的对象或者年龄不大的对象,老年代则存放老年对象。
新生代分为eden区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以互相角色的空间。
  绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经过一次新生代回收,如果对象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代。
  在这里插入图片描述

对象头

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值