深入理解 JVM 的内存区域

深入理解 JVM 的内存区域

-深入理解运行时数据区
代码示例:

package ex2;

/**
 * VM参数
 * -Xms30m (堆空间初始大小) -Xmx30m(堆空间最大大小)  -XX:MaxMetaspaceSize=30m (元空间最大大小)  (指定垃圾回收器:-XX:+UseConcMarkSweepGC -XX:-UseCompressedOops) 
 *
 *
 */
public class JVMObject {
    public final static String MAN_TYPE = "man"; // 常量
    public static String WOMAN_TYPE = "woman";  // 静态变量
    public static void  main(String[] args)throws Exception {
        Teacher T1 = new Teacher();
        T1.setName("Mark");
        T1.setSexType(MAN_TYPE);
        T1.setAge(36);
        for(int i =0 ;i<15 ;i++){
            System.gc();//主动触发GC 垃圾回收 15次--- T1存活
        }
        Teacher T2 = new Teacher();
        T2.setName("King");
        T2.setSexType(MAN_TYPE);
        T2.setAge(18);
        Thread.sleep(Integer.MAX_VALUE);//线程休眠
    }
}

class Teacher{
    String name;
    String sexType;
    int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public String getSexType() {
        return sexType;
    }
    public void setSexType(String sexType) {
        this.sexType = sexType;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

初始化如下图
在这里插入图片描述

  1. JVM 向操作系统申请内存: JVM 第一步就是通过配置参数或者默认配置参数向操作系统申请内存空间,根据内存大小找到具体的内存分配表,然后把内存段的起始地址和终止地 址分配给JVM,接下来 JVM 就进行内部分配。
  2. JVM 获得内存空间后,会根据配置参数分配堆、栈以及方法区的内存大小-Xms30m-Xmx30m -Xss1m-XX:MaxMetaspaceSize=30m
  3. 类加载(类加载的细节后续章节会讲): 这里主要是把 class 放入方法区、还有 class 中的静态变量和常量也要放入方法区
  4. 执行方法及创建对象: 启动 main 线程,执行 main 方法,开始执行第一行代码。此时堆内存中会创建一个 student 对象,对象引用 student 就存放在栈中。 后续代码中遇到 new 关键字,会再创建一个 student 对象,对象引用 student 就存放在栈中。

执行中如下图

在这里插入图片描述

总结一下 JVM 运行内存的整体流程
JVM 在操作系统上启动,申请内存,先进行运行时数据区的初始化,然后把类加载到方法区,最后执行方法。 方法的执行和退出过程在内存上的体现上就是虚拟机栈中栈帧的入栈和出栈。 同时在方法的执行过程中创建的对象一般情况下都是放在堆中,最后堆中的对象也是需要进行垃圾回收清理的

-从底层深入理解运行时数据区

堆空间分代划分 堆被划分为新生代和老年代(Tenured) ,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 FromSurvivor 和 ToSurvivor 组成。 (先需要有概念,后续对象分配和垃圾回收会细讲这块)

在这里插入图片描述
-GC 概念

GC-GarbageCollection 垃圾回收,在 JVM 中是自动化的垃圾回收机制,我们一般不用去关注,在 JVM 中 GC 的重要区域是堆空间。 我们也可以通过一些额外方式主动发起它,比如 System.gc(),主动发起。(项目中切记不要使用)

-JHSDB 工具

JHSDB 是一款基于服务性代理实现的进程外调试工具。服务性代理是 HotSpot 虚拟机中一组用于映射 Java
虚拟机运行信息的,主要基于 Java 语言实现的 API 集合。

JDK1.8 的开启方式

开启 HSDB 工具 Jdk1.8 启动 JHSDB 的时候必须将 sawindbg.dll(一般会在 JDK 的目录下)复制到对应目录的 jre 下(注意在 win 上安装了 JDK1.8 后往往同级目录下有一个 jre 的目录)
在这里插入图片描述
然后到目录:C:\ProgramFiles\Java\jdk1.8.0_101\lib 进入命令行,执行 java-cp.\sa-jdi.jarsun.jvm.hotspot.HSDB
在这里插入图片描述
JDK1.9 及以后的开启方式
进入 JDK 的 bin 目录下,我们可以在命令行中使用 jhsdbhsdb 来启动它

代码改造
VM 参数加入:
-XX:+UseConcMarkSweepGC
-XX:-UseCompressedOops

-JHSDB 中查看对象
实例代码启动
在这里插入图片描述

因为 JVM 启动有一个进程,需要借助一个命令 jps 查找到对应程序的进程

在这里插入图片描述

在 JHSDB 工具中 attach 上去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值