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

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);// 一直停顿,方便查看数据

	}

}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值