深入理解Java虚拟机(一) 基础

JDK、JRE和JVM

JDK包含JRE、JRE包含JVM

java8
在这里插入图片描述

  • JDK(Java Development Kit):Java开发工具集;
  • JRE( Java Runtime Environment ):Java运行时环境;
  • JVM( Java Virture Machine):Java虚拟机

内存溢出解决方法

解决内存溢出

  1. 模拟内存溢出
package demo1;

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

public class JvmTest {

	public static void main(String[] args) {
		List<Demo> list=new ArrayList<>();
		while(true) {
			list.add(new Demo());
		}
	}
}

在这里插入图片描述

堆内存溢出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
  1. 定位错误代码

生成堆内存快照,并指定堆内存大小为20M,配置参数;

-Xms20m -Xmx20m ##设置堆大小20m,并将最小和最大值设置相等,避免扩展
-XX:+HeapDumpOnOutOfMemoryError ##dump出当前的内存堆转储快照

右键=>Run As =>Run configurations
在这里插入图片描述

生成的快照文件
在这里插入图片描述

对快照文件进行分析,下载分析工具Eclipse 中的 Memory Analysis
help=>Eclipse MarketPlace搜索memory analysis进行安装

安装之后打开快照文件
在这里插入图片描述

查看运行数据,Shallow Heap对象本身所占用的内存大小,不包含引用,Retained Heap当前对象大小加上直接或间接引用大小之和。
在这里插入图片描述
查看被创建的类为Demo,找出问题;
在这里插入图片描述

可视化监控工具

在JDK中的bin目录中由一个命令jconsole.exe,再命令窗口中执行该命令会打开一个监控工具,可以查看当前堆内存使用情况、线程等其他信息。

在这里插入图片描述
内存池

  • Eden
  • Survivor(两块)

Eden中存储新创建的对象,如果被标记为垃圾回收对象则会被回收,如果存活下来则放入Survivor中。如果多次存活则放入持久带中。

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/86633231
今日推荐