首页 > 编程语言 >java运行时数据区

java运行时数据区

时间:2023-10-13 15:13:06浏览次数:42  
标签:java 方法 虚拟机 PC 线程 内存 数据 栈帧 运行

Java运行时数据区域

  众所周知,Java 虚拟机有自动内存管理机制,如果出现内存泄漏和溢出方面的问题,排查错误就必须要了解虚拟机是怎样使用内存的。
包含:程序计数器(PC)、堆、本地方法栈、虚拟机栈、元空间
  下图是 JDK8 之后的 JVM 内存布局。
image

程序计数器(PC)

  • 内存中一块较小的空间,每个线程都有一个 PC,用于存储线程的下一步执行指令。
  • 线程执行的命令,也都是从 PC 中获取的。
  • 线程间的资源切换,就是获取不同线程的PC中的指令,继续执行的。
  • 执行到 Native 方法,计数器值则为空(Undefined)。

本地方法栈

  本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是非常相似的,它们之间的区别不过是虚拟机栈为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。

虚拟机栈

  • 一般所聊的栈都是虚拟机栈,每个栈里放着栈帧。
  • 一个方法相当于一个栈帧。方法的调用相当于创建一个栈帧,并进行入栈与出栈操作
  • 栈,遵循先进后出原则。栈中栈帧越多,相当于方法套用的层级越多。
  • 栈帧相当于栈的数据结构,包括 局部变量表、操作栈、动态链接、方法返回地址等信息。
    • 局部变量表,存放方法参数和局部变量的区域。 局部变量没有准备阶段, 必须显式初始化。(类在创建时是有准备阶段的)
    • 操作栈,JVM 的执行引擎是基于操作栈的执行引擎。同样是先进后出的栈,用于在方法执行过程中, 会有各种指令往栈中写入和提取信息。
    • 动态链接,每个栈帧中包含一个在常量池中对当前方法的引用, 目的是支持方法调用过程的动态连接。
    • 方法返回地址
      • 正常情况下,返回调用方法的上层地址
      • 抛异常情况下,抛给异常处理的栈针
      • 异常处理情况下,按照 PC 执行以下个指令(内部方法抛异常,外部方法捕获并处理)

i++ 与 ++i 的区别

 int i= 1;
 1. i= i++;
 解析:先将1放入操作栈,在将 i自增+1,再从操作栈中取出 1,并赋值给 i ,结果 i为1;
 2. i= ++i;
 解析:先将 i自增+1,再将1放入操作栈,再从操作栈中取出 1,并赋值给 i ,结果 i为2;

栈结构图

image

  1. 堆,被所有线程共享,在虚拟机启动时创建。
  2. 做为 GC 的主要工作区,java 堆也叫作 “GC 堆”。
  3. 堆采用分代算法
  4. 从内存回收的角度来看,青年代和老年代;青年代又分为Eden空间、From Survivor空间、To Survivor空间等。从内存分配的角度来看,线程共享的 Java 堆中可能划分出多个线程私有的分配缓冲区。
  5. Eden 空间、From Survivor 空间、To Survivor 空间内存分配为 8:1:1 。
  6. 新生代与老年代空间占比 1:2

堆结构图

image

标签:java,方法,虚拟机,PC,线程,内存,数据,栈帧,运行
From: https://www.cnblogs.com/zz-1q/p/17762141.html

相关文章

  • 无涯教程-DBUtils - 使用数据源
    到目前为止,无涯教程在使用QueryRunner时使用了连接对象,也可以无缝链接数据源。下面的示例将演示如何在QueryRunner和数据源的帮助下使用Read查询读取记录。将从员工表中读取一条记录。语法QueryRunnerqueryRunner=newQueryRunner(dataSource);Employeeemp=queryRunner.qu......
  • 配置Tomcat运行Java Web项目
    创建项目创建JavaWeb项目ctrl+shift+p打开搜索Maven原型,并选择从maven原型创建新项目或者按如下方式:选择从Maven原型创建Web项目从maven-archetype-webapp原型创建项目接着选择原型版本、输入包名、项目名、选择项目存放位置注意:到此需要按一下回车来继续输入Y或者回......
  • 可观测性数据收集集大成者 Vector 介绍
    如果企业提供IT在线服务,那么可观测性能力是必不可少的。“可观测性”这个词近来也越发火爆,不懂“可观测性”都不好意思出门了。但是可观测性能力的构建却着实不易,每个企业都会用到一堆技术栈来组装建设。比如数据收集,可能来自某个exporter,可能来自telegraf,可能来自OTEL,可......
  • Java流(Stream)、文件(File)和IO
    Java流(Stream)、文件(File)和IOJava流(Stream)、文件(File)和IOjava.io包几乎包含了所有操作输入、输出需要的类所有这些流类流类代表了输入源和输出目标Java.io包中的流支持很多种格式比如:基本类型、对象、本地化字符集等等一个流可以理解为一个数据的序列输入流表示从一......
  • WPF中Image控件绑定数据源,解决图片被占用问题
    WPF中Image控件的数据源如果设置为路径,或者后台通过Image.FromFile来绑定,该图片将被占用,如要进行图片压缩、删除等操作则会报图片被占用的错;所以可以从内存中加载图片进行绑定。以下为MVVMLight模式,首先增加一个图片路径值转换的类publicclassImageConvert:IValueConverte......
  • [JavaScript]扩展运算符
    顺便补充一点Array.reduce((prev,curv)=>{}, ori)的运用letarr1=[1,3,5,7,9]letarr2=[2,4,6,8,10]console.log(...arr1);//展开一个数组----->13579letarr3=[...arr1,...arr2]//连接数组//......
  • Java设计模式-策略模式-基于Spring实现
    1、策略模式1.1、概述策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在独立的策略类中,使得它们可以相互替换,而不影响客户端代码。这种模式通过将算法的选择从客户端代码中分离出来,提供了更大的灵活性和可维护性。在Java中,策略模式的设计理念可以通过以......
  • Secure Eraser 免费的数据清除软件
    SecureEraser是一款免费的数据清除软件,它可以帮助用户完全删除计算机上的文件和文件夹,以确保这些数据不会被恶意软件或他人恢复。该软件被广泛应用于保护个人隐私和商业机密信息。此程序将彻底删除您的敏感数据,并提供了一个易于使用的用户界面。安装后默认是英文版的,你可以如下图......
  • Java多态及类初始化顺序
    多态多态是Java面向对象的三大特性之一,多态建立于封装和继承之上,指对于父类中定义的属性和方法被子类继承后,可以具有不同的数据类型或表现出不同的行为。可分为编译时多态和运行时多态,编译时多态是静态的,通过方法的重载体现,通过编译之后会产生不同的方法;运行时多态通过动态绑定......
  • 转载 https://www.cnblogs.com/star521/p/13385181.html --PGSQL-脏数据清理,频繁de
    查看表大小--查出所有表(包含索引)并排序--查出所有表(包含索引)并排序SELECTtable_schema,table_nameAStable_full_name,pg_size_pretty(pg_total_relation_size('"'||table_schema||'"."'||table_name||'"'))ASsizeFROMinfor......