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

本文详细解析了JDK、JRE和JVM的关系,介绍了Java内存溢出的原因及解决方法,通过实例演示如何定位和解决堆内存溢出问题,同时提供了使用Eclipse Memory Analysis工具分析堆内存快照的方法,以及如何利用JDK自带的jconsole工具进行实时内存监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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中。如果多次存活则放入持久带中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值