高薪程序员必修课-JVM的内存区域以及对象创建过程

JVM内存区域

        在Java虚拟机(JVM)中,内存区域(Memory Areas)是对内存空间的逻辑划分,用于存储不同类型的数据和执行不同的操作。理解JVM的内存区域有助于优化程序性能、调优内存使用和排查内存相关的问题。下面是Java中主要的JVM内存区域及其作用:

1. 程序计数器(Program Counter Register)

程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程都有一个独立的程序计数器,它的作用包括:

  • 线程私有:每个线程都有自己的程序计数器。
  • 线程切换时保存当前执行位置:确保线程恢复执行时能够知道继续执行的位置。
  • 执行Java方法时记录字节码地址:用于支持基于线程的轮转和异常处理。

2. Java虚拟机栈(JVM Stack)

Java虚拟机栈用于存储方法的局部变量、部分方法返回值和操作数栈等数据。每个方法被执行时,都会同时创建一个栈帧(Stack Frame),用于存储方法的局部变量表、操作数栈、动态链接、方法出口等信息。JVM栈具有以下特点:

  • 线程私有:每个线程都有自己的JVM栈。
  • 方法调用:用于存储方法的局部变量和操作数栈。
  • 动态扩展和收缩:根据方法的调用深度动态分配和回收内存。

3. 本地方法栈(Native Method Stack)

本地方法栈与JVM栈类似,但是它为执行本地(Native)方法服务。本地方法是由JNI(Java Native Interface)调用的本地代码,本地方法栈用于支持这些本地方法的执行。

4. Java堆(Java Heap)

Java堆是JVM中最大的一块内存区域,用于存储对象实例和数组。Java堆是所有线程共享的内存区域,主要用于存放:

  • 对象实例:通过new关键字创建的对象。
  • 数组:Java中的数组,包括基本类型数组和对象数组。

Java堆具有以下特点:

  • 垃圾回收:Java堆中的对象不再被引用时,会由垃圾回收器自动进行垃圾回收和内存释放。
  • 分代策略:Java堆通常被划分为新生代(Young Generation)、老年代(Old Generation)和永久代(PermGen,已废弃,Java 8后改为元空间Metaspace)等不同的区域,以支持不同的垃圾回收算法。

5. 方法区(Metaspace)

方法区(Metaspace)用于存储类的结构信息、运行时常量池、静态变量、即时编译器编译后的代码等数据。Java 8及之前的版本称为永久代(PermGen),Java 8之后改为元空间(Metaspace),其特点包括:

  • 动态扩展:根据应用程序的需要动态分配内存空间。
  • 垃圾回收:元空间中的类数据和常量池通常不会被垃圾回收器回收。

6. 运行时常量池(Runtime Constant Pool)

运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。与Class文件中的常量池(Constant Pool)不同,运行时常量池是动态生成的,并且具有一定的动态性。


JAVA对象创建过程

        Java中对象的创建过程涉及类加载、内存分配、初始化等多个步骤。下面详细讲解Java中对象创建的过程,从类加载到实例化的整个流程:

1. 类加载

在Java中,对象的创建首先要加载类的定义信息,即将类的.class文件加载到内存中并生成对应的Class对象。类加载由类加载器(ClassLoader)完成,主要包括以下几个步骤:

  • 加载(Loading):查找并加载类的二进制数据(.class文件)到内存中。
  • 链接(Linking)
    • 验证(Verification):确保加载的类符合JVM规范,如字节码验证。
    • 准备(Preparation):为类的静态变量分配内存,并设置默认初始值(零值)。
    • 解析(Resolution):将符号引用转换为直接引用。

2. 内存分配

一旦类加载完成,JVM需要为对象分配内存。Java堆(Heap)是存放对象实例的主要内存区域。内存分配的方式通常有两种:

  • 指针碰撞(Bump the Pointer):在堆内存中,用一个指针来指示已使用和未使用的内存分界线,分配内存时向未使用的内存段移动指针即可。这种方式要求堆中的内存是连续的,且堆空间必须是规整的。

  • 空闲列表(Free List):在堆内存中维护一个列表,记录上哪些内存块是可用的。分配内存时从列表中找到合适大小的块,标记为已使用,并更新列表。这种方式适用于堆空间不规整的情况。

3. 对象初始化

对象内存分配完成后,JVM会对对象进行初始化。对象初始化主要包括:

  • 设置对象头:包括对象的哈希码、GC分代年龄、锁状态标志等。
  • 执行构造方法:调用对象的构造方法进行初始化。构造方法会按照定义顺序初始化成员变量和执行构造代码块。

示例

以下是一个简单的Java类及其对象创建过程的示例:

public class MyClass {
    private int value;
    
    // 构造方法
    public MyClass(int v) {
        this.value = v;
    }
    
    // 实例方法
    public void printValue() {
        System.out.println("Value: " + value);
    }
    
    public static void main(String[] args) {
        // 第一步:加载类信息
        // MyClass类会被ClassLoader加载到JVM中
        
        // 第二步:内存分配
        // 在Java堆中分配内存空间给MyClass对象
        
        // 第三步:对象初始化
        // 调用构造方法进行初始化
        MyClass obj = new MyClass(10);
        
        // 调用对象的实例方法
        obj.printValue();
    }
}

输出结果

Value: 10

总结

        理解Java虚拟机的内存区域对于优化Java程序、排查内存泄漏和性能调优至关重要。Java中对象的创建过程涉及类加载、内存分配和对象初始化等多个步骤。不同的内存区域具有各自的作用和特点,理解其工作原理和使用方法可以帮助开发人员更好地设计和编写Java应用程序,优化代码结构和性能,同时也有助于排查对象相关的内存问题。


⭐️⭐️ ⭐️ ⭐️ ⭐️ 好书推荐
《Java项目开发全程实录》(第4版)

【内容简介】

        《Java项目开发全程实录(第4版)》以企业QQ、蓝宇快递打印系统、开发计划管理系统、酒店管理系统、图书馆管理系统、学生成绩管理系统、进销存管理系统、神奇Book—图书商城、企业门户网站、棋牌游戏系统之网络五子棋10个实际项目开发程序为案例,从软件工程的角度出发,按照项目的开发顺序,系统、全面地介绍了J2SE和J2EE项目的开发流程。从开发背景、需求分析、系统功能分析、数据库分析、数据库建模、网站开发和网站发布或者程序打包与运行方面进行讲解,每一过程都进行了详细的介绍。

📚 京东购买链接:《Java项目开发全程实录》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

14-6 小型语言模型在商业应用中的使用指南

人工智能 (AI) 在商业领域的发展使众多工具和技术成为人们关注的焦点,其中之一就是语言模型。这些大小和复杂程度各异的模型为增强业务运营、客户互动和内容生成开辟了新途径。本指南重点介绍小型语言模型、它们的优势、实际用例以及企业如何有效利用它们。 基础知识…

RT-Thread和freeRTOS启动流程

一. freeRTOS启动流程 二. RT-Thread启动流程 因为RT-Thread中我们定义了补丁函数也叫做钩子函数--$Sub$$main()--作为一个新功能函数,可以将原有函数劫持下来,并在之后的程序运行中加上$Super $ $前缀来重新调用原始函数。 所以启动流程是$Sub$$main(…

谷粒商城笔记-04-项目微服务架构图简介

文章目录 一,网络二,网关1,网关选型2,认证鉴权3,动态路由4,限流5,负载均衡6,熔断降级 三,微服务四,存储层五,服务治理六,日志系统七&a…

【网络安全】Host碰撞漏洞原理+工具+脚本

文章目录 漏洞原理虚拟主机配置Host头部字段Host碰撞漏洞漏洞场景工具漏洞原理 Host 碰撞漏洞,也称为主机名冲突漏洞,是一种网络攻击手段。常见危害有:绕过访问控制,通过公网访问一些未经授权的资源等。 虚拟主机配置 在Web服务器(如Nginx或Apache)上,多个网站可以共…

软件测试面试题总结(超全的)

前面看到了一些面试题,总感觉会用得到,但是看一遍又记不住,所以我把面试题都整合在一起,都是来自各路大佬的分享,为了方便以后自己需要的时候刷一刷,不用再到处找题,今天把自己整理的这些面试题…

力扣热100 滑动窗口

这里写目录标题 3. 无重复字符的最长子串438. 找到字符串中所有字母异位词 3. 无重复字符的最长子串 左右指针left和right里面的字符串一直是没有重复的 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 左右指针leftright0ans0#初始化结果tablecolle…

ctfshow-web入门-文件包含(web82-web86)条件竞争实现session会话文件包含

目录 1、web82 2、web83 3、web84 4、web85 5、web86 1、web82 新增过滤点 . ,查看提示:利用 session 对话进行文件包含,通过条件竞争实现。 条件竞争这个知识点在文件上传、不死马利用与查杀这些里面也会涉及,如果大家不熟悉…

JavaScript高级程序设计(第四版)--学习记录之对象、类和面向对象编程(中)

创建对象方式 工厂模式:用于抽象创建特定对象的过程。可以解决创建多个类似对象的问题,但没有解决对象标识问题。(即新创建的对象是什么类型) function createPerson(name, age, job) { let o new Object(); o.name name; o.age…

广和通 OpenCPU 二次开发(二) ——通过linux编译

广和通 OpenCPU 二次开发(二) ——通过linux编译 一、编译命令总结 1.编译环境配置 . tools/core_launch.sh cout cmake ../.. -G Ninja 2.编译 ninja 二、命令解释 1. 执行 tools/core_launch.sh 这是一个脚本文件 core_launch.sh,通…

技术赋能政务服务:VR导视与AI客服在政务大厅的创新应用

在数字化转型的浪潮中,政务大厅作为服务民众的前沿阵地,其服务效率和质量直接影响着政府形象和民众满意度。然而,许多政务大厅仍面临着缺乏智能化导航系统的挑战,这不仅增加了群众的办事难度,也降低了服务效率。维小帮…

内核错误定位

内核打印出如下: 在代码目录输入: ./prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gdb kernel/vmlinux 进入gdb 命令模式 输入 l *(rk628_csi_probe0xf0) 能定位到出现问题地方。 最后就…

PLM系统:PLM系统如何重塑产品生命周期管理

PLM系统:重塑产品生命周期管理的未来 在当今快速变化的商业环境中,产品生命周期管理(PLM)系统正逐渐成为企业提升竞争力、加速创新并优化运营流程的关键工具。随着技术的不断进步和市场需求的日益复杂化,传统的手动或…

试用笔记之-汇通窗口颜色显示软件(颜色值可供Delphi编程用)

首先下载汇通窗口颜色显示软件 http://www.htsoft.com.cn/download/wdspy.rar 通过获得句柄颜色,显示Delphi颜色值和HTML颜色值

Python:Pycharm安装指南

三、Pycharm安装指南 在开始之前今天内容之前,将上篇的初体验练习题公布如下: 初体验练习题:输入两个字符,将他们组合后输出。 str1 input("请输入名字:") str2 input("请输入城市:&qu…

Vue iview-ui 被tooltip包裹的标题,点击跳转后,提示框不消失

tooltip包裹的标题,点击跳转后,提示框不消失 就会有这种显示问题 下面这种错误方法不可行,解决办法往下翻 css写得没错,问题出在Javascript当中的 getElementsByClassName(“xxabc”), 这个方法得到的是一个由class&q…

Python | Leetcode Python题解之第213题打家劫舍II

题目: 题解: class Solution:def rob(self, nums: List[int]) -> int:def robRange(start: int, end: int) -> int:first nums[start]second max(nums[start], nums[start 1])for i in range(start 2, end 1):first, second second, max(fi…

PHP基础教程——总结W3school

1、<?php ?> 2、$ 声明变量 3、变量大小写敏感 关键字&#xff08;if、else、echo&#xff09;和用户定义的类、函数大小写不敏感 4、三种注释 // # /* */ 5、echo "<br>"; 换行 6、global(关键字) 函数内访问全局变量 $GLOBALS[index] …

7寸微型FPV无人机技术详解

对于7寸微型FPV&#xff08;First Person View&#xff0c;第一人称视角&#xff09;无人机技术的详解&#xff0c;可以从以下几个方面进行介绍&#xff1a; 一、定义与基本概念 FPV无人机&#xff0c;全称为“第一人称视角无人机”&#xff0c;它利用安装在无人机上的摄像头…

[单master节点k8s部署]19.监控系统构建(四)kube-state-metrics

kube-state-metrics 是一个Kubernetes的附加组件&#xff0c;它通过监听 Kubernetes API 服务器来收集和生成关于 Kubernetes 对象&#xff08;如部署、节点和Pod等&#xff09;的状态的指标。这些指标可供 Prometheus 进行抓取和存储&#xff0c;从而使你能够监控和分析Kubern…

科研绘图系列:R语言STAMP图(STAMP Plot)

介绍 STAMP图(STAMP plot)并非一个广泛认知的、具有特定名称的图表类型,而是可能指在STAMP(Statistical Analysis of Metagenomic Profiles:“STAMP: statistical analysis of taxonomic and functional profiles”)软件使用过程中生成的各种统计和可视化图表的总称。ST…