jvm学习 (二) jvm可视化工具

认识工具
jconsole位于jdk bin目录下: 如图
jvm学习 (二) jvm可视化工具_第1张图片1.控制台可以直接输入启动:
jvm学习 (二) jvm可视化工具_第2张图片回车键
jvm学习 (二) jvm可视化工具_第3张图片
jvm学习 (二) jvm可视化工具_第4张图片该应用的实际jar包位于 jdk/lib/tools.jar
2.点击本地连接,选择jconsole,进入

jvm学习 (二) jvm可视化工具_第5张图片简要补充: jvm一般分为5大内存区,对象在堆上产生。
堆内存分为 ; eden survior01 survior02
最开始对象从eden产生,所以这里演示eden区域内存变化。
3.代码:

package com.kdeng.practise.jvm.day02;

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

public class JConsoleTest {

	public static void main(String[] args) {
		
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("start");
		generateObject(1000);
		
	}
	
	public static void generateObject(int n) {
		List<JConsoleTest> jlist = new ArrayList<>();
		for(int i=0; i<n; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			jlist.add(new JConsoleTest());
		}
	}

}

由于代码启动非常快,所以需要让运行改代码的线程停一会,睡一些时间。
4.关掉监控,界面,回到空白主页面
jvm学习 (二) jvm可视化工具_第6张图片5.运行代码,并新建连接
jvm学习 (二) jvm可视化工具_第7张图片

点击堆内存
jvm学习 (二) jvm可视化工具_第8张图片jvm学习 (二) jvm可视化工具_第9张图片图中个水平代表是线程sleep(100)的时间。创建对象会占用堆内存,所以是上升曲线。
切换到监控eden区
jvm学习 (二) jvm可视化工具_第10张图片效果也比较明显。
6.停止运行,代码变更

package com.kdeng.practise.jvm.day02;

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

public class JConsoleTest {
                    //   128*1024byte=128*1kb=128kb
	public byte[] b1 = new byte[128*1024];
	
	public static void main(String[] args) {
		
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("start");
		generateObject(1000);
		
	}
	
	public static void generateObject(int n) {
		List<JConsoleTest> jlist = new ArrayList<>();
		for(int i=0; i<n; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			jlist.add(new JConsoleTest());
		}
	}

}

让每一个对象多占用128kb内存,添加如上代码。
运行并接入jconsole
jvm学习 (二) jvm可视化工具_第11张图片eden区上升代表新对象产生,下降代表该eden区执行垃圾回收。切换到survior发现会上升,是因为eden区在产生对象被回收时,未达到回收条件的对象被移置(实际上是复制)到survior区。

7.将代码再次变更,将类成员变量,改为方法中的局部变量

package com.kdeng.practise.jvm.day02;

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

public class JConsoleTest {
                    //   128*1024byte=128*1kb=128k
	//public byte[] b1 = new byte[128*1024];
	
	public JConsoleTest() {
	     byte[] b1 = new byte[128*1024];
	}
	
	
	public static void main(String[] args) {
		
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("start");
		generateObject(1000);
		
	}
	
	public static void generateObject(int n) {
		List<JConsoleTest> jlist = new ArrayList<>();
		for(int i=0; i<n; i++) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			jlist.add(new JConsoleTest());
		}
	}

}

jvm学习 (二) jvm可视化工具_第12张图片对比之前的图,堆内存使用情况,发现是波浪形的有升有降。
原图如下,是一致上升的:
jvm学习 (二) jvm可视化工具_第13张图片所以很容以理解,方法中的局部变量未被使用,达到回收条件时会被抹去,回收其占用的内存,所以堆内存下降,但是又有新的对象产生时,又会有上升。

你可能感兴趣的:(Jvm学习)