首页 > 其他分享 >JVM虚拟机系统性学习-运行时数据区(堆)

JVM虚拟机系统性学习-运行时数据区(堆)

时间:2023-12-14 11:01:42浏览次数:27  
标签:1024 Eden Survivor 对象 虚拟机 系统性 垃圾 JVM 回收

运行时数据区

JVM 由三部分组成:类加载系统、运行时数据区、执行引擎

JVM虚拟机系统性学习-运行时数据区(堆)_Memory

下边讲一下运行时数据区中的构成

根据线程的使用情况分为两类:

  • 线程独享(此区域不需要垃圾回收)
  • 虚拟机栈、本地方法栈、程序计数器
  • 线程共享(数据存储区域,此区域需要垃圾回收)
  • 存储类的静态数据和对象数据
  • 堆和方法区

Java 堆在 JVM 启动时创建内存区域去实现对象、数组与运行时常量的内存分配,它是虚拟机管理最大的,也是垃圾回收的主要内存区域

JVM虚拟机系统性学习-运行时数据区(堆)_老年代_02

在 JDK1.8 中,堆由两部分组成:新生代和老年代

而在 JDK1.9 中,取消了新生代和老年代的物理划分,将堆划分为若干个区域 Region,如下图:

JVM虚拟机系统性学习-运行时数据区(堆)_老年代_03

可以通过代码查看堆空间的大小:

public class HeapSpaceInitial {
   public static void main(String[] args) {
      /**
         使用Runtime.getRuntime()获取当前 (运行时数据区) , 是单例的。
       */

      // 返回Java虚拟机中的堆内存总量
      long initialMemory = Runtime.getRuntime().totalMemory() / 1024 / 1024;
      // 返回Java虚拟机试图使用的最大堆内存量
      long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;

      System.out.println("-Xms: " + initialMemory + "M");
      System.out.println("-Xmx: " + maxMemory + "M");

      System.out.println("系统初始内存大小为: " + initialMemory * 64.0 / 1024 + "G");
      System.out.println("系统最大内存大小为: " + maxMemory * 4.0 / 1024 + "G");

      /**
       输出:
       -Xms: 243M
       -Xmx: 3609M
       系统初始内存大小为: 15.1875G
       系统最大内存大小为: 14.09765625G
       */
   }
}

通过命令行查看堆中的参数:

jps # 查看运行的进程
jstat -gc 进程id  # 查看该进程的堆中参数

通过 VM options 查看垃圾回收时的信息:

-XX:+PrintGCDetails

Java 中新创建的对象如何分配空间呢?

  1. new 的对象先放 Eden 区(如果是大对象,直接放入老年代)
  2. 当 Eden 区满了之后,程序还需要创建对象,则垃圾回收器会对 Eden 区进行垃圾回收
  3. 在垃圾回收的时候,会将 Eden 区的幸存对象转移到 Survivor From 区
  4. 如果再次触发垃圾回收,此时将 Eden 区的幸存对象转移到 Survivor To 区中,并且将 Survivor From 区中的幸存对象也转移到 Survivor To 区
  5. 如果再次出发垃圾回收,此时将 Eden 区和 Survivor To 区中的幸存对象转移到 Survivor From 区中
  6. 当对象的生存年龄达到 15 时,会被放入老年代

在幸存对象每次转移的时候,对会将对象的生存年龄 + 1,达到 15 时会放入老年代中

Java 对象只会分配在堆中吗?

不是的,如果经过 逃逸分析 后发现,一个对象并没有逃逸出方法的话,就可能被优化为在栈上分配,这是常见的堆外存储技术。

逃逸分析就是分析对象动态作用域:

  • 对象在方法中被定义后,对象只在方法内部使用,则认为没有发生逃逸
  • 对象在方法中被定义后,对象被外部方法所引用,则认为发生逃逸

标签:1024,Eden,Survivor,对象,虚拟机,系统性,垃圾,JVM,回收
From: https://blog.51cto.com/u_16186397/8815890

相关文章

  • 虚拟机安装Windows7 X64位教程以及解决VMTOOLS无法安装问题
    相关镜像文件的下载首先我们需要下载一个Windows7的镜像文件这里推荐迅雷下载,速度更快一点ed2k://|file|cn_windows_7_professional_x64_dvd_x15-65791.iso|3341268992|3474800521d169fbf3f5e527cd835156|h=TIYH37L3PBVMNCLT2EX5CSSEGXY6M47W|/虚拟机安装首页->新建虚拟机以上就是......
  • JVM虚拟机系统性学习-类加载子系统
    类加载子系统JVM架构如下图,接下来将从类加载子系统、运行时数据区来逐步讲解JVM虚拟机类加载的时机类加载的时机主要有4个:遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果对应的类没有初始化,则要先进行初始化new关键字创建对象时读取或设置一个类型的......
  • 配置VMware令主机与虚拟机位于局域网同一网段
    1.VMWare版本2.宿主机信息3.虚拟机信息很顺利,没有遇到问题。参考:https://blog.csdn.net/weixin_45467056/article/details/112930163......
  • [linux] [Centos8] 一台虚拟机的安装配置全过程
    今年7月的时候刚学linux,写过几篇配置,结果学得越多才发现已经过时了,这两天重装的时候被自己的文章搞晕了......
  • 虚拟机突然连接不上xshell的解决方案
    今天我打开虚拟机和xshell的时候,发现我的node1连接不上xshell,但是node2、node3依旧可以链接,我在网上找了很多方法,但是是关于全部虚拟机连接不上xshell,但是,我只有一个连接不上,然后我发现我在虚拟机上输入ifconfig的时候显示它不显示我虚拟机的ip地址,查找后我发现是我的ens33这个......
  • VMware workstation 17安装虚拟机ubuntu原始镜像.iso注意事项
    1在安装虚拟机向导对话框,命名虚拟机位置:A虚拟机名称:这里选ubuntu64位B位置(L):该选项要注意:安装时会清除该位置的内容,并且安装完后打开该位置就全部是虚拟机的文件了,跟windows的C盘一样,不能放其他文件了。我选择的位置时E盘,安装完后,打开E盘,里面很多ubuntu......
  • 虚拟机配置
    目录1.网络配置1.在本机查看并设置VMware的网络配置2.修改网络配置文件3.重启服务并测试网络2.系统初始化1.关闭selinux设置为SELINUX=disabled2.关闭防火墙3.安装net-tools(查看电脑ip)4.安装openssh-server3.管理服务器1.安装XShell、Xftp72.安装CentOS常用工具3.安装docker4.配......
  • VMware中虚拟机克隆、拍摄及恢复快照
     【环境系列】Linux虚拟机(Centos、Ubuntu)、云服务器:https://www.cnblogs.com/uncleyong/p/17874484.html虚拟机克隆       克隆后,重启网卡systemctlrestartnetwork.service如果报错,看网卡信息cat/etc/sysconfig/network-scripts/ifcfg-ens33如......
  • [JVM] 应用诊断工具之Fastthread(在线诊断)
    0序言背景近期生产系统遇到了一个线程方面的问题,目前根因已定位到。现将fastthread这一诊断工具做一小结,便于以后快速使用博主我遇到的线程问题:java.lang.OutOfMemoryError:unabletocreatenewnativethreadjava.lang.OutOfMemoryError有8种类型。这8种类型中j......
  • 虚拟机安装MySQL报错
    错误——mysql-community-common(x86-64)=5.7.28-1.el7被mysql-community-server-5.7.28-1.el7.x86_64需要 等可以通过yumremove-ymysql-libs命令解决  再之后正常操作就可以下载各种.rpm了 这个错解决了将近一天!(不知道为什么之前的解决方案不管用......