java - 获取对象的大小

标签 java jakarta-ee tomcat opencv

我想获取一个对象的大小。我尝试使用这种方法:

import java.lang.instrument.Instrumentation;

public class ObjectSizeFetcher {
    private static Instrumentation instrumentation;

    public static void premain(String args, Instrumentation inst) {
        instrumentation = inst;
    }

    public static long getObjectSize(Object o) {
        return instrumentation.getObjectSize(o);
    }
}

但是它抛出了这个错误:

java.lang.NullPointerException
    test.ObjectSizeFetcher.getObjectSize(ObjectSizeFetcher.java:13)
    servlet.testObj.doGet(cms.java:55)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)

但是我尝试了 jprofiler 和 MAT,但我无法找到这个活着的对象......

我能做什么?

最佳答案

要使用检测获取对象大小,需要将代理加载到 jvm 中,这里是代理代码和 list

代理-MANIFEST.MF

Premain-Class: mypackage.Agent
Agent-Class: mypackage.Agent
Can-Retransform-Classes: true

代理.java

/* Agent.java

javac -cp ".:$JAVA_HOME/lib/tools.jar" -d . Agent.java Test.java && \
jar cfm Agent.jar Agent-MANIFEST.MF mypackage/Agent.class

*/

package mypackage;

import java.lang.instrument.Instrumentation;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.security.ProtectionDomain;

public class Agent implements ClassFileTransformer {
    public static Instrumentation inst;

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

    public static void agentmain(String agentArgs, Instrumentation inst) {
        Agent.inst = inst;
    }

    public byte[] transform(ClassLoader loader, String className, Class redefiningClass, ProtectionDomain domain, byte[] bytes) throws IllegalClassFormatException {
        /* returning null means we don't want to change a thing
        */
        return null;
    }
}

上面的代理允许你这样做

GetObjectSizeTest.java

package mypackage;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public final class GetObjectSizeTest extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        response.setContentType("text/html");
        PrintWriter writer = response.getWriter();
        writer.println("<html>");
        writer.println("<body bgcolor=white>");
        writer.println("<p>The size of System.in is " + Agent.inst.getObjectSize(System.in) + "</p>");
        writer.println("</body>");
        writer.println("</html>");
    }
}

为了与 tomcat 和 eclipse 一起工作,您可以引用 Adding -javaagent to Tomcat 6 server, where do I put it and in what format?How to set JVM arguments in tomcat that work both in eclipse and using the startup.bat

关于java - 获取对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20451589/

相关文章:

tomcat - 导入 javax.servlet 失败

tomcat - 无法在 Java9 项目中处理文件 module-info.class 导致 ClassFormatException

tomcat - 已跳过 TLD .... 已定义在 Tomcat 7 中的 Grails 部署日志中弹出

java - Selenium Webdriver - Opera - 无法从渲染器接收消息

java - Glassfish v3 的表单例份验证异常

java - 小服务程序 3 : Async - cant PUSH partial response

java - Java EE 中的异步执行

java - Spring Data JPA 如何传递日期参数

java - 图着色可视化

java - Java中的&和&&有什么区别?