您的位置:首页 > 运维架构

jvm JConsole工具监控内存和线程演示

2017-03-01 18:49 477 查看
jvm JConsole工具监控内存和线程演示

package stu.org.test1;

import java.util.ArrayList;
import java.util.List;

/**
* jconsole内存临临控演示
* <p>
* VM 运行参数: -Xms100m -Xmx100m -XX:+UseSerialGC
* <p>
* -XX:+PrintGCDetails
*
* @author ruiliang
*
*/
public class JConsoleTest {

static class OOMObject {
// 以64KM/50的速度往java堆里写数据,一共填充1000次
public byte[] M_64Array = new byte[64 * 1024];
}

public static void heapAddtest(int for_i) throws InterruptedException {
List<OOMObject> list = new ArrayList<>();
for (int i = 0; i <= for_i; i++) {
// 停顿下,看的更明显
Thread.sleep(50);
list.add(new OOMObject());// 64*1001/1024=62.5M
}
System.gc();
}

/**
* GC之后结果是:Ende区最后基本没有暂用内存了,survivor也不会暂用内存,而年老代暂用快70MB内存
*/
public static void main(String[] args) throws InterruptedException {
Thread.sleep(30000);// 30秒,有空余时间来启动,jconsole,并链接这个java进程
System.out.println("start------");
heapAddtest(1000);
System.out.println("end------");
Thread.sleep(10000000);// 一直停顿,方便查看数据

}
/**
* Ende最大=27328,因此 整个新生代空间约为:27328*125%(8:1)=3416KB(33.35MB)
* <p>
* System.gc()之后,List还在引用,是活着的,无法回收,因些转移至年老代内存中
*/
}










线程演示:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

package stu.org.test1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* 线程死循环和wait演示
*
* @author ruiliang
*
*/
public class JConsoleThreadWhileTest {
/**
* 线程一直跑while
*/
public static void createBusyThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 状态: RUNNABLE 会在空循环上用尽全部执行时间直到线程切换,这种等待会消耗较多的CPU资源
while (true) {// 22行

}
}
}, "testBusyThread");
thread.start();
}

/**
* 锁等待测试
*
* @param lock
*/
public static void createLockThread(final Object lock) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
// 线程等待着lock对象的notify或notifyAll方法的出现,线程这时间处于waiting状态,在被唤醒前不会被分配执行时间。
// 处理活锁状态,只要lock对象的notify或notifyAll方法出现,这个线程便能激活断续执行,
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "testLockThread");
thread.start();
}

public static void main(String[] args) throws IOException, InterruptedException {
// 控制台输入
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread();// 线程一直跑while
br.readLine();
Object obj = new Object();
createLockThread(obj);// 锁等待测试
Thread.sleep(10000000);
}
}








死锁演示:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

package stu.org.test1;

/**
* jconsole 线程监控测试,死锁测试
*
* @author ruiliang
*
*/
public class JConsoleThreadTest {

static class synRun implements Runnable {
int a;
int b;

public synRun(int a, int b) {
this.a = a;
this.b = b;
}

@Override
public void run() {
// Integer.valueOf(a) 会换存-128~127的数字,实际就返回了2和3两个对象
synchronized (Integer.valueOf(a)) {
// 假如在两个synchronized之间发生了线程切换,那就会出现线程a等待线程b的(Integer.valueOf(b))对象,
// 而线程b又等待线程a的(Integer.valueOf(a))的对象,结果都跑不下去了,线程卡住,都等不了对方释放锁了
synchronized (Integer.valueOf(b)) {
System.out.println(a + " + " + b + "=" + (a + b));
}
}
}
}

public static void main(String[] args) throws InterruptedException {
Thread.sleep(30000);// 30秒,有空余时间来启动,jconsole,并链接这个java进程
System.out.println("start------");
// 200个线程
for (int i = 0; i < 100; i++) {
new Thread(new synRun(2, 3)).start();
new Thread(new synRun(3, 2)).start();
}
System.out.println("end------");
Thread.sleep(10000000);// 一直停顿,方便查看数据

}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jvm JConsole 内存 线程