| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You 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.apache.ivy.util; |
| |
| /** |
| * Memory related utilities. |
| */ |
| public final class MemoryUtil { |
| private static final int SAMPLING_SIZE = 100; |
| |
| private static final int SLEEP_TIME = 100; |
| |
| private MemoryUtil() { |
| } |
| |
| /** |
| * Returns the approximate size of a default instance of the given class. |
| * |
| * @param clazz |
| * the class to evaluate. |
| * @return the estimated size of instance, in bytes. |
| */ |
| public static long sizeOf(Class clazz) { |
| long size = 0; |
| Object[] objects = new Object[SAMPLING_SIZE]; |
| try { |
| clazz.newInstance(); |
| long startingMemoryUse = getUsedMemory(); |
| for (int i = 0; i < objects.length; i++) { |
| objects[i] = clazz.newInstance(); |
| } |
| long endingMemoryUse = getUsedMemory(); |
| float approxSize = (endingMemoryUse - startingMemoryUse) / (float) objects.length; |
| size = Math.round(approxSize); |
| } catch (Exception e) { |
| Message.warn("Couldn't instantiate " + clazz, e); |
| } |
| return size; |
| } |
| |
| /** |
| * Returns the currently used memory, after calling garbage collector and waiting enough to get |
| * maximal chance it is actually called. But since {@link Runtime#gc()} is only advisory, |
| * results returned by this method should be treated as rough approximation only. |
| * |
| * @return the currently used memory, in bytes. |
| */ |
| public static long getUsedMemory() { |
| gc(); |
| long totalMemory = Runtime.getRuntime().totalMemory(); |
| gc(); |
| long freeMemory = Runtime.getRuntime().freeMemory(); |
| long usedMemory = totalMemory - freeMemory; |
| return usedMemory; |
| } |
| |
| private static void gc() { |
| try { |
| System.gc(); |
| Thread.sleep(SLEEP_TIME); |
| System.runFinalization(); |
| Thread.sleep(SLEEP_TIME); |
| System.gc(); |
| Thread.sleep(SLEEP_TIME); |
| System.runFinalization(); |
| Thread.sleep(SLEEP_TIME); |
| } catch (Exception e) { |
| Message.debug(e); |
| } |
| } |
| |
| public static void main(String[] args) throws ClassNotFoundException { |
| System.out.println(sizeOf(Class.forName(args[0]))); |
| } |
| } |