首页 > 其他分享 >JVM 运行时数据区

JVM 运行时数据区

时间:2023-06-01 18:22:13浏览次数:39  
标签:Java 常量 本地 方法 虚拟机 线程 JVM 数据 运行

Java虚拟机定义了在程序执行期间使用的各种运行时数据区域。其中一些数据区域是在Java虚拟机启动时创建的,只有当Java虚拟机退出时才会销毁。其他数据区域是每个线程的。每个线程的数据区域在创建线程时创建,在线程退出时销毁。

开局盗张图

6 JVM Runtime Data Areas

  • 程序计数器(Program Counter Register)

每个线程都有自己的程序计数器,并且任何时间一个线程都只有一个方法在执行。程序计数器会存储当前线程正在执行的Java方法的JVM指令地址;如果是在执行本地方法,则是未指定值(undefned)。

  • Java虚拟机栈(Java Virtual Machine Stack)

每个线程在创建时都会创建一个虚拟机栈,存储栈帧(Stack Frame),一个方法调用会生成一个栈帧。JVM对虚拟机栈的直接操作只有压栈和出栈。每个栈帧中存储着局部变量表、操作数(operand)栈、动态链接、方法正常退出或者异常退出的定义等。java虚拟机栈可以追踪程序执行和记录stack trace。可以通过Xss参数设置线程栈大小。

如果堆栈大小超过设置最大值会引起StackOverflowError。

如果Java虚拟机堆栈可以动态扩展,并且尝试进行扩展,但没有足够的内存来进行扩展,或者没有足够的存储器来创建新线程的初始Java虚拟机栈,则Java虚拟机会抛出OutOfMemoryError

  • 堆(Heap)

堆是线程共享区域,用来存储Java对象实例,虚拟机启动时创建。几乎所有创建的Java对象实例都是被直接分配在堆上。堆中存储的对象实例通过垃圾收集器(garbage collector)自动回收,不会自动释放。堆内存不需要连续。堆可以是固定大小的,或者可以根据计算的需要进行扩展。可以通过-Xms设置初始堆大小,-Xmx设置最大堆大小。如果程序执行需要的堆比所能提供的堆多,Java虚拟机会抛出OutOfMemoryError。

  • 方法区(Method Area)

方法区也是所有线程共享的内存区域,用于存储所谓的元(Meta)数据,它存储每个类的结构,如运行时常量池、字段和方法数据,以及方法和构造函数的代码,包括类和实例初始化以及接口初始化中使用的特殊方法。java8之前将方法区称为永久代(Permanent Generation)通过**-XX:PermSize**、-XX:MaxPermSize:分别设置永久代初始与最大值。JDK 8中将永久代移除,同时增加了元数据区(Metaspace),使用**-XX:MetaspaceSize**、-XX:MaxMetaspaceSize设置元空间初始值及最大值。如果方法区可使用内存不足也会抛出OutOfMemoryError。

  • 运行时常量池(Run-Time Constant Pool)

运行时常量池是方法区的一部分。运行时常量池是类文件中constant_pool表的每个类或每个接口的运行时表示。它包含多种常量,从编译时已知的数字文字到必须在运行时解析的方法和字段引用。运行时常量池的功能类似于传统编程语言的符号表。常量池可使用内存不足也会抛出OutOfMemoryError

  • 本地方法栈(Native Method Stack)

本地方法栈是每个线程独有的,支持对本地方法(native method)的调用。本地方法不是java语言编写,不会编译成字节码,因此需要不同的内存区域。本地方法栈和jvm方法栈很相似。本地方法栈的目的是为了追踪本地方法调用。

参考:

https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5

标签:Java,常量,本地,方法,虚拟机,线程,JVM,数据,运行
From: https://www.cnblogs.com/bird2048/p/17449865.html

相关文章

  • 阿里Druid数据源,程序启动或日志记录报错 load filter error, filter not found : logb
      Druid支持配置多种Filter,配置信息保存在druid-xxx.jar!/META-INF/druid-filter.properties下面,具体如下:druid.filters.default=com.alibaba.druid.filter.stat.StatFilterdruid.filters.stat=com.alibaba.druid.filter.stat.StatFilterdruid.filters.mergeStat=com.a......
  • 禁止运行脚本的报错怎么处理
       windows下运行*.ps1脚本(powershell的脚本)的时候,需要设置执行权限执行set-ExecutionPolicyRemoteSigned ......
  • Label数据窗口, “标签”窗口加载数据并打印
    说明:依据的"数据窗口(dw_6)"数据变化时需要调用该函数重新检索加载打印数据(of_label()),如下  效果:1//自建的函数,用于操作标签"label"数据窗口对象,加载及打印数据(隐藏)2//依据的"数据窗口(dw_6)"数据变化时需要调用该函数重新检索加载打印数据(of_label())3long......
  • Mybatis 数据库Mysql时间范围内数据查询非常慢的解决办法
    表中数据量过大,目前已有300万条,查询user_name数据速度非常慢,如果不使用索引,想优化sql来提高查询速度,在调试过程中发现,写sql查询数据库时,传入时间段查询部分为:<!--大于开始时间-->andsw.TIME>=to_date(CONCAT('2018-09-10','00:00:00'),'yyyy-mm-ddhh24:mi:ss')<!--小于结束......
  • 2万聊天词库机器人词库ACCESS数据库
    最近ChatGPT很火暴,机器人聊天很多年前就已经开始有了,只不过国内一直都是很浅显的应用,这几年又随着小米同学、新能源汽车的语音控制又有所发展,国外的ChatGPT对汉语的理解还不是很透彻,还需要大量的学习过程。这个聊天词库是从QQ机器人插件中提取出来的,但是有些分类没有导出,比如歇后......
  • Flink流式数据缓冲后批量写入Clickhouse
    一、背景对于clickhouse有过使用经验的开发者应该知道,ck的写入,最优应该是批量的写入。但是对于流式场景来说,每批写入的数据量都是不可控制的,如kafka,每批拉取的消息数量是不定的,flink对于每条数据流的输出,写入ck的效率会十分缓慢,所以写了一个demo,去批量入库。生产环境使用还需要优......
  • java map缓存数据自动过期
     packageztest;importjava.util.Date;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Timer;importjava.util.TimerTask;/***页面跳转时产生一个token*带到页面*页面保存时校验token**防止重复提交......
  • C# 连接SQLite数据库与建表
    SQLite是⼀个软件库,实现了自给自足的、无服务器的、零配置的、事务性的轻量级SQL数据库引擎。声明连接SQLite的变量Conn添加SQLite操作驱动dll引用:System.Data.SQLite.dllusingSystem.Data.SQLite;SQLiteConnectionConn;直接NuGet包搜索System.Data.SQLite......
  • 数据库配置
    数据库登录名配置1.在sa权限下新增数据库2.数据库-安全性-登录名-用户-用户映射-新数据库-勾选db_owner 预发布环境新建正式站数据库备份数据库1.正式站备份最新bak文件2.放正式站域名下载bak文件zip文件3.预发布环境数据库新增新的数据库4.还原数据库5.更新config文......
  • 【活动回顾】Databend 数据库表达式框架设计与实现 @GOTC
    5月28日,“全球开源技术峰会GOTC2023”圆满落幕。在本次会上,Databend数据库的优化器研发工程师骆迪安作为嘉宾中的一员,在rust专题专区分会场进行了一次主题为《Rust实现的先进SQL Parser与高效表达式执行框架—Databend数据库表达式框架设计与实现》的演讲。演......