获取程序中对象的大小:
有jar文件SizeOfObjetct.jar,内容如下:
SizeOfObject.java类
META-INF/MANIFEST.MF文件
SizeOfObject.java类
package com.masf;
import java.lang.instrument.Instrumentation;
/**
* 这是一个代理类
* @author
*
*/
public class SizeOfObject {
static Instrumentation inst;
//JVM负责调用该方法,并传递参数
public static void premain(String agentArgs, Instrumentation insta){
inst = insta;
}
public static void premain(String agentArgs){
}
}
META-INF/MANIFEST.MF文件内容
Premain-Class: com.masf.SizeOfObject
计算对象大小:
在启动jvm的时候需要为vm传递一个参数:-javaagent:C:\temp\SizeOfObject.jar,
这样在 JVM初始化后,每个 premain 方法将按照指定代理的顺序调用,首先调用public static void premain(String agentArgs, Instrumentation insta);如果该方法不存在则调用public static void premain(String agentArgs);
当我们获得Instrumentation 实例后,就可以调用它的getObjectSize()方法获取对象的大小。
package com.masf;
import java.lang.instrument.Instrumentation;
/**
* 计算对象大小
* @author
*
*/
public class JVM {
public static void main(String[] args){
Instrumentation inst = SizeOfObject.inst;
byte[] array = new byte[1024*1024];
System.out.println(inst.getObjectSize(array));
}
}
输出值:1048592
注意:不同的jvm实例输出的值可能不一样
分享到:
相关推荐
但是,Java API本身并不提供直接获取对象大小的方法。为了计算对象大小,我们需要借助一些第三方库或者自行实现。 一个常见的第三方库是`DeepSizeOf`,它来自Eclipse Collections框架,提供了类似于C++中的`sizeof`...
在Java中,对象的大小通常可以通过以下几种方式来计算: 1. **使用Java API**:Java 9及以上版本引入了一个名为`sun.misc.Unsafe`的API,虽然它不是公开的,但可以通过反射访问。`Unsafe`类提供了一个`...
对象头包含了对象的元数据,如对象实例的名字、唯一标识(对象ID)以及对象的状态信息,如是否可达(是否被垃圾收集器标记为可回收)。在Hotspot JVM中,非数组对象的对象头占用8字节,而数组对象则额外增加4字节来...
这里的`unsafe.objectFieldOffset`方法用于获取对象头的大小,`unsafe.objectSize`方法则用于获取实例数据的大小。注意,这些方法的使用需要JDK的非公开API,因此在生产环境中可能会受限。 此外,`...
当我们谈论“Java对象内存大小”时,我们通常指的是一个Java对象在内存中占据的空间,包括对象头、实例字段以及可能的对齐填充。这个知识点对于开发高效缓存系统尤其重要,因为缓存需要精确管理内存来最大化存储效率...
这个接口提供了诸如`getObjectSize()`方法,可以用来获取对象在内存中的大小,包括对象头、实例变量以及对其他对象的引用。 为了实现这个功能,我们需要编写一个`javaagent`,通常包含一个`premain`方法,该方法会...
- Java的`java.lang.instrument.Instrumentation`接口提供了获取对象大小的方法。通过代理类或者预加载器(如JDK动态代理或ByteBuddy),可以在运行时获取对象大小。 4. **Memory Profiler**:如YourKit、Eclipse ...
Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥,...
在Java中,由于垃圾回收机制的存在,直接获取对象的内存占用并不像C++等语言那样简单。通常,我们可以使用一些工具或API来帮助我们。例如,`sun.misc.Unsafe`类(虽然非标准,但广泛使用)提供了访问内存的能力,...
Font 类是 Java 中的一个类,用于设置程序中的字体实例对象。 Font 类有三个参数:face、style、size,分别指字体的外观、样式和大小。我们可以使用 Font 类的静态方法 getFont() 创建 Font 对象,例如:Font font =...
这个工具提供了查看对象实例大小的能力,这对于调试和性能优化非常有用。"java-sizeof-0.0.4"包含三个不同类型的JAR文件: 1. `java-sizeof-0.0.4-javadoc.jar`:这是Java文档的归档,包含了关于工具的API和方法的...
首先,我们需要了解Java中的`java.net.URL`类,它是处理URL的基础。这个类提供了打开到指定URL的连接的方法,以及获取有关URL的信息。在获取远程文件大小时,我们通常会发送一个HTTP HEAD请求,因为这种请求只需要...
本资源包“Java图像编程实例库”提供了一系列的示例代码,旨在帮助开发者理解和应用Java中的图像处理技术。以下将详细介绍其中可能涵盖的知识点。 1. **Java AWT 和 Swing**: 这两个是Java GUI的主要框架,提供了...
本示例展示了如何使用Sigar库来获取系统中各个进程的关键信息,包括PID、用户、启动时间、大小、所占内存、状态、运行时间、CPU使用率及命令等。这对于系统监控和故障排查具有重要意义。通过定时更新数据,可以实时...
这个详细教程将引导你通过源代码理解如何在Java中获取文件大小。下面,我们将深入探讨这一主题,分析相关知识点并提供实践示例。 首先,Java中的`java.io.File`类提供了许多与文件操作相关的功能,包括获取文件大小...
这个"Java实例 - 获取目录大小源代码-详细教程.zip"压缩包文件包含了一个具体的Java示例,旨在教会开发者如何计算一个目录及其所有子目录下的文件总大小。以下是对这个教程的详细解释: 首先,我们需要理解目录大小...
- 变量:Java中的变量用于存储数据,有基本类型(如int、float、boolean)和引用类型(如类、接口、数组)。 - 类型转换:在不同数据类型之间进行转换时,需要进行类型转换,包括自动类型提升和强制类型转换。 - ...
使用`ImageIO.read()`方法可以从文件或输入流中读取图像,将其转换为`BufferedImage`对象。例如: ```java File imageFile = new File("image.jpg"); BufferedImage image = ImageIO.read(imageFile); ``` 3. ...
首先,我们要理解Java中的线程是如何创建的。Java提供了两种主要的线程创建方式:继承Thread类和实现Runnable接口。继承Thread类可以直接重写run()方法,而实现Runnable接口则需要将run()方法定义在另一个类中,并...