为什么我的 Oracle JVM 会为一个简单的“Hello World”程序创建所有这些对象?

2024-03-27

我正在玩jmap并发现简单的“Hello World”Java 程序创建了数千个对象。这是对象的截断列表Oracle JVM 更新 131启动时创建:

 num     #instances         #bytes  class name
----------------------------------------------
   1:           402        4903520  [I
   2:          1621         158344  [C
   3:           455          52056  java.lang.Class
   4:           194          49728  [B
   5:          1263          30312  java.lang.String
   6:           515          26088  [Ljava.lang.Object;
   7:           115           8280  java.lang.reflect.Field
   8:           258           4128  java.lang.Integer
   9:            94           3760  java.lang.ref.SoftReference
  10:           116           3712  java.util.Hashtable$Entry
  11:           126           3024  java.lang.StringBuilder
  12:             8           3008  java.lang.Thread
  13:            74           2576  [Ljava.lang.String;
  14:            61           1952  java.io.File
  15:            38           1824  sun.util.locale.LocaleObjectCache$CacheEntry
  16:            12           1760  [Ljava.util.Hashtable$Entry;
  17:            53           1696  java.util.concurrent.ConcurrentHashMap$Node
  18:            23           1472  java.net.URL
  19:            14           1120  [S
  20:             2           1064  [Ljava.lang.invoke.MethodHandle;
  21:             1           1040  [Ljava.lang.Integer;
  22:            26           1040  java.io.ObjectStreamField
  23:            12           1024  [Ljava.util.HashMap$Node;
  24:            30            960  java.util.HashMap$Node
  25:            20            800  sun.util.locale.BaseLocale$Key

我知道 JVM 从 JAR 文件加载类并期望看到java.lang.Class, java.lang.String and [Ljava.lang.Object. 258 java.lang.Integer物体对我来说也很清楚:这就是Integer cache.

But java.lang.reflect.Field? Hashtable? Many StringBuilders? java.util.concurrent.ConcurrentHashMap?这是从哪里来的?

该程序非常简单:

public class Test {
    public static void main(String[] args) throws IOException {
        System.out.println("Hello world");
        System.in.read();
    }
}

JVM 详细信息:

java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

乌班图16.04。


您可以通过运行应用程序来找到答案-XX:+TraceBytecodes flag.
该标志可用于HotSpot JVM 的调试版本 https://stackoverflow.com/questions/40257504/trace-java-bytecode-stream/40296353#40296353.

这是详细的火焰图(可单击的 SVG),显示分配的对象来自的堆栈跟踪。

就我而言,启动拨款的主要来源是

  • URLClassLoader 和扩展类加载器
  • 区域设置缓存
  • 使用追踪客户端
  • 元索引注册表 http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/5b86f66575b7/src/share/classes/sun/misc/MetaIndex.java#l38
  • 系统属性
  • 字符集初始化

P.S. 剧本 https://gist.github.com/apangin/543f365dde05df0085083e82a3284866用于生成火焰图 https://github.com/brendangregg/FlameGraph来自 TraceBytecodes 输出。

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

为什么我的 Oracle JVM 会为一个简单的“Hello World”程序创建所有这些对象? 的相关文章

  • Android:如何暂停和恢复可运行线程?

    我正在使用 postDelayed 可运行线程 当我按下按钮时 我需要暂停并恢复该线程 请任何人帮助我 这是我的主题 protected void animation music6 music4 postDelayed new Runnab
  • 同一服务器上的许多应用程序具有相同的 JMX Mbean 类

    我有超过 5 个 Spring Web 应用程序 它们都在使用另一个通用库 这个公共库有它自己的 MBean 由于强制的唯一 objectName 约束 我的应用程序无法部署在同一服务器上 我使用 MBean 的方式是这样的 Managed
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 为什么在 10 个 Java 线程中递增一个数字不会得到 10 的值?

    我不明白 a 的值为0 为什么 a 不是10 那段代码的运行过程是怎样的 是否需要从Java内存模型来分析 这是我的测试代码 package com study concurrent demo import lombok extern sl
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 我们可以有条件地声明 spring bean 吗?

    有没有一种方法可以有条件地声明 Spring bean 例如
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • Java中Gson、JsonElement、String比较

    好吧 我想知道这可能非常简单和愚蠢 但在与这种情况作斗争一段时间后 我不知道发生了什么 我正在使用 Gson 来处理一些 JSON 元素 在我的代码中的某个位置 我将 JsonObject 的 JsonElements 之一作为字符串获取
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • 如何使用 Java Apache POI 隐藏 Excel 工作表中以下未使用的行?

    我正在使用数据库中的数据填充模板 Excel 工作表 for Map
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 在 Java 中通过 D-Bus MPRIS 访问 Clementine 实例

    我使用 Clementine 作为音乐播放器 它可以通过 D Bus 命令进行控制 在命令行上 使用 qdbus 我可以 Start Stop 暂停播放器 强制它跳过播放列表中的歌曲 检查播放列表的长度 检查播放列表中当前播放的曲目及其元数
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • __invert__ 方法

    目的是什么 invert 方法 我在探索 Python 内部结构时发现 gt gt gt dir builtins int abs add and bool ceil class delattr dir divmod doc eq floa
  • R - 图例中组合geom_vline和geom_smooth

    添加时我在图例中遇到一些奇怪的行为geom smooth and a geom vline 在我的 ggplot2 图表中 这是一个可重现的示例 library ggplot2 n lt 60 set seed 123 df lt data
  • 如何在给定角度的椭圆轮廓上获取点?

    因此 我给出了椭圆 它们由中点 水平半径 rh 和垂直半径 rv 定义 我使用 sin cos 绘制它们 结果对我来说看起来相当不错 只是确保这不是错误源 现在假设我有一个给定的角度 或方向向量 并且我希望椭圆轮廓上的点具有该角度 方向 我
  • 使用 XPath 选择根和子匹配表达式

    我正在使用 Nokogiri 来解析一些类似于以下内容的 XML
  • 自动调整 div 容器 html 中表格中的列大小

    我正在寻找一种解决方案 最好是在 css 或 html 中 以便我的位于 div 容器内的表格能够压缩其 以便在调整浏览器大小时它们保留在 div 容器内 http lux physicals ucdavis edu public new
  • 这个符号在 IntelliJ 中意味着什么? (文件名左下角红色圆圈,里面有“J”)

    在我创建的 Java 项目的 IntelliJ 的目标文件夹下 包中有一些 java 源文件 每个文件旁边的 J 图标都有一个红色圆圈 中间有一条线 这意味着什么 我如何解决它 您需要指定源目录 File gt Project Struct
  • 使用面板消息/解决方法时的 Java 1.5 JOptionPane 绘制错误?

    我有一个 JOptionPane 其中有一个自定义消息面板 位于面向 Java 1 5 的应用程序中 除其他内容外 该面板还包含一个 JTextField 每调用 20 次左右 对话框中就不会绘制任何内容 甚至 确定 取消 按钮也不会绘制
  • 让 docker-compose 只运行某些容器

    所以我目前可以使用 docker compose up test 它只运行我的数据库和测试脚本 我希望能够说 docker compose up app 或类似的东西来运行除测试之外的所有内容 这样我就不会运行不必要的容器 我不确定是否有办
  • 获取任意文件的二进制值

    如果假设我有一个文件 例如music mp3 or image jpg或任何要考虑的文件 我如何将这些文件的二进制表示形式转换为java中的字符串值 以便我可以查看它 例如 假设我有一个名为 video mp4 那么它必须表示为101011
  • Flask 和 Jinja2 使用漂白剂,图像 HTML 无法正常工作

    我一直在为自己的一个项目创建一个小博客 只有我作为用户才能访问发布页面 我之前一直在关注 Flask 教程 该教程的最终产品使您能够使用漂白剂和 Markdown 发布 HTML 并通过 Jinja2 模板传递它 In my models
  • Dockerfile 中的 AWS 凭证

    我需要在容器构建期间从 AWS S3 下载文件 但是我未能成功向构建过程提供 AWS 凭证 而无需将它们实际硬编码到 Dockerfile 中 我收到错误 docker 致命错误 无法找到凭据 尽管之前已经执行过 AWS 配置 此外 我无法
  • Intellij idea 中的 Ruby 设置

    这可能是显而易见的 但我无法在 Intellij 项目设置 编译器 插件等中找到 ruby 解释器路径以及任何其他可用的 ruby 设置 我确实安装了最新版本的 ruby 插件 并且使用的是 intellij 12 0 4 Ultimate
  • OOP 中的 php uasort

    class DBNews public function get latest posts limit code goes here posts array array uasort posts array this gt cmp publ
  • 在动作脚本 3 flex 4 中使用 DisplayObject(Group ,UIComponent) 剪切复制粘贴

    我正在我的应用程序中实现剪切复制粘贴 例如cacoo http www cacoo com 但我在这些操作过程中遇到问题 我正在使用剪切复制粘贴背后的想法 var className String getQualifiedClassName
  • 使用 Git 复制子模块

    我在 Git 中有一个项目 它有几个子模块 我需要下载这些子模块和可用的文件才能使用主项目 并且为了使子模块工作 我需要它们自己的子模块可用等等 为了进行设置 我使用递归地初始化子模块git submodule update init re
  • 具有三级深度连接的范围

    My Program桌子有很多Measures My Measure桌子有很多Targets My Target表有一列名为 money 我的 ActiveRecord 查询如下所示 programs2 Program includes m
  • 为什么当 TreeModel 添加新节点时我的 JTree 不更新?

    我正在使用一个DefaultTreeModel填充了覆盖DefaultMutableTreeNode它支持选择性地更改树中节点的显示字符串 如下面的代码所示 在我的表单中 我通过在单独的类中创建新节点来填充树 然后通过主数据类型的包装类将它
  • 计算不同的数,直到满足基于另一行的特定条件

    我有以下 df 原始df Step CampaignSource UserId 1 Banana Jeff 1 Banana John 2 Banana Jefferson 3 Website Nunes 4 Banana Jeff 5 A
  • 精确 HH:MM:SS 时间字符串的正则表达式模式

    我想准确验证字符串时间格式hh mm ss String 我的意思正是如此每个小时 分钟 秒必须是2 digits Also 仅接受逻辑值 like 小时 从 00 到 23 分钟 从 00 到 59 秒 从 00 到 59 当我检查时HH
  • 为什么我的 Oracle JVM 会为一个简单的“Hello World”程序创建所有这些对象?

    我正在玩jmap并发现简单的 Hello World Java 程序创建了数千个对象 这是对象的截断列表Oracle JVM 更新 131启动时创建 num instances bytes class name 1 402 4903520