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知识库 -> 【深入理解JAVA虚拟机】读书笔记——Java内存区域与内存溢出异常 -> 正文阅读

[Java知识库]【深入理解JAVA虚拟机】读书笔记——Java内存区域与内存溢出异常

学习参考资料:周志明老师的著作《深入理解Java虚拟机(第3版)》

1.运行时数据区域

根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会分为以下几个运行时数据区域,如下图所示。

其中每个线程有自己独自的虚拟机栈、本地方法栈、程序计数器

image-20211201143035751

1.1程序计数器


程序计数器(Program Counter Register) 是一块较小的内存空间,通过改变这个计数器的值来选取下一条需要执行的字节码指令

刚才我们说程序计数器是私有的,这是因为Java虚拟机在执行多线程时,采用的是线程轮流切换,处理器分配执行时间,这样就要求每次切换后需要及时指向该线程所运行的位置且各自的计数器互不影响。

如果线程正在执行的是一个Java方法,那么计数器记录的是正在执行的虚拟机字节码指令的地址;

如果线程正在执行的是一个本地(Native)方法,那么计数器的值为空。

1.2Java虚拟机栈


每个方法被执行时,都会在Java虚拟机栈中同步创建一个栈帧(用于存储局部变量表、操作数栈、动态连接、方法出口等信息),也就是说每个方法在执行至执行完毕后,都对应着一个栈帧从入栈到出栈的过程

那么这个栈帧有什么作用呢?

接下来我们从栈帧的存储局部变量表开始说起:

局部变量表存放了在编译期可知的基本数据类型和对象引用

局部变量表中的存储空间以局部变量槽来表示,64位的long和double类型会占用两个槽;存储空间在编译时就可以完成分配,即在运行时栈帧中的局部变量表的大小就已经确定好了,并且不会改变局部变量表的大小。

如果线程请求的深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;

如果Java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError异常。

1.3本地方法栈


本地方法栈和虚拟机栈发挥的作用是类似的,只不过虚拟机栈为虚拟机提供Java(也就是字节码)服务,本地方法栈是为虚拟机提供本地(Native)方法服务

1.4Java堆


Java堆是内存虚拟机所管理内存中最大的一块,几乎所有的对象实例都在这里分配内存。被所有线程共享的内存区域。

Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。

1.5方法区


方法区也是所有线程共享的内存区域,用来存储已被虚拟机加载的类信息、常量、静态变量

方法区只是一个抽象的概念,具体的实现是通过以下两种方式:

  • 永久代:JDK1.7及以前
  • 元空间:JDK1.8及以后

JDK1.7以前使用永久代来实现方法区,这样就省去了专门为方法去编写内存管理的工作。

但是随着时间的推移这种设计导致了Java应用更容易遇到内存溢出的问题(因为永久代有-XX:MaxPermSize的上限即内存上限,不设置也会有!)

JDK1.7的时候为了临时解决上面的情况,将永久代的字符串常量池、静态变量等移到堆中

JDK1.8把JDK1.7中永久代还剩余的内容(主要是类型信息)全部移到元空间!而元空间是占用的本地内存。

还有要注意的是,并非进入了方法区就跟永久代的名字一样不会进行垃圾回收了。相对而言,会很少出现,主要是针对常量池的回收和对类型的卸载。

后面还会陆陆续续更新这系列的读书笔记,期待您的关注~~

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:37:29  更:2021-12-02 16:38:09 
 
开发: 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/24 4:45:08-

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