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

org.gridkit.jvmtool.heapdump.StringCollector Maven / Gradle / Ivy

/**
 * Copyright 2014 Alexey Ragozin
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.gridkit.jvmtool.heapdump;

import org.gridkit.jvmtool.heapdump.HeapHistogram.ClassRecord;
import org.netbeans.lib.profiler.heap.FieldValue;
import org.netbeans.lib.profiler.heap.Heap;
import org.netbeans.lib.profiler.heap.IllegalInstanceIDException;
import org.netbeans.lib.profiler.heap.Instance;
import org.netbeans.lib.profiler.heap.JavaClass;
import org.netbeans.lib.profiler.heap.ObjectFieldValue;

public class StringCollector {

    private RefSet strings = new RefSet();
    private RefSet arrays = new RefSet();
    private long count;
    private long totalSize;

    public StringCollector() {
    }

    public void collect(Heap heap) {
        collect(heap, null);
    }

    public void collect(Heap heap, InstanceCallback callback) {
        JavaClass string = heap.getJavaClassByName("java.lang.String");
        for(Instance i : heap.getAllInstances()) {
            if (i.getJavaClass() == string) {
                strings.set(i.getInstanceId(), true);
                for(FieldValue fv: i.getFieldValues()) {
                    if ("value".equals(fv.getField().getName())) {
                        arrays.set(((ObjectFieldValue)fv).getInstanceId(), true);
                    }
                }
                ++count;
                totalSize += i.getSize();
            }
            if (callback != null) {
                callback.feed(i);
            }
        }
        arrays.set(0, false); // skip null reference
        for(Long id: arrays.ones()) {
            try {
                Instance s = heap.getInstanceByID(id);
                if (s != null) {
			totalSize += s.getSize();
                }
                else {
			System.err.println("Missing instance #" + id);
                }
            }
            catch(IllegalInstanceIDException e) {
                // ignore
            }
        }
    }

    public long getInstanceCount() {
        return count;
    }

    public long getTotalSize() {
        return totalSize;
    }

    public RefSet getInstances() {
        return strings;
    }

    public ClassRecord asClassRecord() {
        ClassRecord cr = new ClassRecord(String.class.getName() + " (retained)");
        cr.instanceCount = count;
        cr.totalSize = totalSize;
        return cr;
    }

    public String toString() {
        return "strings: " + totalSize + " (" + count + ")";
    }

    public boolean containsInstance(Instance i) {
        return strings.get(i.getInstanceId()) || arrays.get(i.getInstanceId());
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy