5.运行时数据区-字符串常量池、程序计数器、直接内存

目录

  • 概述
  • 字符串常量池
    • 字符串常量池存储数据的方式
      • 三种常量池
      • 字面量与符号引用
    • 哈希表
    • 实战
  • 程序计数器
  • 直接内存
    • 直接内存与堆内存比较
  • 结束

概述

相关文章在此总结如下:

文章地址
jvm基本知识地址
jvm类加载系统地址
双亲委派模型与打破双亲委派地址
运行时数据区地址

字符串常量池

字符串常量池存储数据的方式

字符串常量池使用的是StringTable的数据结构存储数据,类似于HashTable(哈希表)

注意: 双引号表示的字符串,默认都是存在字符串常量池的。堆内存中的字符串想进入字符串常量池,也不是不可的。

在这里插入图片描述

三种常量池

  • Class文件常量池
  • 运行时常量池
  • 字符串常量池

字面量与符号引用

字面量: int 、float、long、double、双引号字符串等
符号引用:Class、Method、Field等

哈希表

哈希表(也叫散列表),是根据关键码值(K-V)而直接进行访问的数据结构。本质上就是个数组+链表

在这里插入图片描述

  • key:散列函数,公式:hash(字符串) % 数组size
  • value:字符串的引用
  • size: -XX:StringTableSize=65536
    目标:加速查找速度

实战

测试案例如下:

package com.fun.classloader;

/**
 * 测试字符串常量池
 */
public class TestStringPool {
    public static void main(String[] args) {
        test();
    }

    public static void test() {
        String str1 = "abc";
        String str2 = new String("abc");
        // false  == 比较的是对象内存地址
        System.out.println(str1 == str2);

        String str3 = new String("abc");
        // false
        System.out.println(str2 == str3);

        // 编译期会计算出 "ab"
        String str4 = "a" + "b";
        // true
        System.out.println(str4 == "ab");

        String s1 = "a";
        String s2 = "b";
        String str6 = s1 + s2;
        // false 变量相加运行期计算
        System.out.println(str6 == "ab");

        // 带方法的运算也是运行期计算
        String str7 = "abc".substring(0, 2);
        // false
        System.out.println(str7 == "ab");

        String s5 = "a";
        String s6 = "abc";
        String s7 = s5 + "bc";

        // true
        System.out.println(s6 == s7.intern());
    }
}

在这里插入图片描述

总结如下:

  • 单独使用""引号创建的字符串都是常量,编译期就已经确定存储到字符串常量池中
  • 使用 new String(“”) 创建的对象会存储到 heap 中,是运行期新创建的
  • 使用只包含常量的字符串连接符,如:“a”+“b” 创建的也是常量,编译期就已经确定存储到字符串常量池中
  • 使用包含变量的字符串连接如 “a” + s 创建的对象是运行期才创建的,存储到 heap 中
  • 运行期调用 String 的 intern() 方法可以向字符串常量池中动态添加对象

程序计数器

程序计数器,也叫PC寄存器、当前线程所执行的字节码指令行号指示器

**注意:**线程切换(系统上下文切换) 后准确恢复执行位置,需要知道执行到的位置

存储数据

  • java 方法:记录虚拟机字节码指令地址
  • native方法:记录为空

异常:唯一没有OOM异常的区域

直接内存

直接内存不是虚拟机运行时数据区的一部分,也不是 java 虚拟机规范 中定义的内存区域

在 jdk1.4 中,新加了 NIO,引入了 Channel 和 Buffer 的 IO 方式,可以使用 native 方法直接分片对外内存,然后通过 DirectByteBuffer 对象可以操作直接内存。

直接内存与堆内存比较

内存区域分配空间读写操作
堆内存性能很好效率低
直接内存性能很差效率高

结束

至此,字符串常量池、程序计数器、直接内存,就结束了,如有疑问,欢迎评论区留言。

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

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

相关文章

Windows系统隐藏窗口启动控制台程序

背景 上线项目有时候需要一些控制台应用作为辅助服务来协助UI应用满足实际需求,这时候如果一运行UI就冒出一系列的黑框,这将会导致客户被下的不起,生怕中了什么不知名病毒 方案 可以使用vbs来启动,这个是window系统自带的&#…

Python | 机器学习之数据清洗

​ 🌈个人主页:Sarapines Programmer🔥 系列专栏:《人工智能奇遇记》🔖少年有梦不应止于心动,更要付诸行动。 目录结构 1. 机器学习之数据清洗概念 1.1 机器学习 1.2 数据清洗 2. 数据清洗 2.1 实验目的…

Xilinx Kintex7中端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优缺点4、详细设计方案设计原理框图OV5640及其配置权电阻硬件方案MIPI CSI-2 RX SubsystemSensor Demosaic图像格式转换Gammer LUT伽马校正VDMA图像缓存AXI4-Stream toVideo OutHDMI输出 5、…

Nginx 使用笔记大全(唯一入口)

Linux服务器因为Nginx日志access.log文件过大项目无法访问 项目处于运行状态下无法访问,第一步查看磁盘状态 1、查看磁盘状态 df -h 2、查找100M以上的文件 find / -size 100M |xargs ls -lh 3、删除文件 rm -rf /usr/local/nginx/logs/access.log 4、配置nginx.…

家政服务小程序源码系统+上门预约服务 源码完全开源可二次开发 带完整的搭建教程

在互联网的快速发展下,传统的家政服务行业也在逐步向数字化、智能化方向转型。为了满足消费者对于家政服务的高品质需求,罗峰给大家分享一款基于微信小程序的上门预约家政服务系统。该系统采用完全开源的源码系统,可进行二次开发,…

记录pytorch实现自定义算子并转onnx文件输出

概览:记录了如何自定义一个算子,实现pytorch注册,通过C编译为库文件供python端调用,并转为onnx文件输出 整体大概流程: 定义算子实现为torch的C版本文件注册算子编译算子生成库文件调用自定义算子 一、编译环境准备…

【GlobalMapper精品教程】064:点云提取(按范围裁剪)

本文讲解Globalmapper中进行点云数据提取(按范围裁剪)的方法。 文章目录 一、加载点云及范围数据二、点云裁剪三、注意事项一、加载点云及范围数据 加载配套实验数据包中的实验数据data064.rar中的point.las点云与bound.shp面状范围数据,如下图所示: 二、点云裁剪 接下来…

【C/PTA——8.数组2(课内实践)】

C/PTA——8.数组2&#xff08;课内实践&#xff09; 7-1 求矩阵的局部极大值7-2 求矩阵各行元素之和7-3 判断上三角矩阵7-4 点赞 7-1 求矩阵的局部极大值 #include<stdio.h> int main() {int m, n, i, j;int arr[100][100];scanf("%d %d", &m, &n);for…

PHP在自己框架中引入composer

目录 1、使用composer之前先安装环境 2、 在项目最开始目录添加composer.json文本文件 3、写入配置文件 composer.json 4、使用composer安装whoops扩展 5、引入composer类并且使用安装异常显示类 1、使用composer之前先安装环境 先安装windows安装composer并更换国内镜像…

Linux内存管理 | 五、物理内存空间布局及管理

我的圈子&#xff1a; 高级工程师聚集地 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强企业&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; …

Linux 性能调优之硬件资源监控

写在前面 考试整理相关笔记博文内容涉及 Linux 硬件资源监控常见的命名介绍&#xff0c;涉及硬件基本信息查看查看硬件错误信息查看虚拟环境和云环境资源理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#x…

如何通过把setTimeout异步转为同步

一.封装定时器函数 function delayed(time){return new Promise((resolve,reject)>{setTimeout( () > {resolve(time)}, time);}) }二调用的时候通过async await 修饰 async function demo() {console.log(new Date().getMinutes(): new Date().getSeconds())await del…

Transformers 中原生支持的量化方案概述

本文旨在对 transformers 支持的各种量化方案及其优缺点作一个清晰的概述&#xff0c;以助于读者进行方案选择。 目前&#xff0c;量化模型有两个主要的用途: 在较小的设备上进行大模型推理对量化模型进行适配器微调 到目前为止&#xff0c;transformers 已经集成并 原生 支持了…

VScode不打开浏览器实时预览html

下载Microsoft官方的Live Preview就行了 点击预览按钮即可预览

深圳联强优创手持PDA身份证阅读器 身份证核验手持机

身份证手持机外观比较小巧&#xff0c;方便携带&#xff0c;支持条码识别、人脸识别、NFC卡刷卡、内置二代证加密模块&#xff0c;可离线采集和识别二代身份证&#xff0c;进行身份识别。信息读取更便捷、安全高效。采用IP65高防护等级&#xff0c;1.5M防摔&#xff0c;可以适应…

RFID汽车制造工业系统解决方案

随着物联网技术的不断发展&#xff0c;汽车行业的信息化水平也在不断提高&#xff0c;随着近几年国产汽车的带动&#xff0c;汽车配件配套市场也已形成了一定的规模&#xff0c;初步形成比较完整成熟的零部件配套体系。 RFID汽车制造工业系统解决方案 与其他行业对比&#xff0…

人工智能与发电玻璃:未来能源技术的融合

人工智能与发电玻璃&#xff1a;未来能源技术的融合 摘要&#xff1a;本文探讨人工智能与发电玻璃这两项技术的结合&#xff0c;共同推动能源领域的创新。本文将介绍发电玻璃工作原理及应用、人工智能在发电玻璃的应用领域以及共同为可持续能源发展做出贡献。 一、引言 随着科…

Android自定义控件:一款多特效的智能loadingView

先上效果图&#xff08;如果感兴趣请看后面讲解&#xff09;&#xff1a; 1、登录效果展示 2、关注效果展示 1、【画圆角矩形】 画图首先是onDraw方法&#xff08;我会把圆代码写上&#xff0c;一步一步剖析&#xff09;&#xff1a; 首先在view中定义个属性&#xff1a;priv…

虹科示波器 | 汽车免拆检修 | 2010款奥迪A5车怠速时发动机偶尔自动熄火

一、故障现象 一辆2010款奥迪A5车&#xff0c;搭载CDN发动机&#xff0c;累计行驶里程约为16.3万km。车主进厂反映&#xff0c;发动机怠速偶尔出现抖动&#xff0c;紧接着自动熄火&#xff1b;重新起动&#xff0c;发动机又能正常工作&#xff1b;故障频率较低&#xff0c;有时…

Elastcsearch入门案例之 —— 搜索聚合

前言 在前面的Mall项目脚手架整合中涉及到的Elasticsearch的内容仅仅只是在表面给出了一个在SpringBoot中的使用示例&#xff0c;但其实对于Elasticsearch的一些基础概念和底层的原理并没有过多的涉及&#xff0c;这种学习方式是浮躁的&#xff0c;所以这篇文章荔枝会对其中欠缺…