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

运行时数据区

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

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

在这里插入图片描述

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

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 对象只会分配在堆中吗?

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/263958.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali linux无法使用root打开vlc观看视频的解决办法

kali linux陆续装了几个视频播放器,都比较不够友好,无奈安装vlc,vlc安装方法就是 apt install vlc这个没什么好说的,多数源都集成这个著名软件了,kali linux打开闪退,终端下运行出现: VLC is not supposed…

DDD领域驱动设计系列-原理篇-战略设计

概述 DDD领域驱动设计是架构方法论,适用于业务逻辑较复杂系统。 DDD核心目的能输出领域如何划分,以及架构分层如何构建。 本文章系列会分2部分讲述DDD:1、DDD原理;2、DDD实践。DDD原理分为战略及战术设计2篇来讲述;…

Realme X7 Pro Root 刷机教程

Realme X7 Pro 刷机教程 Just For Fun,最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程,如有机友跟随本教程操作,请谨慎操作!!! 以下教程真针对Realme X7 Pro,其他版本方法未知&…

无人机巡山护林,林业无人机智能助力绿色守护

随着全球环保意识的不断提高,无人机巡山护林已经成为解决森林巡检难题的一种独特而高效的方式。在我国,各地正积极探索无人机在森林防火、病虫害监测以及生态调查等领域的创新应用。随着无人机技术的不断演进,其在推动森林保护和可持续发展方…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器,用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…

大师学SwiftUI第18章Part2 - 存储图片和自定义相机

存储图片 在前面的示例中,我们在屏幕上展示了图片,但也可以将其存储到文件或数据库中。另外有时使用相机将照片存储到设备的相册薄里会很有用,这样可供其它应用访问。UIKit框架提供了如下两个保存图片和视频的函数。 UIImageWriteToSavedPh…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

办公自动化-批量更新tar包内文件

最近工作有点忙,学习的时间也少了,为了提高工作效率,有时候我们需要自己写一些提高办公处理效率给的工具或者脚本或者程序。 比如,我目前遇到的一个事项,需要更新很多个tar包文件,把tar包内的某个文件替换…

游戏提示找不到d3dx10_43.dll怎么办?5种方法教你如何修复

在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是“缺少d3dx10_43.dll文件”。这个错误提示通常出现在运行某些游戏或应用程序时,它意味着系统无法找到所需的动态链接库文件。本文将详细介绍d3dx10_43.dll文件的作用以及导致其丢…

logstash插件简单介绍

logstash插件 输入插件(input) Input:输入插件。 Input plugins | Logstash Reference [8.11] | Elastic 所有输入插件都支持的配置选项 SettingInput typeRequiredDefaultDescriptionadd_fieldhashNo{}添加一个字段到一个事件codeccodecNoplain用于输入数据的…

构建linux系统的强有力工具buildroot

目录 01. buildroot简介 1.1简介 1.2 源码下载 1.3 buildroot版本更新介绍 02. 实操演示 2.1 buildroot源码目录层级的简介 2.2 实操演示 03. 结语 01. buildroot简介 1.1简介 Buildroot是一个嵌入式Linux系统的工具链,它用于构建嵌入式设备的根文件系统。…

Kubernetes里的DNS;API资源对象ingress;Kubernetes调度;节点选择器NodeSelector;节点亲和性NodeAffinity

Kubernetes里的DNS K8s集群内有一个DNS服务: kubectl get svc -n kube-system |grep dns测试: 在tang3上安装bind-utils,目的是安装dig命令 yum install -y bind-utils apt install dnsutils #ubuntu上 解析外网域名 dig 10.15.0.10 www.baidu.com…