运行时数据区-基础

运行时数据区-基础

    • 为什么学习运行时数据区
    • Java内存区域(运行时数据区域)和内存模型(JMM) 区别
    • 组成部分(jdk1.7 / jdk1.8)
    • 从线程隔离性分类
    • 与类加载的关系
    • 每个区域的功能
    • 参考文章

为什么学习运行时数据区

  1. 熟悉jvm如何管理内存
  2. 便于排查内存泄露和内存溢出相关的问题

Java内存区域(运行时数据区域)和内存模型(JMM) 区别

  • 内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分
  • 内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。

组成部分(jdk1.7 / jdk1.8)

  • Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。
  • JVM规范中规定了五个部分:堆,方法区,虚拟机栈,本地方法栈,程序计数器
  • jdk7 和 jdk8 的区别
    • 虚拟机栈,本地方法栈,程序计数器 基本没变化
    • 方法区是在虚拟机规范里面被定义的,不同的虚拟机对这个定义的实现不同,在HotSpot 虚拟机中在 jdk1.7 版本之前的方法区实现叫永久代(PermGen space)(是堆的一部分),jdk1.8 之后叫做元空间(Metaspace)(是本地内存的一部分)
    • 在1.7 中被划分为 新生代,老年代,永久代, 1.8 中被划分为 新生代,老年代(默认比例1:2)
      • 新生代中进一步划分为Eden,S0(SurivorFrom),S1(SurivorTo)(默认比例 8:1:1)

在这里插入图片描述
在这里插入图片描述

  • 为什么方法区会从 堆 中移除到 堆外
    • 在 HotSpot JVM 中,永久代中用于存放类和方法的元数据以及常量池,比如Class和Method。每当一个类初次被加载的时候,它的元数据都会放到永久代中。但永久代是有大小限制的,因此如果加载的类太多,很有可能导致永久代内存溢出,即万恶的 java.lang.OutOfMemoryError: PermGen ,由于 PermGen 内存经常会溢出,因此 JVM 的开发者希望这一块内存可以更灵活地被管理,不要再经常出现这样的 OOM
    • 移除 PermGen 可以促进 HotSpot JVM 与 JRockit VM 的融合,因为 JRockit 没有永久代。
    • 根据上面的各种原因,PermGen 最终被移除,方法区移至 Metaspace,字符串常量移至 Java Heap。

从线程隔离性分类

  1. 线程共享(所有线程共享):堆,方法区
  2. 线程私有(每个线程都有一套):虚拟机栈,本地方法栈,程序计数器(与线程的生命周期一致)

与类加载的关系

在这里插入图片描述

每个区域的功能

  1. 程序计数器
    1. 记录 JVM 字节码指令地址,如果是执行 native 方法,则是未指定值(undefined)
    2. 是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成
    3. 是唯一一个在 JVM 规范中没有规定任何 OutOfMemoryError 情况的区域
  2. 虚拟机栈
    1. 每个线程在创建的时候都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次 Java 方法调用,是线程私有的,生命周期和线程一致。
    2. 虚拟机栈是对程序运行,方法调用的实现,每个方法执行,伴随着入栈(进栈/压栈),方法执行结束出栈
    3. 栈中可能出现的异常
      1. Java 虚拟机规范允许 Java虚拟机栈的大小是动态的或者是固定不变的
      2. 如果采用固定大小的 Java 虚拟机栈,那每个线程的 Java 虚拟机栈容量可以在线程创建的时候独立选定。如果线程请求分配的栈容量超过 Java 虚拟机栈允许的最大容量,Java 虚拟机将会抛出一个 StackOverflowError 异常
      3. 如果 Java 虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那 Java 虚拟机将会抛出一个OutOfMemoryError异常
    4. 栈帧的内部结构
      1. 局部变量表(Local Variables)
      2. 操作数栈(Operand Stack)(或称为表达式栈)
      3. 动态链接(Dynamic Linking):指向运行时常量池的方法引用
      4. 方法返回地址(Return Address):方法正常退出或异常退出的地址一些附加信息
        在这里插入图片描述
  3. 本地方法栈
    1. Java 虚拟机栈用于管理 Java 方法的调用,而本地方法栈用于管理本地方法的调用
    2. 与操作系统交互
  4. 方法区
    1. 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
    2. Java 虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。
  5. 栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪。

    1. 此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数据都在这里分配内存。为了进行高效的垃圾回收,虚拟机把堆内存逻辑上划分成三块区域(分代的唯一理由就是优化 GC 性能)

参考文章

  • https://javaguide.cn/java/jvm/memory-area.html#%E8%BF%90%E8%A1%8C%E6%97%B6%E6%95%B0%E6%8D%AE%E5%8C%BA%E5%9F%9F
  • https://pdai.tech/md/java/jvm/java-jvm-struct.html
  • https://www.51cto.com/article/704419.html
  • https://cnblogs.com/czwbig/p/11127124.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/592904.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Amazon EKS创建S3数据存储卷

亚马逊相关文档 1、创建适用于 Amazon S3的IAM策略 创建存储桶amazoneks {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "s3express:CreateSession","Resource": &…

Java零基础入门到精通_Day 9

1.ArrayList 编程的时候如果要存储多个数据,使用长度固定的数组存储格式,不一定满足我们的需求,更适应不了变化的需求,那么,此时该如何选择呢? 集 合 集合类的特点:提供一种存储空间可变的存储模型,存储的…

2024年 Java 面试八股文——SpringBoot篇

目录 1. 什么是 Spring Boot? 2. 为什么要用SpringBoot 3. SpringBoot与SpringCloud 区别 4. Spring Boot 有哪些优点? 5. Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 6. Spring Boot 支持哪些日志框架&#…

信息系统项目管理师0086:项目内外部运行环境(6项目管理概论—6.2项目基本要素—6.2.5项目内外部运行环境)

点击查看专栏目录 文章目录 6.2.5项目内外部运行环境1.组织过程资产2.组织内部的事业环境因素3.组织外部的事业环境因素6.2.5项目内外部运行环境 项目在内部和外部环境中存在和运作,这些环境对价值交付有不同程度的影响。内部和外部环境可能会影响规划和其他项目活动。这些影响…

《苍穹外卖》Day12部分知识点记录——数据统计-Excel报表

一、工作台 需求分析和设计 接口设计 今日数据接口订单管理接口菜品总览接口套餐总览接口订单搜索(已完成)各个状态的订单数量统计(已完成) 代码实现 今日数据接口 1. WorkspaceController 注意不要导错包了 package com.sk…

【Linux IO基础】缓冲区

概念 缓冲区的主要作用是提高效率 --- 提高使用者的效率,因为有缓冲区的存在,我们可以积累一部分再统一发送,提高发送的效率。 刷新方式 缓冲区因为能够暂存数据,必定要有一定的刷新方式: 一般策略: 无…

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类,实现run方法4.使用匿名内部类来实现Runnable接口,实现run方法5.使用 lambda表达式 1、什么是线…

ubuntu20中ros与anaconda的python版本冲突问题

系统环境 原本系统是ubuntu20 noetic,python都在/usr/bin中,一共是两个版本的python,一个是python3.8,另一个是python2.7。 问题发现 当安装anaconda后,并且将anaconda的bin目录加入到系统环境中时候,…

【微服务】——Docker 基础知识

这里写自定义目录标题 1.1 了解Docker1.1.1应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker——未实践 2.Dock…

【莫比乌斯变换-03】python实现圆对圆的变换

文章目录 一、说明二、python实现复平面的莫比乌斯变换三、线的变换四、画笑脸 一、说明 我们在前面的文章中,叙述了莫比乌斯变换的复数分析,以及种种几何属性,本篇中叙述如何程序地实现:复平面上的圆在莫比乌斯变换下的图像是另…

【ONE·基础算法 || 回溯和剪枝(暴搜/深搜)】

总言 主要内容:编程题举例,熟悉理解回溯剪枝类题型(如何画决策树,如何使用深搜进行递归,如何运用剪枝,如何在一维数组/二维数组中使用)。 文章目录 总言1、回溯和剪枝2、全排列(med…

【机器学习】BK- SDM与LCM的融合策略在文本到图像生成中的应用

突破边缘设备限制:BK-SDM与LCM的融合策略在文本到图像生成中的应用 一、引言二、稳定扩散算法的挑战与现状三、BK-SDM与LCM的融合策略利用高质量图像-文本对进行训练为LCM量身定制高级蒸馏过程 四、结论与展望 一、引言 随着人工智能技术的飞速发展,文本…

数据结构(十)----图

目录 一.图的概念 1.图的定义 2.图的类别 3.图的性质 4.几种特殊形态的图 二.图的存储结构 1.邻接矩阵(顺序存储) 2.邻接表(顺序链式存储) 3.十字链表 4.邻接多重表 四.图的遍历 1.广度优先遍历(BFS&#…

Mysql复习笔记: 基础概念(待补充)

一. 基础概念 通用概念: 网络连接必须得分配给一个线程去进行处理,由一个线程来监听请求以及读取请求数据,比如从网络连接中读取和解析出来一条我们的系统发送过去的SQL语句 在数据库中,哪怕执行一条SQL语句,其实也可以是一个独立…

Python | Leetcode Python题解之第59题螺旋矩阵II

题目&#xff1a; 题解&#xff1a; class Solution:def generateMatrix(self, n: int) -> List[List[int]]:matrix [[0] * n for _ in range(n)]num 1left, right, top, bottom 0, n - 1, 0, n - 1while left < right and top < bottom:for col in range(left, r…

pandas学习笔记11

DataFrame结构 DataFrame 一个表格型的数据结构&#xff0c;既有行标签&#xff08;index&#xff09;&#xff0c;又有列标签&#xff08;columns&#xff09;&#xff0c;它也被称异构数据表&#xff0c;所谓异构&#xff0c;指的是表格中每列的数据类型可以不同&#xff0c;…

python中type,object,class 三者关系

type,object,class 三者关系 在python中&#xff0c;所有类的创建关系遵循&#xff1a; type -> int -> 1 type -> class -> obj例如&#xff1a; a 1 b "abc" print(type(1)) # <class int> 返回对象的类型 print(type(int)) …

力扣打卡第二天

206. 反转链表 class Solution { public:ListNode* reverseList(ListNode* head) {// //迭代法// ListNode *pre nullptr;// ListNode *curr head;// while(curr){// ListNode *next curr -> next;// curr -> next pre;// pre curr;// curr next;/…

Unity UGUI Image 点击事件忽略空白像素区域

我们会遇到图片不是方形的不规则图片。这个时候我们希望只有点击到图像内容本身才算点击&#xff0c;点击空白区域则不算点击。而UGUI对图片的处理是整个图片都会算作点击区域&#xff0c;这样不能满足于我们的使用需求了。 首先我们需要把图片本身的Read/Write 选项打开 然后…

质因数分解(cpp实现)--一种快速求得一个数有多少个因子的黑魔法

前言 最近机试没少吃不会质因数分解的亏&#xff0c;用传统的求得因子个数只能过一点点…(ex, 20%) 质因数分解后&#xff0c;可以将因子问题转化为 集合的组合问题&#xff0c;因此会很快&#xff0c;目测是 l o g n log n logn (n是该整数的值)。 传统解法 假设输入整数的…