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

news2024/10/7 8:22:45

目录

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

概述

相关文章在此总结如下:

文章地址
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 对象可以操作直接内存。

直接内存与堆内存比较

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

结束

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring事务之AOP导致事务失效问题

情况说明 首先开启了AOP,并且同时开启了事务。下面这个TransactionAspect就是一个简单的AOP切面,有一个Around通知。 Aspect Component public class TransactionAspect {Pointcut("execution(* com.qhyu.cloud.datasource.service.TransactionSe…

数据结构-链表的简单操作代码实现2【Java版】

目录 写在前: 此篇讲解关于单链表的一些面试题目,续上节。 11.反转一个单链表 12.给定一个带有头结点的head的非空单链表,返回链表的中间结点,如果有两个中间结点,则返回第二个中间结点 13.输入一个链表&#xff0c…

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.…

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

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

centos7下载python3离线安装包

下载离线安装工具 yum install yum-utils -y下载python3离线安装包 yumdownloader --destdir/root/python3 --resolve python3将python3下面的离线安装文件拷贝到其他服务器上就可以安装 离线安装 先进入到离线程序rpm文件存储路径 # 离线安装 rpm -Uvh --force --nodep…

Cnyunwei

运维管理系统:监控系统 Cnyunwei Centos 6 封装 Cacti、Nagios、Centreon(中英文自己切换)、Check_MK、Nconf英文版本全部采用与国外官方同步的最新版本,会发布32位和64位两个版本。 安装很简单,直接回车即可全自动安…

AttributeError: module ‘matplotlib‘ has no attribute ‘get_data_path‘

【报错】使用 AutoDL 下 Notebook 调用 matplotlib 时遇到 AttributeError: module matplotlib has no attribute get_data_path 报错: --------------------------------------------------------------------------- AttributeError …

《深入浅出进阶篇》——空间换时间优化——P2671 求和

链接:https://www.luogu.com.cn/problem/P2671 上题干: 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从11到n。每个格子上都染了一种颜色colori​用[1,m]当中的一个整数表示),并且写了一个数字numberi​。…

asp.net core mvc之 布局

一、布局是什么? 布局是把每个页面的公共部分,提取成一个布局页面(头、导航、页脚)。 二、默认布局 _Layout.cshtml 默认的布局是在 /Views/Shared 目录的 _Layout.cshtml文件。通常Shared目录中的视图都是公共视图。该目录下的…

部分背包问题【贪心算法】

部分背包问题是一种经典的贪心问题,物品可以取一部分,也就是可以随意拆分的物品。 算法思路: 用列表保存每个物品的价值及总重量、平均价值(性价比)。输入数据同时计算每种物品的平均价值。使用自定义的compare函数以…

PADS快速调整器件的位号

选择元器件, ctrlA 全选器件,右击菜单选择特性 如下三个信息,确认 配置标签信息,如图界面信息,点击应用,器件全部归位

Slax Linux 强化了会话管理和引导参数选项

导读Slax Linux 的创始人和维护者Tomas Matejicek 宣布 了他的微型和便携 GNU/Linux 发行版的新版本,带来了各种增强和错误修复。 新的 Slax Linux 版本(基于 Debian 的 12.1 版本和基于 Slackware 的 15.0.2 版本)引入了在可写设备上运行发…

vue3 ref 与shallowRef reactive与shallowReactive

ref 给数据添加响应式,基本类型采用object.defineProperty进行数据劫持,对象类型是借助reactive 实现响应式,采用proxy 实现数据劫持,利用reflect进行源数据的操作 let country ref({count:20,names:[河南,山东,陕西],objs:{key…

AI大模型时代,开发工程师与项目管理者面对的机遇和挑战,文末送书3本

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

centos7 在线安装python3

在线安装命令 yum install -y python3 输入命令之后等待安装完成 查看版本 查看版本3 输入命令 python3 看到版本号为3.6.8 查看版本2 输入命令 python2 看到版本号为2.7.5

网络运维Day13

文章目录 部署web服务器部署虚拟机web1安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 部署虚拟机web2安装依赖包解压NGINX压缩包初始化编译编译安装查看验证配置动静分离 配置NGINX七层代理测试健康检查功能 配置NGINX四层代理部署代理服务器 总结 部署web…

vue中cli组件如何自定义定义

目录 创建自定义组件 注册并使用自定义组件 注册组件: 在需要使用该组件的页面或父组件中注册并引入自定义组件。 使用 Props 传递数据 总结步骤: 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用…

RocketMQ底层通信机制

分布式系统各个角色间的通信效率很关键,通信效率的高低直接影响系统性能,基于Socket实现一个高效的TCP通信协议是很有挑战的,本节介绍RocketMQ是如何解决这个问题的。 1.Remoting模块 RocketMQ的通信相关代码在Remoting模块里,先…

Linkage Mapper 报错

1 . 错误提示:“No module named lm_config” 错误原因:**** 2.错误提示:“Cannot find an installation of Circuitscape in your Program Files directory.” 错误原因:***** 3. 错误提示:UnicodeEncodeError: ‘asc…

Windows 微PE WePE_64_V2.3 PE模式下启用账号和修改密码

启动PE后,进入桌面打开运行dism程序 选择带有系统的盘符(默认选的是PE盘),然后打开会话 选择左侧工具箱,然后右侧找到账户管理 然后就可以对已有账号进行管理了 结束。