IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> JVM之内存结构 -> 正文阅读

[Java知识库]JVM之内存结构

前言

开始认真更新了,先开始肝JVM相关知识,本篇是最基础的运行时数据区域,内容都节选自<深入理解java虚拟机>。


一、运行时数据区域

根据《java虚拟机规范》的规定,java虚拟机所管理内存将会包括以下几个运行时数据区域,如下图所示:
在这里插入图片描述
如上图,主要分为4个组成部分:

  1. 类加载器:负责加载类信息到内存中;
  2. 运行时数据区域:JVM内存,分线程独占区和线程共享区;
  3. 执行引擎:将字节码翻译成底层系统指令,再交由 CPU 去执行(字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行);
  4. 本地库接口:负责同其他编程语言交互的接口。

运行时数据区域主要分为线程独占区和线程共享区2大类,其中 线程独享有 程序计数器、本地方法栈、虚拟机栈;线程共享有 堆、方法区。

二、线程独享

1.程序计数器

定义:程序计数器 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,属于线程独享。
字节码解释器工作是就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖计数器完。
且此区域是唯一一个在《java虚拟机规范》中没有规定任何OutOfMemeryError情况的区域。

2.虚拟机栈

定义:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。先入后出(FILO)。
存储:局部变量表存放了编译期可知的基本数据类型、对象引用、返回值和地址类型。
异常:线程请求的栈深度大于虚拟机所允许的深度,会抛出StackOverflowError异常;栈在扩展时无法申请到足够的内存就会抛出OOM异常。
在这里插入图片描述

3.本地方法栈

定义:和虚拟机栈的作用类似,区别就是虚拟机栈为虚拟机执行java方法服务,而本地方法栈是为虚拟机使用本地(native)方法服务。
异常:同虚拟机栈一样,当栈深度溢出或栈扩展失败时都会抛出StackOverflowError或OOM异常。
在这里插入图片描述

三、线程共享

1.java堆

定义:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。内部会划分出多个线程私有的分配缓冲区。可以位于物理上不连续的空间,但是逻辑上要连续。也是GC回收的主要区域。
存储:所有new对象都分配在堆上。
异常:当堆中没有内存完成实例分配且无法扩展时,JVM会抛出OOM异常。

请看下图通过直接指针访问对象 可以看出java栈、java堆和方法区关系。
在这里插入图片描述
在这里插入图片描述

2.方法区

定义:和堆一样都是线程共享区域,用于存储被虚拟机加载的类加载信息、运行时常量池、代码缓存等数据,为了和堆做区别也叫 非堆。
实现:JDK8之前方法区的实现是永久代,在jdk7时就做准备换掉永久代将字符常量池、静态变量移到堆中;在JDK8时将永久代剩余内容(主要是类加载信息)全部移到元空间,并删除永久代,则方法区实现变成了元空间。元空间使用的内存 叫做 本地内存 (主要是区别于堆内存)。
回收对象:GC主要对方法区的回收是废弃的常量池和不再使用类型。
异常:方法区无法满足新的内存分配时,会抛出OOM异常。

以下图就是JDK6-JDK8方法区实现图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、直接内存

在 JDK 1.4 中新引入了 NIO 类,它可以使用 Native 函数库直接分配堆外内存,然后通过 Java 堆里的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在堆内存和堆外内存来回拷贝数据。
注意点:1. 直接内存不受堆内存影响;2. 动态扩容时内存不足会抛出oom异常。

总结

本篇基本上都是摘抄于<深入理解java虚拟机>这本书,也是JVM内存结构的基础。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:11:36  更:2022-06-06 17:14:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 20:56:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码