All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.mat.parser.model.ClassLoaderImpl Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2008 SAP AG.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.mat.parser.model;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.mat.SnapshotException;
import org.eclipse.mat.collect.ArrayInt;
import org.eclipse.mat.parser.internal.SnapshotImpl;
import org.eclipse.mat.snapshot.ISnapshot;
import org.eclipse.mat.snapshot.model.Field;
import org.eclipse.mat.snapshot.model.IClass;
import org.eclipse.mat.snapshot.model.IClassLoader;
import org.eclipse.mat.snapshot.registry.ClassSpecificNameResolverRegistry;
import org.eclipse.mat.util.IProgressListener;
import org.eclipse.mat.util.VoidProgressListener;

/**
 * @noextend
 */
public class ClassLoaderImpl extends InstanceImpl implements IClassLoader {
    private static final long serialVersionUID = 1L;

    public static final String NO_LABEL = "__none__";//$NON-NLS-1$

    private volatile transient List definedClasses = null;

    public ClassLoaderImpl(int objectId, long address, ClassImpl clazz, List fields) {
        super(objectId, address, clazz, fields);
    }

    @Override
    protected synchronized void readFully() {
        // check for the special case of the system class loader
        if (getObjectAddress() == 0) {
            setFields(new ArrayList());
        } else {
            super.readFully();
        }
    }

    @Override
    public String getClassSpecificName() {
        String label = source.getClassLoaderLabel(getObjectId());

        if (NO_LABEL.equals(label)) {
            label = ClassSpecificNameResolverRegistry.resolve(this);
            if (label != null)
                source.setClassLoaderLabel(getObjectId(), label);
        }

        return label;
    }

    @SuppressWarnings("null")
    public List getDefinedClasses() throws SnapshotException {
        List result = definedClasses;
        if (result == null) {
            synchronized (this) {
                if (result == null) {
                    definedClasses = result = doGetDefinedClasses(source, getObjectId());
                }
            }
        }
        return result;
    }

    public long getRetainedHeapSizeOfObjects(boolean calculateIfNotAvailable, boolean calculateMinRetainedSize,
                                             IProgressListener listener) throws SnapshotException {
        return doGetRetainedHeapSizeOfObjects(source, getObjectId(), calculateIfNotAvailable, calculateMinRetainedSize,
                listener);
    }

    public static final List doGetDefinedClasses(ISnapshot dump, int classLoaderId) throws SnapshotException {
        List answer = new ArrayList();
        for (IClass clasz : dump.getClasses()) {
            if (clasz.getClassLoaderId() == classLoaderId)
                answer.add(clasz);
        }
        return answer;
    }

    public static final long doGetRetainedHeapSizeOfObjects(ISnapshot dump, int classLoaderId,
                                                            boolean calculateIfNotAvailable, boolean calculateMinRetainedSize, IProgressListener listener)
            throws SnapshotException {
        long answer = ((SnapshotImpl) dump).getRetainedSizeCache().get(classLoaderId);

        if (answer > 0 || !calculateIfNotAvailable)
            return answer;

        if (answer < 0 && calculateMinRetainedSize)
            return answer;

        if (listener == null)
            listener = new VoidProgressListener();

        ArrayInt objectIds = new ArrayInt();
        objectIds.add(classLoaderId);
        for (IClass clasz : doGetDefinedClasses(dump, classLoaderId)) {
            objectIds.add(clasz.getObjectId());
            objectIds.addAll(clasz.getObjectIds());
        }

        int[] retainedSet;
        long retainedSize = 0;

        if (!calculateMinRetainedSize) {
            retainedSet = dump.getRetainedSet(objectIds.toArray(), listener);
            if (listener.isCanceled())
                return 0;
            retainedSize = dump.getHeapSize(retainedSet);
        } else {
            retainedSize = dump.getMinRetainedSize(objectIds.toArray(), listener);
            if (listener.isCanceled())
                return 0;
        }

        if (calculateMinRetainedSize)
            retainedSize = -retainedSize;

        ((SnapshotImpl) dump).getRetainedSizeCache().put(classLoaderId, retainedSize);
        return retainedSize;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy