2012年11月24日土曜日

Javaにおけるオブジェクトの使用メモリサイズの測り方

Javaでオブジェクト(インスタンス)の使用メモリサイズを測る方法のメモです。

1. ライブラリ「sizeOf」を利用する
http://sourceforge.net/projects/sizeof

使い方
上のリンクからSizeOf.jarをダウンロードし、BuildPathを通します。
(eclipseでBuildPathを通す場合は、プロジェクトを右クリックして、BuildPath -> Configure BuildPathをクリックすると、Java Build Pathのウィンドウが表示されるので、このウィンドウのLibrariesタブのAdd JARsボタンから追加できます。)

実行時にVMの引数に次の行を追加して実行します。
-javaagent:[SizeOf.jarのファイルパス]
私の場合は、プロジェクト/lib/SizeOf.jarに入れているので以下のようになります。
-javaagent:./lib/SizeOf.jar
(eclipseでVMの引数を設定する場合は、Run -> Run Configurationsを開き、ArgumentsタブのVM arguments項目に引数を入力します。)

以下に、サンプルのソースコードを載せておきます。
import net.sourceforge.sizeof.SizeOf;

public class SizeOfTester {
 public static void main(String[] args) {
     String str = "String";
     SizeOf.skipStaticField(true); // 初期化コード
     SizeOf.setMinSizeToLog(10); // 初期化コード
     long size = SizeOf.deepSizeOf(str); // オブジェクトのサイズを取得
     System.out.println(size);
    }
}

2. ライブラリ「Classmexer」を利用する
http://www.javamex.com/classmexer/

使い方
上のリンクから、classmexer.jarをダウンロードし、BuildPathを通します。
実行時にVMの引数に次の行を追加して実行します。
-javaagent:[classmexer.jarのファイルパス]

以下に、サンプルのソースコードを載せておきます。
import com.javamex.classmexer.MemoryUtil;

public class ClassmexerTester {
 
    public static void main(String[] args) {
     String str = "String";
     long size = MemoryUtil.deepMemoryUsageOf(str); // オブジェクトのサイズを取得
     System.out.println(size);
    }
}


2012年11月17日土曜日

JVMの使用メモリサイズの測り方

JavaにおけるJVMの使用メモリサイズの測り方のメモです。


基礎知識
まず、JVMは以下の様なメモリプールを持ちます。
+----------------------------------------------+
+////////////////           |
+----------------------------------------------+
 |--------|
 init
 |---------------|
 used
 |-----------------------|
 committed 
 |----------------------------------------------|
 max

ここで、
initは、JVMが起動時にOSに要求するメモリ容量
usedは、現在のメモリ使用量
committedは、使用出来る状態になっているメモリ空間の容量
maxは、JVMが利用できるメモリ容量の最大値
となります。

また、JVMでは、2種類のメモリ(ヒープとそれ以外)を管理しています。
ヒープメモリ:ヒープは実行時データ領域であり、ここからすべてのクラスインスタンスと配列のメモリーが割り当てられます。

ヒープ以外:実行定数プール、フィールド及びメソッドデータ、メソッド及びコンストラクタのコードなど、クラス単位の構造体が格納されます。


以下に、これらのメモリ情報を取得するコードを載せておきます。


ソースコード
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;

public class MemoryTester {
 // Java仮想マシンのメモリ管理システムにアクセスするためのオブジェクトを取得
 private static MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
 
 public static void main(String[] args) {
  MemoryTester tester = new MemoryTester();
  tester.testMemoryMXBean();
  tester.testRuntime();
 }
 
 private void testMemoryMXBean() {
  System.out.println("\ntestMemoryMXBean");
  
  // ヒープメモリの使用量の情報を持つオブジェクトを取得する
  MemoryUsage heap = mbean.getHeapMemoryUsage();
  System.out.println("heap init:" + heap.getInit());
  System.out.println("heap used:" + heap.getUsed());
  System.out.println("heap committed:" + heap.getCommitted());
  System.out.println("heap max:" + heap.getMax());
  System.out.println(heap);
  
  // ヒープ以外のメモリの使用量の情報を持つオブジェクトを取得する
  MemoryUsage nonHeap = mbean.getNonHeapMemoryUsage();
  System.out.println("nonHeap init:" + nonHeap.getInit());
  System.out.println("nonHeap used:" + nonHeap.getUsed());
  System.out.println("nonHeap committed:" + nonHeap.getCommitted());
  System.out.println("nonHeap max:" + nonHeap.getMax());
  System.out.println(nonHeap);
 }
 
 private void testRuntime() {
  System.out.println("\ntestRuntime");
  // Runtimeによるヒープメモリの取得
  Runtime runtime = Runtime.getRuntime();
  System.out.println("heap committed:" + runtime.totalMemory());
  System.out.println("heap used:" + (runtime.totalMemory() - runtime.freeMemory()));
  System.out.println("heap max:" + runtime.maxMemory());
 }
}

2012年11月10日土曜日

QTTabbarの設定

QTTabBarとは、Windowsエクスプローラにタブ機能やプレビュー機能を追加してくれるソフトです。

QTTabBar v1.5.0.0 Beta 2
http://sourceforge.net/projects/qttabbar/


以下、自分の行った設定です。

1. フォルダをクリックした時に現在のタブで開くようにする
オプションのウィンドウ項目で、「ウィンドウをキャプチャする」のチェックを外す。
しかし、これをやると新規でエクスプローラを立ち上げた時に、既存のエクスプローラにタブとして統合されなくなるけど、そこはしょうがないみたい。

2. 新規ウィンドウで前回のタブを復元する
オプションのウィンドウ項目で、「新規ウィンドウでタブを復元する」にチェックを入れる。

3. タブに閉じるボタンを配置する
オプションのタブ2項目で、「タブに閉じるボタンを表示する」にチェックを入れる。

4. Ctrl+Tabでタブを切り替える際のメニューを表示しないようにする
オプションのタブ2項目で、「Ctrl+Tabキーでタブスイッチャーを表示」のチェックを外す。

5. ウィンドウの閉じるボタンでウィンドウを閉じるようにする
オプションのタブとウィンドウ項目で、「ウィンドウの✕ボタンで」の設定をウィンドウを閉じるにする。

2012年11月3日土曜日

LYNX 3D SH-03C(02.00.01)の一時ルート化方法

注意!!
ご利用は、自己責任でお願いします。


私の愛用しているLinx3dを一時ルート化して、プリインストールアプリを無効にしてみたので、その方法をメモっときます。


使用端末
機種:LYNX 3D SH-03C
アンドロイドバージョン:2.2.2
ビルド番号:02.00.01


使用アプリ
SHBreakV2 (これで一時ルート化する)
ISTweak (これでアプリの無効をする)
Terminal Emulator(緊急事態用w)


1. 事前準備
事前に上記のアプリをインストールしてください。
TerminalEmulatorは、マーケットにあるけど、それ以外はないからググったりして探してください。
アプリをインストールしたらオフラインモード(ルート化中はずっと)にしてください。これをやらないと後でwifiが使えなくなる可能性があります。


2. 一時ルート化
SHBreakV2を起動して設定とかそのままで、Break!ボタンを押します。
すると、なんか色々なメッセージが出てくるので、OKボタンを押せばルート化は完了です。


3. プリインストールアプリを無効にする
ISTweekを起動してApplicationListを選択し、SelectDirecotoryで/system/appを選択します。
すると、アプリの一覧が出てくるので、無効にしたいアプリを選択してDisableボタンを押します。

すると、待機中になっていくらまっても完了がでてこない、、、

なんどかタッチしてると強制終了の画面が出てくるので、強制終了を押す。
するとなぜかアプリの無効化は成功している。なぞww

最後に、端末を再起動したら終わりです。
再起動するとルート権限はなくなります。

ちなみに、自分が無効化したアプリは以下のアプリです。
maiker site
mixi for sh
twitter for sh
promice mail


4. おまけ:以上の作業後にwifiが使えなくなった場合の対処法
SHBreakV2でルート化したあとに、ISTweekを使ってsuコマンドを有効にします。
次に、Terminal Emulatorを使って以下の2つのコマンドを順に実行すれば治ります。
$ su
#bash-4.2# rm -rf /data/misc/dhcp/*

解説
「su」 コマンドでsuper user権限(root)でコマンドを実行できるようにします。
「rm -rf /data/misc/dhcp/*」 コマンドで/data/misc/dhcpフォルダ内のすべてのファイルを削除しています( rm -rf は対象のディレクトリを強制的に削除するというUNIXコマンド)



以上です。
繰り返しになりますが、ご利用は自己責任でお願いします。

2012年11月1日木曜日

お手軽にSyntax Highlighter ( 2.1.364 )を導入する方法

以下のコードを</head>の直前に入れるだけで下準備は完了です。
<!-- Syntax Highlighter -->
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css' rel='stylesheet' type='text/css'/> 
<link href='http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCpp.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCSharp.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJScript.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPhp.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushRuby.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushVb.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js' type='text/javascript'/> 
<script src='http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPerl.js' type='text/javascript'/> 
<script language='javascript'> 
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = &#39;http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf&#39;;
SyntaxHighlighter.all();
</script>
コードの貼付け方
<pre class="brush: script-type">
script-typeにjsとかjavaと指定して、ここにソースコードをHTMLエスケープして貼り付ける
</pre>
例えば、Javaのソースコードを次のように貼り付けると、
<pre class="brush: java">
package test;
public class Test {
 /**
* @param args
*/
 public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World!");
 }
}
</pre>
以下のように表示されます。
package test;

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println("Hello World!");
 }
}