/* * Created on Jan 15, 2013 * Created by Paul Gardner * * Copyright 2013 Azureus Software, Inc. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2 of the License only. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package org.gudy.azureus2.core3.util; public class AEJavaManagement { private static ThreadStuff thread_stuff; private static MemoryStuff memory_stuff; public static void initialise() { try{ thread_stuff = (ThreadStuff)Class.forName( "org.gudy.azureus2.core3.util.jman.AEThreadMonitor" ).newInstance(); }catch( ClassNotFoundException e ){ }catch( Throwable e ){ e.printStackTrace(); } try{ memory_stuff = (MemoryStuff)Class.forName( "org.gudy.azureus2.core3.util.jman.AEMemoryMonitor" ).newInstance(); }catch( ClassNotFoundException e ){ }catch( Throwable e ){ e.printStackTrace(); } } public static long getThreadCPUTime() { if ( thread_stuff == null ){ return( 0 ); } return( thread_stuff.getThreadCPUTime()); } public static void dumpThreads() { if ( thread_stuff == null ){ return; } thread_stuff.dumpThreads(); } public static long getMaxHeapMB() { if ( memory_stuff == null ){ return( 0 ); } return( memory_stuff.getMaxHeapMB()); } public static long getJVMLongOption( String[] options, String prefix ) { long value = -1; for ( String option: options ){ try{ if ( option.startsWith( prefix )){ String val = option.substring( prefix.length()); value = decodeJVMLong( val ); } }catch( Throwable e ){ Debug.out( "Failed to process option '" + option + "'", e ); } } return( value ); } public static String[] setJVMLongOption( String[] options, String prefix, long val ) { String new_option = prefix + encodeJVMLong( val ); for (int i=0;i<options.length;i++){ String option = options[i]; if ( option.startsWith( prefix )){ options[i] = new_option; new_option = null; } } if ( new_option != null ){ String[] new_options = new String[options.length+1]; System.arraycopy( options, 0, new_options, 0, options.length ); new_options[options.length] = new_option; options = new_options; } return( options ); } public static long decodeJVMLong( String val ) throws Exception { long mult = 1; char last_char = Character.toLowerCase( val.charAt( val.length()-1 )); if ( !Character.isDigit( last_char )){ val = val.substring( 0, val.length()-1 ); if ( last_char == 'k' ){ mult = 1024; }else if ( last_char == 'm' ){ mult = 1024*1024; }else if ( last_char == 'g' ){ mult = 1024*1024*1024; }else{ throw( new Exception( "Invalid size unit '" + last_char + "'" )); } } return( Long.parseLong( val ) * mult ); } public static String encodeJVMLong( long val ) { if ( val < 1024 ){ return( String.valueOf( val )); } val = val/1024; if ( val < 1024 ){ return( String.valueOf( val ) + "k" ); } val = val/1024; if ( val < 1024 ){ return( String.valueOf( val ) + "m" ); } val = val/1024; return( String.valueOf( val ) + "g" ); } public interface ThreadStuff { public long getThreadCPUTime(); public void dumpThreads(); } public interface MemoryStuff { public long getMaxHeapMB(); } }