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

server/2024/9/23 15:55:14/

文章目录

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

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

创建代理

  1. 在项目中创建代理模块ObjectSize。
    在任意Java项目中通过New - Module创建一个新的模块ObjectSize。也可以单独创建项目。
  2. 创建Java代理程序
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.ppmy.cn/server/105043.html

相关文章

idea启动报错Improperly specified VM option.

我本来是想解决idea启动占内存的问题,在网上找了个修改启动参数,这么改的 因为格式不正确,idea启动报错: Improperly specified VM option. To fix the problem, edit your JVM optionsand remove the options that are obsolete…

https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive

spring整合redis

1.导入依赖 <!-- spring-data-redis 依赖--> <dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.7.18</version> </dependency> <dependency><…

Sketch for mac(专业矢量绘图设计软件100.3版) 中文激活版 一键快速安装!

Sketch 是一款专为 macOS 设计的专业矢量图形编辑软件&#xff0c;自发布以来便成为 UI/UX 设计师首选的工具之一。其简洁高效的用户界面、强大的设计功能&#xff0c;以及与 macOS 系统的深度集成&#xff0c;使得 Sketch 在设计领域享有很高的声誉。无论是移动应用设计、网页…

使用密钥文件 SSH 登录服务器:Windows、macOS使用终端或连接工具

文章目录 使用密钥文件 SSH 登录服务器1. Windows端方法 1&#xff1a;使用 ssh 命令指定密钥文件方法 2&#xff1a;使用 SSH 配置文件 2. macOS端方法 1&#xff1a;使用 ssh 命令指定密钥文件方法 2&#xff1a;使用 SSH 配置文件方法 3&#xff1a;使用 ssh-add 命令&#…

Unity实现运行时撤销(undo)功能浅谈

本文地址&#xff1a;https://blog.csdn.net/t163361/article/details/141352178 项目最近想要加入撤销功能。想要比较完美的实现撤销功能&#xff0c;需要两个基础 1.添加和删除使用命令模式 2.基础数据支持序列化 项目框架使用的QFramework&#xff0c;支持简单的命令模式。…

电脑如何录屏?高清录制教程来袭,快收藏!

在数字化时代&#xff0c;电脑录屏已经成为了我们学习和工作中的一项重要技能。如果你想知道电脑如何录屏&#xff0c;这里有几个简单的方法可以帮助你开始。 一、福昕网课录制大师 虫洞 https://www.foxitsoftware.cn/REC/ 这个软件因为又专业又好上手&#xff0c;挺受大家…

如何培养单元测试的习惯?怎样才算一个好的单元测试?

你是怎么编写单元测试的呢&#xff1f;很多人的做法是先把所有的功能代码都写完&#xff0c;然后&#xff0c;再针对写好的代码一点一点地补写测试。 在这种编写测试的做法中&#xff0c;单元测试扮演着非常不受人待见的角色。你的整个功能代码都写完了&#xff0c;再去写测试…