Java中的Sizeof(二)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

在做了所有这些预备之后,下面就是这种图形遍历的标准实现:

public static IObjectProfileNode profile (Object obj)

{

final IdentityHashMap visited = new IdentityHashMap ();

final ObjectProfileNode root = createProfileTree (obj, visited,

CLASS_METADATA_CACHE);

finishProfileTree (root);

return root;

}

private static ObjectProfileNode createProfileTree (Object obj,

IdentityHashMap visited,

Map metadataMap)

{

final ObjectProfileNode root = new ObjectProfileNode (null, obj, null);

final LinkedList queue = new LinkedList ();

queue.addFirst (root);

visited.put (obj, root);

final ClassAccessPrivilegedAction caAction =

new ClassAccessPrivilegedAction ();

final FieldAccessPrivilegedAction faAction =

new FieldAccessPrivilegedAction ();

while (! queue.isEmpty ())

{

final ObjectProfileNode node = (ObjectProfileNode) queue.removeFirst ();

obj = node.m_obj;

final Class objClass = obj.getClass ();

if (objClass.isArray ())

{

final int arrayLength = Array.getLength (obj);

final Class componentType = objClass.getComponentType ();

// Add shell pseudo-node:

final AbstractShellProfileNode shell =

new ArrayShellProfileNode (node, objClass, arrayLength);

shell.m_size = sizeofArrayShell (arrayLength, componentType);

node.m_shell = shell;

node.addFieldRef (shell);

if (! componentType.isPrimitive ())

{

// Traverse each array slot:

for (int i = 0; i < arrayLength; ++ i)

{

final Object ref = Array.get (obj, i);

if (ref != null)

{

ObjectProfileNode child =

(ObjectProfileNode) visited.get (ref);

if (child != null)

++ child.m_refcount;

else

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航