使用Instrumentation创建代理程序监测Java对象信息

news2024/9/28 23:32:48

文章目录

  • 创建代理
  • 使用代理监测
    • 测试代码
    • 运行配置
    • 运行效果
  • 总结

Instrumentation 是Java提供的一种能够在程序运行时检查和修改类定义的技术。使用Instrumentation,可以构建一个独立于应用程序的代理程序,检测和协助运行在JVM上的程序,甚至可以修改和替换某些类的定义。
本文尝试用它构建一个代理程序,用于监测Java对象占用的内存大小。

创建代理

  1. 在项目中创建代理模块ObjectSize。
    在任意Java项目中通过New - Module创建一个新的模块ObjectSize。也可以单独创建项目。
  2. 创建Java代理程序
package org.hbin.jvm.agent;

import java.lang.instrument.Instrumentation;

/**
 * @author Haley
 * @version 1.0
 * 2024/8/23
 */
public class ObjectSizeAgent {
    private static Instrumentation inst;

    public static void premain(String agentArgs, Instrumentation _inst) {
        inst = _inst;
    }

    public static long sizeOf(Object obj) {
        return inst.getObjectSize(obj);
    }
}
  1. 生成代理Jar包
    选中当前模块,然后在菜单栏打开依次打开:File - Project Structure,在打开的Project Structure窗口中依次点击:Artifacts - JAR - From modules with dependencies。

选择刚建的Module或项目,然后配置MF文件的目录并保存。
在这里插入图片描述
更新MF文件的配置,添加Premain-class,值为刚创建的Class全路径名:
在这里插入图片描述
打开菜单栏中的Build - Build Artifact,Build即可。
在这里插入图片描述
构建顺利的话,你应该已经看到新生成的Jar文件
在这里插入图片描述

使用代理监测

有了这个代理,那应该如何使用呢?其实也很简单,先写一段代码,然后运行它即可。

测试代码

编写一段测试代码,示例如下:

package agant;

import org.hbin.jvm.agent.ObjectSizeAgent;

/**
 * @author Haley
 * @version 1.0
 * 2024/8/23
 */
public class ObjectSizeTest {

    public static void main(String[] args) {
        System.out.println(ObjectSizeAgent.sizeOf(new Object()));
        System.out.println(ObjectSizeAgent.sizeOf(new int[3]));
    }
}

因为要用到ObjectSizeAgent,记得先把上面的Module添加到项目依赖中哈

运行配置

运行这个测试前,还要配置代理,需要用到-javaagent:参数。

-javaagent:/Users/Haley/workspace/kafka/out/artifacts/ObjectSize_jar/ObjectSize.jar

根据你的实际环境修改上述路径

运行效果

在这里插入图片描述

总结

利用这个代理可以清晰的看到Java对象占用的内存大小,不过它的功能简单、操作复杂,其实也可以使用现成的JOL(Java Object Layout)来替代。你觉得呢?

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

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

相关文章

Netty03-进阶

三. Netty 进阶 1. 粘包与半包 1.1 粘包现象 服务端代码 public class HelloWorldServer {static final Logger log LoggerFactory.getLogger(HelloWorldServer.class);void start() {NioEventLoopGroup boss new NioEventLoopGroup(1);NioEventLoopGroup worker new Ni…

高性能4G灯杆网关,未来智慧城市的神经中枢

在智慧城市的建设浪潮中,灯杆作为城市基础设施的重要组成部分,正在经历一场革命性的转变。SG600 4G灯杆网关就是这场革命的核心产品,它将普通的路灯转变为集照明、监控、通信、环境监测等多功能于一体的智慧终端。 产品优势: 高度…

[图解]分析工作流开始01

1 00:00:02,650 --> 00:00:04,200 需求工作流结束之后 2 00:00:04,610 --> 00:00:06,880 我们就要进入分析工作流了 3 00:00:07,890 --> 00:00:09,020 在分析工作流里面 4 00:00:09,030 --> 00:00:13,060 我们使用类图、序列图 5 00:00:13,710 --> 00:00:16…

深度学习入门-03

PS:基于小土堆视频学习https://www.bilibili.com/video/BV1hE411t7RN?p6&vd_source22926f91481026cd10af799bb45e448b 1、Dateset Dateset就是我们的目标数据,告诉我们如何获取数据,距离:从多种类型的数据中,提取…

Go语言反射入门:理解类型与值的动态操作

简介 Go 语言的反射机制是一种在运行时检查程序本身的能力,它允许程序在运行时动态地操作对象的类型和值。 基本概念 1.反射与类型 在静态类型语言中,变量的类型在编译时确定。反射允许在运行时查询和修改变量的类型信息。 2.接口与反射 Go 中的接口…

云等保安全合规解决方案

在当今数字化时代,云计算已成为企业数字化转型的基石,它不仅极大地提升了数据处理能力、降低了运营成本,还促进了业务模式的创新与发展。然而,随着云服务的广泛应用,云环境的安全性问题也日益凸显,成为制约…

Tita的OKR:研发人员的OKR

当您要建立一个以产品为中心的团队,并希望你的团队有一个产品的心态和时刻围绕你的客户,此工程研发 OKR 示例就是实现此目标的伟大方法。您将在以下文章中找到相关的技术研发 OKR 示例。 技术研发团队是任何组织中的重要组成部分,正确的OKR可…

U盘车载专用音乐合集 3068首 24G

包含3068首适合车载播放的音乐。 拿走的麻烦评论一下,感谢!!! 拿走的麻烦评论一下,感谢!!! 拿走的麻烦评论一下,感谢!!! 链接&#…

主流短视频评论采集python爬虫(含一二级评论内容)

声明 仅用于学习交流,不用于其他用途 正文 随着主流短视频评论采集更新需要登录,由于不懈的努力,攻破这一难点,不需要登录采集作品所有评论信息 话不多说上代码看效果: 输入作品id: 这样就拿到评论信息了&#xff…

c++中调用函数时出现“warning C4715: “controlMode”: 不是所有的控件路径都返回值”警告的问题

调用函数时出现“warning C4715: “controlMode”: 不是所有的控件路径都返回值”警告的问题 问题描述解决方案 问题描述 如图所示,我的函数定义如下 在编译的时候,会出现如下警告 warning C4715: “controlMode”: 不是所有的控件路径都返回值 解决方案…

易通博客项目测试报告

目录 1. 项目背景1.1 测试目标 2. 项目功能3.测试分类3.1 功能测试3.2 自动化测试3.2.1自动化测试遇到的问题以及解决:3.2.2 自动化测试结果 3.3 性能测试 4. 基于场景性能测试下遇到的一些问题4.1 解决博客id不存在的问题?4.2 添加博客请求响应失败&…

[Other]-安装ruby、ascli、ascp

最近新接到这样一个需求,将生物原始数据上传到某中心,其中用到ascp命令,阴差阳错的装了ruby、ascli,这里就都一并介绍下安装方式,由于服务器老旧默认安装时ruby2.0,又 升级到2.7等引发的一系列问题&#xf…

Anaconda与conda、pip与conda的区别

Anaconda与conda、pip与conda的区别 1. 引言1.1 背景介绍1.2 文章目的 2. 什么是Anaconda?2.1 Anaconda简介2.2 Anaconda的优势2.3 Anaconda的安装与配置 3. 什么是Conda?3.1 Conda简介3.2 Conda的功能和用途3.3 Conda与Anaconda的关系 4. 什么是Pip&…

如何将精益生产目标的设定与企业财务状况相结合?

在探讨如何将精益生产目标的设定与企业财务状况相结合时,我们首先需要明确两者的核心要素及其相互关系。精益生产,起源于丰田生产方式,旨在通过消除浪 费、持续改进和全员参与,实现生产过程的最大化效率和最小化成本。而企业财务状…

NC 寻找第K大

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 有一个整数数…

Prometheus 和 Grafana 通过nginx-exporter监控nginx

在生产环境下,您已经部署了 Prometheus 和 Grafana,并希望通过它们来监控另一台 Ubuntu 20.04 上的 Nginx 服务。以下是配置步骤: 1. 安装和配置 nginx-exporter (Nginx 的 Prometheus 导出器) nginx-exporter 是 Prometheus 用来从 Nginx …

Godot《躲避小兵》实战之创建敌人

是时候创建一些玩家必须躲避的敌人了。它的行为很简单:怪物将随机生成在屏幕的边缘,沿着随机的方向直线移动。 我们将创建一个 Mob 的怪物场景,以便在游戏中独立实例化出任意数量的怪物。 节点设置 点击顶部菜单的“场景 -> 新建场景”…

C++初学(14)

14.1、while循环 和for循环相比,while循环没有初始化和更新部分,它只有测试条件和循环体。 while(text-condition)body首先程序计算圆括号内的测试条件(text-condition)表达式。如果该表达式为ture,则执行循环体中的…

短剧系统搭建:从零搭建高效创意内容平台教程,源码分享+正版片源授权指南

目录 一、短剧系统是什么? 二、短剧系统怎么搭建 技术选型 安全与性能优化 测试与部署 运营与维护 三、部分代码展示 一、短剧系统是什么? 短剧是一种采用单集时长15—30分钟的系列剧、集数在6集内的系列单元剧、20集内的连续剧、周播剧等多种形态…

Slowman - hackmyvm

简介 靶机名称:Slowman 难度:简单 靶场地址:https://hackmyvm.eu/machines/machine.php?vmSlowman 本地环境 虚拟机:vitual box 靶场IP(Slowman):192.168.130.57 windows_IP&#xff1a…