接上篇,有興趣的朋友可以直接拿我的測試代碼自行測試,請自行修改諸如線程數,執行時間,序列化的數據量大小等參數。如果想嘗試做thread dump,可以打開相關的兩個注釋,會更方便一些,代碼中都有相應的注釋可供參考。
測試代碼如下:
package test;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
public class Test implements Runnable {
//Notice! set the three test parameter to what you want first
/**
* thread count to run test
*/
private static final int THREAD_COUNT = 50;
/**
* time in seconds to run test
*/
private static final long TEST_TIME_SECOND = 1 * 30;
/**
* during test, we serialize a Data instance with an ArrayList that contains DataItem instance.
* This is to set how many DataItem in the ArrayList.
*/
private static final long ITEMS_COUNT_IN_TEST_OBJECT = 1000;
private static int finishedCount = 0;
private static boolean needStop = false;
private static Object needStopLock = new Object();
private static Object finishedCountLock = new Object();
private static boolean isNeedStop() {
synchronized (needStopLock) {
return needStop;
}
}
private static void setNeedStop() {
synchronized (needStopLock) {
needStop = true;
}
}
private static void addFinisedCount() {
synchronized (finishedCountLock) {
finishedCount++;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// run it first to load all the class
new Test().test();
// to dump thread open these
// try {
// Thread.sleep(20 * 1000);
// System.out.println("main sleep. go to find pid, we need it later to send signal");
// Thread.sleep(2 * 1000);
// System.out.println("prepard to dump");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
long timeBegin = System.currentTimeMillis();
for (int i = 0; i < THREAD_COUNT; i++) {
Thread t = new Thread(new Test());
t.setName("testthread" + i);
t.start();
}
long timeEnd = timeBegin + TEST_TIME_SECOND * 1000;
while (System.currentTimeMillis() < timeEnd) {
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
setNeedStop();
System.out.println(THREAD_COUNT + " thread finished " + finishedCount
+ " times in " + TEST_TIME_SECOND + " seconds");
// to dump thread open these
// try {
// Thread.sleep(5 * 1000);
// //System.out.println("dump now");
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
}
public void run() {
while (!isNeedStop()) {
test();
addFinisedCount();
}
}
private void test() {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
Data data = new Data();
try {
// long time1 = System.currentTimeMillis();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(data);
bos.toByteArray();
// long time2 = System.currentTimeMillis();
// System.out.print((time2 - time1) + " ");
} catch (IOException e) {
e.printStackTrace();
}
}
private static class Data implements Serializable {
private static final long serialVersionUID = -376987039014824563L;
private static final ArrayList DEFAULT = new ArrayList();
static {
for (int i = 0; i < ITEMS_COUNT_IN_TEST_OBJECT; i++) {
DEFAULT.add(new DataItem(i));
// DEFAULT.add(DataItem.a + i);
}
}
private ArrayList content = DEFAULT;
}
private static class DataItem implements Serializable {
private static final long serialVersionUID = 1L;
private static final String a = "sdfsdfsdfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
private int number;
private String content;
public DataItem(int number) {
this.number = number;
this.content = a + number;
}
}
}
也可以從這裡直接下載到完整的eclipse項目,除上面的代碼外,還有thread dump文件和已經設置好的jprobe的配置文件。
(blogjava不能上傳文件,所以只好放fs2you)
http://www.fs2you.com/files/59a26119-5d1a-11dd-ad4f-0014221b798a/