Java

Javaに関するオープンソース

★JVMのチューニング

-Xms 初期Heap Space デフォルト:マシンの物理メモリの1/64か、2Mバイトの大きい方

-Xmx 最大Heap Space デフォルト:マシンの物理メモリの1/4か、1Gバイトの小さい方

1.StackメモリとHeapメモリ 例: java -Xmx1536m -Xms1024m 意味:Heapメモリは最大1.5G、最小1G

2.Heapメモリの各Space 例:java -XX:NewSize=32m -XX:MaxNewSize=640m -XX:MaxPermSize=1280m -XX:NewRatio=5

意味:Young Generation Spaceは最小32M、最大640M、Tenure Generation Spaceは最大1280M、Young Generation Space:Tenure Generation Space=1:5

3.GCのアルゴリズム 例:java -XX:+UseParallelGC -XX:ParallelGCThreads=20 意味:並列GCに設定、並列20スレッドを利用

4.JVM製品の変更 主な製品:Java HotSpot VM, Oracle JRockit JVM, IBM JVM

※-XXの引数はOracleから推薦されないため、要注意

★jar、war、earファイルの構成(サンプル)

jarファイル

sample.jar

├── META-INF

│ ├── MANIFEST.MF

│ ├── beans.xml

│ ├── persistence.xml

│ └── sql

│ ├── entity.xml

│ ├── jpql.xml

│ └── sql.xml

└── package

└── *.class

warファイル

sample.war

├── *.html

├── *.jsp

├── *.xhtml

├── META-INF

│ ├── MANIFEST.MF

│ ├── jboos-ejb-client.xml

│ ├── jboss-deployment-structure.xml

│ └── services

│ └── javax.enterprise.inject.spi.Extension

├── WEB-INF

│ ├── beans.xml

│ ├── classes

│ │ ├── META-INF

│ │ ├── messages_en.properties

│ │ ├── messages_ja.properties

│ │ └── package

│ │ └── *.class

│ ├── faces-config.xml

│ ├── jboss-web.xml / glassfish-web.xml

│ ├── lib

│ │ └── *.jar

│ └── web.xml

└── resources

├── fragment

│ └── *.xhtml

├── image

├── script

│ └── *.js

├── style

│ └── *.css

└── template

└── common.xhtml

earファイル

sample.ear

├── *.jar

├── *.war

├── META-INF

│ ├── MANIFEST.MF

│ ├── application.xml

│ └── jboss-deployment-structure.xml

└── lib

└── *.jar

★メモリ調査

(Runtime.getRuntime().maxMemory() / (1024 * 1024)) + "MB" // -Xmx

(Runtime.getRuntime().totalMemory() / (1024 * 1024)) + "MB" // -Xms

(Runtime.getRuntime().freeMemory() / (1024 * 1024)) + "MB

★コマンド実行

Runtime.getRuntime().exec("notepad"); // エディタを開く

Runtime.getRuntime().exec("cmd /c start Winword"); // Office Wordを開く

★jarコマンド

jar xvf pack.jar 解凍

jar cvf pack.jar pack 圧縮

jar tf pack.jar 閲覧

★JVMのHeap Space構成

Young領域 Newオブジェクトを保存

Eden領域

From領域

To領域

Old領域 Oldオブジェクトを保存

Perm領域 Meta情報

Heap Space調査

・JConsoleツールのVM Summary画面

・Runtime.maxMemory (), Runtime.totalMemory (), Runtime.freeMemory ()

★java.lang.OutOfMemoryError対策

1.C:/apache-tomcat-6.0.18/bin/catalina.batの最初:set JAVA_OPTS=-Xms200m -Xmx512mを記入

※startup.batからTomcatを起動する場合

2.Eclipseのオプション設定

・ウィンドウ⇒設定⇒Tomcat⇒JVM設定⇒JVMパラメーター追加:-Xms200m -Xmx512mを記入

java.lang.OutOfMemoryError: Java heap space

-Xms<size> Set initial Java heap size

-Xmx<size> Set maximum Java heap size

java -Xms512m -Xmx1024m JavaApp

java.lang.OutOfMemoryError: PermGen space

-XX:PermSize<size> Set initial PermGen Size

-XX:MaxPermSize<size> Set maximum PermGen Size

java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

※他サイトを参照

★インストール(Ubuntuの場合)

sudo apt-add-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java7-installer

java -version

JDKの優先使用順

sudo update-java-alternatives -l

sudo update-java-alternatives -s java-7-oracle

パス設定

echo 'JAVA_HOME="/usr/lib/jvm/java-7-oracle"' | sudo tee -a /etc/environment

あるいは sudo vi /etc/environment

source /etc/environment

echo $JAVA_HOME

パス設定 (Macの場合)

export JAVA_HOME=`/usr/libexec/java_home -v 1.8`

★システムプロパティ

System.setProperty("xxx", "123");

Properties properties = System.getProperties();

Enumeration<Object> e = properties.keys();

while (e.hasMoreElements()) {

String key = (String) e.nextElement();

System.out.println(key + " = " + properties.getProperty(key));

}

★システム環境設定

Map<String, String> env = System.getenv();

for (Iterator<String> iterator = env.keySet().iterator(); iterator.hasNext();){

String key = iterator.next();

System.out.println(key + " = " + env.get(key));

}

System.out.println(System.getenv("CLASSPATH"));

★jControlでリモート接続

service:jmx:remoting-jmx://<ip>:<port>

※default port: 4447

jBossでの設定

<subsystem xmlns="urn:jboss:domain:jmx:1.2">

<expose-resolved-model/>

<expose-expression-model/>

<remoting-connector use-management-endpoint="false"/>

</subsystem>

★Memory Leakについて

1.Static Field Holding Onto the Object Reference

2.Calling String.intern() on Long String

対策:java8以上(PermGen->Metaspace)、XX:MaxPermSize=<size>拡大

3.Unclosed Streams or Connections

対策:try-with-resource

4.Adding Objects With no hashCode() and equals() Into a HashSet

5.Fields in Singleton pattern

対策:use WeakReference

private WeakReference<Context> mWeakReference;

public Sample(Context context){

this.mWeakReference = new WeakReference<>(context);

}

public Context getContext() {

if(mWeakReference.get() != null){

return mWeakReference.get();

}

return null;

}

6.Change InnerClass to static InnerClass

7.Clear objects in Collection

private List<Info> data;

public void onDestory() {

if (data != null) {

data.clear();

data = null;

}

}