黑马JVM总结(八)

2023-10-26

(1)StringTable面试题

1.8 

1.6时

(2)StringTable的位置

jvm1.6时StringTable是常量池的一部分,它随着常量池存储在永久代当中,在1.7、1.8中从永久代变成了堆中,为什么做这个更改呢?因为永久代的内存效率很低,永久代是在Full  GC的时候才会触发永久代的垃圾回收,Full  GC只有等到老年代的空间不足时才会触发,触发的时机比较晚导致StringTable的回收效率不高

StringTable用的非常的频繁它里面存储的都是字符串常量,我们java程序中字符串常量对象都会分配到StringTable中,它的回收效率不高会占用大量的内存,它的效率不高,会产生永久代的内存不足,基于这个缺点,把它转到堆里面,在堆里面只需要Minor GC就可以触发垃圾回收,一些常量池中的用不到的字符串对相关就可以垃圾回收,大大减轻了字符串对内存的占用 

下面用例子证明一下StringTable串池的位置:我们把字符串放到集合中不让它回收

上面没有触发内存不足,是因为循环次数不足以触发,我们在1.6的情况下吧永久代的内存设置小一些,就会暴露内存不足的现象

报的是永久代内存溢出 

切换到1.8环境下:设置最大参数

 报这个GC overhead....  这个是jvm垃圾回收的规则是由虚拟机参数控制的:

有个虚拟机参数

可以 关闭这个参数:

再次运行堆内存空间不足

通过以上就可以证明StringTable1.8用的是空间,1.6用的是永久代

(3)String_Table的垃圾回收

StringTable也会受到垃圾回收的管理的,当内存空间不足时StringTable中哪些没有被引用的字符串常量也会被垃圾回收

-Xmx10m:设置虚拟机堆内存的最大值

-XX:+:PrintStringStatistics打印字符串表的统计信息,通过它我们就可以看到串池中的字符串个数,及大小信息

-XX:+PrintGCDetails -verbose:gc 打印垃圾回收的信息把垃圾回收的次数啊时间啊显示出来

 堆内存占用,垃圾回收信息

 符号表:类的字节码里类名、方法名、变量名

StringTable的统计信息

StringTable的底层类似我们的HashTable的实现:数组+列表

数组的个数称为桶:

StringTable是以哈希表的方式存储数据的通的个数叫做buckets

存储的字符串对象:entries个数

字符串常量个数:literals

上面的代码我们什么都没有做,但是有数据,java程序在运行时类名,方法名,这些数据也是以字符串常量的形式表示的他们也存在串池中已经有那么多字符串对象了

 我们写入代码:加入串池,观看前后串池的字符串常量个数变化

变为1854 ,此时没有触发垃圾回收,我们可以进行修改加入串池的个数

修改为存入串池为10000个:当10兆的堆内存可能存不下,会触发垃圾回收,我们可以看到存入串池的字符串个数,并没有全部存入7226

为什么只存入七千多呢,因为触发了垃圾回收

通过以上案例我们可以得出StringTable也是可以发生垃圾回收的

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

黑马JVM总结(八) 的相关文章

  • Lambda 性能改进,Java 8 与 11

    我对 lambda 与方法参考运行了一些 JMH 测试 看起来类似于 IntStream reduce Integer max vs IntSream reduce i1 i2 gt Integer max i1 i2 我注意到 在 Jav
  • Java 堆被无法访问的对象淹没

    我们的 Java EE 应用程序开始出现一些严重问题 具体来说 应用程序在启动后几分钟内就运行了高达 99 的老年代堆 不会抛出 OOM 但实际上 JVM 没有响应 jstat 显示老年代的大小根本没有减少 没有垃圾收集正在进行 并且kil
  • 当 Java 中的集合超出容量时会发生什么?

    我有一个服务 它将所有对其进行的调用暂存在内存中 因为我们不想丢失数据 同时我们需要该服务因任何外部依赖项 例如数据库 而失败 然后 这些分阶段的调用会在后台例行接收和处理 如果出于任何原因 如果调用太多并且内存不足 我们就需要警惕 所以
  • 热点 JVM 字节码解释器是跟踪 JIT 吗?

    这个问题几乎说明了一切 我一直在寻找答案 甚至通过 VM 规范 但我没有明确说明 No 不过 还有一些其他 JVM 具有跟踪 JIT HotPath http HotPath GoogleCode Com and Maxine http L
  • 非活动状态下的 Spring Boot 堆使用情况

    我在本地部署了一个非常简单的 spring boot 应用程序 它只有一个类 控制器 差不多就这样了 我注意到堆分配并不稳定 并且有峰值和突然下降 为什么会这样 我没有对应用程序进行过一次调用 A view from VisualVM 事实
  • 启用JConsole远程监控是否会影响生产中的系统性能?

    Oracle Sun 说只要不在生产环境中本地运行就可以吗 http download oracle com javase 1 5 0 docs guide management jconsole html http download or
  • Java 接口合成方法生成,同时缩小返回类型

    我有 2 个接口和 2 个返回类型 interface interfaceA Publisher
  • 为什么 MetaSpace 大小是已用 MetaSpace 的两倍?

    我写了一个程序来模拟MetaSpace OOM 但我发现MetaSpace Size几乎总是两倍大Used MetaSpace Why 我用标志运行我的程序 XX MaxMetaspaceSize 50m 程序抛出OOM时Used Meta
  • jvm 如何以及何时何地更改 Linux 的最大打开文件值?

    在linux中 每个登录用户的每个进程的最大打开文件数有限制 如下所示 ulimit n 1024 当我学习java nio时 我想检查这个值 因为channel在Linux中也是一个文件 所以我编写了一个客户端代码来不断创建socketC
  • 强制jvm返回本机内存[重复]

    这个问题在这里已经有答案了 我时不时地运行需要大量内存的 eclipse 任务 因此 当任务运行时 jvm 会消耗大约 2 3GB 的 RAM 这是可以的 但是一旦 jvm 占用了该内存 它就不会释放它 并且我遇到了一种情况 堆中已用内存约
  • Bipush 在 JVM 中如何工作?

    我知道 iload 接受整数 1 到 5 但是如何使用 bipush 指令扩展到更高的数字 特定整数如何与字节码一起存储 有几种不同的指令可用于推送整数常量 最小的是iconst 指令 这些只是一个字节 因为该值是在操作码本身中编码的 ic
  • OQL 包中的所有实例

    是否有可能在OQL检索属于一个包的所有对象 或者我可以查询wildcards 正如 haridsv 建议我尝试过的 SELECT from com example and SELECT a from com example but in V
  • 如何使用 Java 引用释放 Java Unsafe 内存?

    Java Unsafe 类允许您按如下方式为对象分配内存 但是使用此方法在完成后如何释放分配的内存 因为它不提供内存地址 Field f Unsafe class getDeclaredField theUnsafe Internal re
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • 线程上下文类加载器和普通类加载器的区别

    线程的上下文类加载器和普通类加载器有什么区别 也就是说 如果Thread currentThread getContextClassLoader and getClass getClassLoader 返回不同的类加载器对象 将使用哪一个
  • 测量 tomcat 的排队请求数

    因此 使用tomcat 您可以设置acceptCount值 默认为100 这意味着当所有工作线程都忙时 新连接被放置在队列中 直到队列满 之后它们被拒绝 我想要的是监视此队列中项目的大小 但无法确定是否有办法通过 JMX 获取此值 即不是队
  • 无法为对象堆保留足够的空间

    每次尝试运行该程序时 我都会重复出现以下异常 VM初始化期间发生错误 无法为对象堆保留足够的空间 无法创建Java虚拟机 我尝试增加虚拟内存 页面大小 和 RAM 大小 但无济于事 我怎样才能消除这个错误 运行 JVM XX MaxHeap
  • JVM锯齿状空闲进程

    我目前正在进行一项涉及 JVM 及其内存使用工作原理的研究 我不明白的是 JVM在空闲时用什么填充它的内存 只是为了在堆几乎达到时释放它 为什么使用的内存不只有一条平线 顺便说一句 这个 java 应用程序托管在 glassfish 上 但
  • 使用同一类的不同版本进行类加载:java.lang.LinkageError:尝试重复名称的类定义

    我有一个工作代码 可以动态加载具有不同类名的不同类实现 类文件被加载到内存数据库 Apache 德比数据库 类加载器检索 class文件来自BLOB列 我想做的是插入 class文件为带有版本列的二进制 BLOB 和IS ENABLED标志
  • java内存不足然后退出

    我有一个必须分析大文件的软件 限制输入或提供无限内存都不是一个选择 所以我必须忍受飞行的 OOME 因为 OOME 只杀死线程 所以我的软件运行在一些糟糕的状态 从外面看一切都很好 因为进程正在运行 但在内部却是脑死亡 我想拔掉它的插头 但

随机推荐

  • centos系统yum源配置

    1 centos 8本地源配置 1 连接镜像文件 将centos 8系统镜像通过KVM连接到系统下 2 挂载镜像文件 mount dev sr0 mnt dev sr0为镜像文件在系统下的位置 3 编辑配置文件 cd etc yum rep
  • node播放视频流

    import http from http import url from url import util from util import qs from querystring import fs from fs 默认GET方法响应 c
  • SpringBoot微服务架构学习

    一 SpringBoot概述 1 什么是SpringBoot SpringBoot是一个开发基于Spring框架的应用的快速开发框架 它也是SpringCloud构建微服务分布式系统的基础设施 2 SpringBoot有哪些主要特性 Spr
  • Python与自动化测试:提高软件质量和稳定性

    在软件开发过程中 自动化测试是提高软件质量和稳定性的重要手段之一 Python作为一种简洁而强大的编程语言 为自动化测试提供了丰富的工具和库 本文将介绍几个常见的自动化测试案例 并提供详细的Python代码示例 帮助您更好地理解和应用自动化
  • Caffe各层的参数设置(在prototxt文件中设置)

    Caffe各层的参数设置 在prototxt文件中设置 这些参数定义在include caffe proto caffe proto文件中 如果要查看某种层的参数 请展开本文的目录 点击相应的条目来跳转 syntax proto2 pack
  • CSS字体、文本属性

    CSS字体 文本属性 字体系列 font family设置字体 字体大小 字体粗细 文字样式 字体复合属性 字体属性总结 文本系列 文本属性 文本颜色 对齐文本 装饰文本 文本缩进 行间距 字体系列 font family设置字体 cs使用
  • C++ 调试 The breakpoint will not currently be hit. No symbols have been loaded for this document.

    C debug调试 The breakpoint will not currently be hit No symbols have been loaded for this document 1 编译 以Test为例 右键Properti
  • Nginx解决“no resolver defined to resolve xxx.xxx”

    1 2 3 4 5 6 7 8 9 10
  • AI制作ICON展示

    作者 陈石军 撰写时间 2019年4月7日 我先做了个背景色 这个背景色我用了三种颜色 它们分别为白色 fdfdfd 蓝色 94cfe2 绿色 72c190 背景色是由一个矩形和俩个形状图形组成的 接下来就是排版了 排版有好几种 分别是靠左
  • Scratch第一讲:scratch编程软件介绍

    喜欢编程的各位小朋友们你们好呀 欢迎来到scratch小课堂 从今天起 我们要从0开始学习scratch编程 那么有的同学要问了 什么是scratch Scratch是由麻省理工学院 MIT 设计开发的一款面向少年的简易编程工具 它的功能非
  • Linux线程性能分析和CPU亲和力

    一 线程迁移和负载均衡 Linux系统在多核CPU和SMP系统上有完善的负载均衡支持 在SMP系统中 每个CPU的核都有一个迁移线程守护程序migration 一般是系统最高优先级139 实时99 以实现执行资源平衡作业 当我们调用sche
  • 5g信号云端服务器,5G基站已有11W 国内云游戏迎来春天

    目前有报道称全国已经开通了11 3W个5G网络基站 已有87万户5G签约用户 这意味着在全国范围 有关需要网络的IT产品和生活产品都将迎来春天 其中包括网络连接使用的云游戏 进入到2019年 国内5G商用全面启动 华为 小米 OPPO等手机
  • QString : 类型转换,不留神就留坑?

    QString作为Qt中内置的数据类型 功能强大且使用方便 绝对是在Qt开发过程中出场率最高的数据类型 本篇我们只重点探讨下QString转换成其他数据类型的注意事项 short toShort bool ok nullptr int ba
  • gg修改器修改数值没有用怎么办_gg修改器修改游戏数值教程_gg修改器怎么修改数值_3DM手游...

    GG修改器是很多玩家都在用的一款游戏辅助工具 使用这款软件 能够对多种游戏的数值进行随意的修改 调整成你所需要的数值 让你玩游戏玩的更爽 今天3DM小编为大家带来的是GG修改器修改游戏数值的教程 有需要的小伙伴们可以来一起了解下 GG修改器
  • Android事件分发机制及设计思路,熬了整整30天

    前言 想要成为一名优秀的Android开发 你需要一份完备的知识体系 在这里 让我们一起成长为自己所想的那样 此篇文章是初中高级工程师学习文章 知识体系较为完整 有如下特点 1 知识结构全面 2 跟随当下技术潮流实时更新 3 可用于面试 学
  • mybatis

    mybatis 起步1 之前的mybatis写法 起步2 接口式编程写法 mybatis的配置 properties settings mapUnderscoreToCamelCase typeAliases mappers 这里项目结构发
  • (三)系统与架构级低功耗设计

    前面讲解了使用EDA工具 主要是power compiler 进行功耗分析的流程 这里我们将介绍在数字IC中进行低功耗设计的方法 同时也结合EDA工具 主要是Design Compiler 如何实现 我们的讲解的低功耗设计主要是自顶向下的设
  • 笔录Flutter(十一) FloatingActionButton

    Flutter练习Demo FloatingActionButton也是经常用的 除了常见的悬浮在右下角的一个按钮 还可以利用floatingActionButtonLocation属性 控制位置的展示 floatingActionButt
  • Python:使用爬虫抓取网页中的视频并下载(完整源码)

    Python 使用爬虫抓取网页中的视频并下载 完整源码 在今天的程序开发世界中 网站是不可或缺的一部分 人们使用网站来获取有用的信息 购买商品和娱乐自己 这些网站的内容通常包含了各种类型的文件 其中最常见的就是视频 对于有经验的程序开发者来
  • 黑马JVM总结(八)

    1 StringTable面试题 1 8 1 6时 2 StringTable的位置 jvm1 6时StringTable是常量池的一部分 它随着常量池存储在永久代当中 在1 7 1 8中从永久代变成了堆中 为什么做这个更改呢 因为永久代的