Package org.jboss.profiler.memoryprofiler.engine

Source Code of org.jboss.profiler.memoryprofiler.engine.MemorySnapshotEngine

/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.profiler.memoryprofiler.engine;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;

import org.jboss.profiler.filecollection.BulkAdd;
import org.jboss.profiler.filecollection.FileCollection;
import org.jboss.profiler.filecollection.QuickSorter;
import org.jboss.profiler.memoryprofiler.model.MemoryClass;
import org.jboss.profiler.memoryprofiler.model.MemoryObject;
import org.jboss.profiler.memoryprofiler.model.MemoryReference;
import org.jboss.profiler.util.SPYConvertUtil;

/**
* @author Clebert Suconic
*/
public class MemorySnapshotEngine {
    FileCollection references;
    FileCollection invertedReferences;
    FileCollection objects;

    File classesFile;
    File objectsFile;
    File referencesFile;
    File directory;


    QuickSorter objectsSorter = new QuickSorter(new MemoryObject.MemoryObjectComparator());
    QuickSorter sorter = new QuickSorter(new MemoryReference.MemoryReferenceComparator(false));
    QuickSorter invertedSorter = new QuickSorter(new MemoryReference.MemoryReferenceComparator(true));

    HashMap classes = new HashMap();
    MemoryClass classKey = new MemoryClass();

    /** Import the files to a HSQL database*/
    public void processFiles (String basicFileName, String suffix) throws Exception
    {
        classesFile = new File(basicFileName + "_classes"+ "." + suffix);
        objectsFile = new File(basicFileName + "_objects" + "." + suffix);
        referencesFile = new File(basicFileName + "_references" + "." + suffix);
        directory = classesFile.getParentFile();

        File referencesData = new File(basicFileName + "_references_1.data");
        File invertedReferencesData = new File(basicFileName + "_references_2.data");
        File objectsDataFile = new File(basicFileName + "_objects.data");

        //File referencesIndex = File.createTempFile("references_1_",".indx",classesFile.getParentFile());
        references = new FileCollection(referencesData,null,MemoryReference.class,false,17);
        invertedReferences = new FileCollection(invertedReferencesData,null,MemoryReference.class,false,17);
        objects = new FileCollection(objectsDataFile,null,MemoryObject.class,false,24);

        treatClasses(classesFile);

        if (references.size()==0)
        {
            treatReferences(referencesFile);
        } else
        {
            System.out.println("Already processed, reusing file");
        }

        if (objects.size()==0)
        {
            treatDefObjects(objectsFile);
        } else
        {
            System.out.println("Already processed, reusing file");
        }

        countObjects();
    }

    private void treatReferences(File referencesFile) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(referencesFile)));

        // ignore the first line - description about the file itself
        reader.readLine();

        int line = 0;
        String strMessage = null;
        BulkAdd bulkAdd = this.references.createBulkAdd();
        MemoryReference referenceTmp = new MemoryReference();
        while ((strMessage = reader.readLine()) != null) {
            if ((line++) % 50000 == 0) {
                System.out.println("Read " + line + " references, maxMemory= " + Runtime.getRuntime().maxMemory() + ", freeMemory=" + Runtime.getRuntime().freeMemory() + " current=" + Runtime.getRuntime().totalMemory());
            }
            String split[] = strMessage.split(",");

            long referencer = 0;
            long referenced = 0;
            boolean isThread = false;

            if (split[0].startsWith("Thread")) {
                referencer = Long.parseLong(split[0].substring(6));
                //System.out.println(split[0] + " was converted into " + referencer);
                isThread = true;
            } else {
                referencer = Long.parseLong(split[0]);
            }

            referenced = Long.parseLong(split[1]);

            referenceTmp.setReferee(referencer);
            referenceTmp.setReferred(referenced);
            referenceTmp.setThreadReference(isThread);
            bulkAdd.add(referenceTmp);
        }

        bulkAdd.close();

        /*for (int i=0;i<5000;i++)
        {
            MemoryReference ref =(MemoryReference) this.references.get(i);
            System.out.println("ref = " + ref);
        }*/

        Iterator iter = references.iterator();
        int count=0;
        while (iter.hasNext())
        {
            MemoryReference ref = (MemoryReference)iter.next();
            invertedReferences.add(ref);
        }

        System.out.println("Sorting... " + new Date());
        sorter.sort(references);
        System.out.println(".... done  " + new Date());

        invertedSorter.sort(invertedReferences);


    }

    private void treatClasses(File classesFile) throws Exception {


        BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(classesFile)));

        // ignore the first line - description about the file itself
        reader.readLine();

        String strMessage = null;
        int line=0;
        while ((strMessage = reader.readLine()) != null) {
            if ((line++) % 1000 == 0) {
                System.out.println("Read " + line + " classes, maxMemory= " + Runtime.getRuntime().maxMemory() + ", freeMemory=" + Runtime.getRuntime().freeMemory() + " current=" + Runtime.getRuntime().totalMemory());
            }
            String split[] = strMessage.split(",");
            long classId = Long.parseLong(split[0].trim());
            long classLoader = Long.parseLong(split[2]);
            String signatureClass = SPYConvertUtil.convertParameterList(split[1]);

            MemoryClass clazz = new MemoryClass(classId,signatureClass,classLoader);
            clazz.setClassId(classId);
            classes.put(clazz,clazz);
        }
    }


    private void treatDefObjects(File objectsFile) throws Exception {

        BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(objectsFile)));

        reader.readLine(); // ignore first line

        int line = 0;
        String strMessage = null;
        BulkAdd bulk = objects.createBulkAdd();
        while ((strMessage = reader.readLine()) != null) {
            if ((line++) % 10000 == 0) {
                System.out.println("Read " + line + " objects, maxMemory= " + Runtime.getRuntime().maxMemory() + ", freeMemory=" + Runtime.getRuntime().freeMemory() + " current=" + Runtime.getRuntime().totalMemory());
            }
            String split[] = strMessage.split(",");
            long objectId = Long.parseLong(split[0].trim());
            long classId = Long.parseLong(split[1].trim());
            long size = Long.parseLong(split[2].trim());

            MemoryObject obj = new MemoryObject(objectId,size,classId);
            bulk.add(obj);

        }
        bulk.close();

        objectsSorter.sort(objects);
    }

    private void countObjects()
    {
        Iterator iter = objects.iterator();
        while (iter.hasNext())
        {
            MemoryObject obj = (MemoryObject)iter.next();

            MemoryClass classFound = findClass(obj.getClassId());
            if (classFound==null)
            {
                System.out.println("Couldn't find classId=" + obj.getClassId());
            }
            else
            {
                classFound.addSize(obj.getSize());
            }
        }
    }

    MemoryClass findClass(long classId)
    {
        classKey.setId(classId);
        MemoryClass classFound = (MemoryClass)classes.get(classKey);
        return classFound;
    }
}
TOP

Related Classes of org.jboss.profiler.memoryprofiler.engine.MemorySnapshotEngine

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.