jvm学习(一)初识与实践
发布日期:2021-04-30 21:01:02 浏览次数:137 分类:精选文章

本文共 2065 字,大约阅读时间需要 6 分钟。

学习JVM:从环境准备到内存分析的实践指南

作为一名开发人员,掌握JVM的理解和操作能力对于Java程序的性能优化和故障排查具有至关重要的意义。作为一本备受推崇的著作,《深入理解JVM》第三版(JDK 1.8版本)已发布,这本书无疑是每一个Java开发人员的必修课。

JVM与JDK的关系

JVM(Java Virtual Machine,Java虚拟机)是Java编程的核心,其主要职责是负责Java程序的执行。JDK(Java Development Kit,Java开发套件)则包含了JVM以及其他必要的开发工具。从官方文档可以看出:

  • JDK = JRE + 其他工具
  • JRE(Java Runtime Environment,Java运行环境)= JVM + Java SE API + 其他
  • 因此,JVM是JRE的一部分,而JRE又是JDK的核心组成部分。

环境准备

在开始学习JVM之前,需要先搭建一个合适的开发环境。以下是具体的配置步骤:

  • 安装JDK 1.8

    • 下载并安装JDK 1.8,注意选择合适的平台版本(Windows、Mac等)。
    • 配置环境变量,确保JVM能够正确识别和启动。
  • 安装IDE

    • 使用Eclipse作为开发环境,这是Java开发人员的常用选择。
    • 如果你更倾向于使用IDEA,可以选择IntelliJ IDEA。
  • 安装内存分析工具

    • **MAT(Memory Analyzer)**是Eclipse内建的强大内存分析工具。
    • 如果你使用IntelliJ IDEA,可以选择JProfiler或VisualVM作为替代工具。
  • 代码与实验

    为了深入理解JVM的内存管理机制,我们可以通过以下代码进行实验:

    类示例

    public class Demo1 {    private String name;    private int age;    private String grade;    public String getName() { return name; }    public void setName(String name) { this.name = name; }    public int getAge() { return age; }    public void setAge(int age) { this.age = age; }    public String getGrade() { return grade; }    public void setGrade(String grade) { this.grade = grade; }}

    主类(用于制造内存溢出)

    package com.kdeng.practise.jvm.day01;import java.util.ArrayList;import java.util.List;public class TestJvm01 {    public static void main(String[] args) {        List
    list = new ArrayList<>(); while (true) { list.add(new Demo1()); } }}

    内存分析

    运行上述代码会立即报内存溢出错误。为了更直观地理解问题,我们需要通过内存分析工具进行排查。

    参数设置

    在运行Eclipse时,右键点击项目选择“运行配置”,进入参数设置界面,添加以下参数:

    -Xms20m-Xmx20m

    这里的含义:

    • -Xms20m:初始化堆内存大小为20MB。
    • -Xmx20m:最大堆内存容量为20MB。

    运行代码后,Eclipse会生成一个内存快照文件(.hprof格式),用于后续分析。

    快照分析

  • 通过右键点击项目选择“属性”,进入资源管理界面,可以看到快照文件的位置。
  • 打开MAT工具,导入快照文件。
  • 在MAT中右键点击项目选择“分析”进入详情界面。
  • 内存占用分析

    快照文件中会显示占用内存的具体情况。红框部分表示内存泄漏的具体区域:

    • 浅层大小(Shallow size):表示对应对象所占用的内存,包括对象头和成员变量。
    • 保留大小(Retained size):表示从该对象能直接或间接访问到的对象的总和。
    • 百分比:占用堆内存的百分比。

    通过这些信息,可以清晰地看到哪些对象占用了过多的内存,进而找到内存泄漏的根源。

    初步总结

    通过以上实验,我们可以初步理解JVM的内存管理机制以及内存泄漏的常见原因。接下来,可以深入学习JVM的内存结构、垃圾回收算法以及性能调优技巧。

    如果你对具体的JVM参数配置和内存分析工具使用方法还不熟悉,可以参考以下资源进行深入学习:

    通过持续的实践和学习,你将逐渐掌握JVM的核心原理,并能够应对各种复杂的内存问题。

    上一篇:多线程-单例模式 - Double Check Lock - Volatile
    下一篇:Map接口

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2026年06月02日 17时32分48秒