/*
* 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;
}
}