2013-12-08 2 views
3

개체의 크기를 얻고 싶습니다. 나는이 방법을 사용하려 :개체의 크기를 얻으십시오

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); 
    } 
} 

을하지만이 오류가 발생합니다 : ... 내가 JProfiler와 매트를 tryed 그러나

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) 

을하지만 난 살아이 개체를 찾을 수 아니에요

무엇을 할 수 있습니까?

+0

모두 premain 참조 할 수 있습니다 일식 당신이이

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>"); } } 

수 있습니다 명령 줄, 예 :'-javaagent : agent.jar', 당신은 이것을하고 있습니까? – alexgirao

+0

@alexgirao 아니, 바람둥이 랑 같이 일하기 때문에 할 수있어? –

+0

afaik, 자바 에이전트를 사용할 때 계측 개체를 얻습니다. 자바 에이전트가 jvm을 계측하는데 사용됩니다. 아마도이 개체의 크기를 가져 오는 방법이 아닙니다. – alexgirao

답변

3

객체 크기 사용하여 계측을 얻으려면, 여기 에이전트 코드 및 매니페스트

되면, JVM에 에이전트를로드하는 것이 필요하다

에이전트 MANIFEST.MF

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

Agent.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; 
    } 
} 

에이전트는 위의 에이전트가 자바에서 연결되어있는 경우라고 바람둥이 작업을하고 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

0

documentation을 참조하십시오. 발췌문 :

The manifest of the agent JAR file must contain the attribute Premain-Class . The value of this attribute is the name of the agent class. The agent class must implement a public static premain method similar in principle to the main application entry point.

Java 에이전트는 이미 실행중인 JVM에 컨트 리뷰 션 할 수 없습니다. premain 방법은 다시 명확하게 문서화는 main 방법 전에 라고 :

After the Java Virtual Machine (JVM) has initialized, each premain method will be called in the order the agents were specified, then the real application main method will be called.

+0

내 매니 페스트는 다음과 같습니다 : Manifest-Version : 1.0 클래스 경로 : Premain-Class : ObjectSizeFetcher하지만 작동하지 않습니다. 저는 tomcat을 사용하고 웹 응용 프로그램은 –

+0

입니다. 작동하지 않습니다. 에이전트 JAR은 이미 실행중인 응용 프로그램 컨테이너에 배포 된 웹 응용 프로그램이 아닌 기본 진입 점에만 사용할 수 있습니다. 또한 클래스를 기본 패키지에 배치하면 안됩니다. –

+0

hmmm, 그래서 질문은 어떻게 webapp의 객체의 크기를 얻을 수 있습니까? –

관련 문제