当前位置: 首页 > news >正文

jvm专题 之 内存模型

文章目录

  • 前言
  • 一个java对象的运行过程
  • jvm内存分布
  • 程序的基本运行程序
    • 什么是对象?
    • 对象与类的关系?
    • 由类创建对象的顺序

前言

  • 一个程序需要运行,需要在内存中开辟一块空间
  • 类是构建对象的模板,只有类加载到内存中才能创建对象

一个java对象的运行过程

在这里插入图片描述

1、我们自己创建一个Test类,功能只有一个:System.out.println(“hello world”);
2、然后通过终端运行 javac Test.java,会将Test类编译成二进制字节码文件Test.class
3、然后我们继续运行 java Test.class,于是会打印出“hello world”。
4、控制着程序的执行流程的是虚拟机栈
( 打印的过程就是在内存中进行的)

jvm内存分布

  • 由上边图可以看到,jvm主要分为五个区域。我们可以分为两大类:

    线程独享:程序计数器、本地方法栈、虚拟机栈
    线程共享:堆、方法区

  • 每个区域主要的职责,参看上图就可以了,这里不多数
    (各位读者,如果有了解本地方法栈的,欢迎留言哦)

程序的基本运行程序

在java中,万物皆可对象。那么,什么是对象呢,对象与类又是什么关系呢?

什么是对象?

  • 对象是堆内的一块内存空间,是由类构建出来的

对象与类的关系?

  • 类是构建对象的模板,类中有什么,对象当中有什么。

由类创建对象的顺序

  • 我们先来一个Person类,然后再来一个Test类用来测试,一起来看一下顺序

  • 代码

    public class Person {String name;Integer age;Character sex;public static void breath(){System.out.println("会呼吸");}public void speek(){System.out.println("可以说话");}
    }
    
    public class Test {public static void main(String[] args) {Person person1 = new Person();person1.name = "Lucy";person1.age = 20;person1.sex = 'F';System.out.println(person1.name+",年龄为:"+person1.age+",性别是:"+person1.sex);person1.breath();    // 也可以Person.breath();person1.speek();// person2是为了后续的内容讲解,此处先不用关注Person person2 = new Person();person2.name = "Lucy";person2.age = 20;person2.sex = 'F';person2.breath();person2.speek();}
    }
    

    备注:person2是为了对比,下边内容讲解会先忽略这里,只看person1

  • 内存图
    在这里插入图片描述

    执行顺序:
    1、加载Test类信息到方法区中
    2、main()方法入栈
    3、加载Person类信息到方法区
    4、给对象person1的name赋值,name为String类型,person1对象中name指向的是一个引用地址,数据存放在方法区的字符串常量池中
    5、给对象person1的age赋值,age为Integer类型,当age取值为[-128,127]时,age指向的是数组中的某一个。如果超出范围,会创建新的Integer对象
    6、给对象的sex赋值,在堆中创建一个对象
    7、调用breath()方法
    8、调用speek()方法

  • 多说两句(以上边的person1和person2来比对)

    • 如果age取值在[-128,127]内,多个对象指向的是同一内存空间
      System.out.println(person1.age == person2.age);
      -------------
      true
      
    • 如果age取值不在[-128,127]之间,那么不同的对象的age需要在堆中额外创建对象
      person1.age = 200;
      person2.age = 200;
      System.out.println(person1.age == person2.age);
      --------运行结果---------
      false
      
    • 对于Character类,只要值相等,那么多个对象指向的是同一空间地址
      System.out.println(person1.sex == person2.sex);
      --------运行结果---------
      true
      

相关文章:

jvm专题 之 内存模型

文章目录 前言一个java对象的运行过程jvm内存分布程序的基本运行程序什么是对象?对象与类的关系?由类创建对象的顺序 前言 一个程序需要运行,需要在内存中开辟一块空间类是构建对象的模板,只有类加载到内存中才能创建对象 一个j…...

分布式计算框架

进入Scala模式 终端里输入Scala 创建一个新的Scala文件 vim 文件名.scala 复制粘贴代码 ctrlshift c/v 使用vim 先进入插入模式,可以通过按i键来实现,然后粘贴代码,完成后按Esc键退出插入模式,保存并退出可以通过输入:wq然后按…...

YOLO交通目标识别数据集(红绿灯-汽车-自行车-卡车等)

YOLO交通目标识别 数据集 模型 ui界面 ✓图片数量15000,xml和txt标签都有; ✓class:biker,car,pedestrian,trafficLight,trafficLight-Green,trafficLight-GreenLeft, t…...

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定,主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block(块):独立的功能性页面组件,可以是一个简单的按钮,一个复杂的导航条&…...

为什么会出现电话机器人?语音电话机器人的出现起到了什么作用?

电话机器人的出现是科技发展与市场需求相结合的产物,它们的广泛应用反映了现代社会对效率、成本和服务质量的不断追求。以下是电话机器人出现的几个主要原因。 1. 市场需求的变化 随着经济的发展和消费模式的转变,客户对服务的期望不断提高。他们希望能…...

【CSS Tricks】深入聊聊前端编写css的方法论

目录 引言BEM 规范OOCSS 规范结构与样式分离容器与内容分离 SMACSS 规范ITCSS 规范设置层工具层通用层元素层对象层组件层微调层由此分层后的项目代码结构也会相应做修改,主要有两种形式:文件夹形式文件名形式引用方式按照层级顺序引用 ACSS 规范总结 引…...

多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测(Matlab)

多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测 目录 多维时序 | GWO-VMD-SSA-LSTM灰狼优化变分模态分解联合麻雀优化长短期记忆网络多变量时间序列光伏功率预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 …...

5.使用 VSCode 过程中的英语积累 - Go 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂,各种生活的元素也都可以做为我们的学习对象,本文将利用 VSCode 页面上的各种英文元素来做英语的积累,如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的,借此做英语积累再合适不过&a…...

Java高级Day50-连接池

132.数据库连接池 传统获取Connection问题分析 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码。需要数据库连接的时候,就向数据库请求一个&a…...

软件设计-开闭原则

开闭原则是一种重要的设计思想,它为软件系统的可扩展性和可维护性提供了有力的支持。 一、开闭原则的原理 开闭原则(Open-Closed Principle, OCP)是指软件实体(类、模块、函数等)应当对扩展开放,对修改关…...

Angular面试题八

一、请解释Angular中的AOT编译是什么,并简述其优势。 Angular中的AOT编译,全称为Ahead-of-Time(预先编译),是一种在构建过程中将Angular应用程序的模板和组件编译成本地机器代码(通常是JavaScript代码&…...

【Kubernetes】常见面试题汇总(三十六)

目录 88. Pod 启动失败如何解决以及常见的原因有哪些? 89.简述 K8s 中 label 的几种应用场景。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题…...

深入解析SGD、Momentum与Nesterov:优化算法的对比与应用

目录 1. 梯度下降算法2. BGD、SGD、MBGD3. momentum与dampening3.1 另一种形式的momentum3.1.1 学习率固定3.1.2 学习率不固定 4. nesterov4.1 PyTorch中的Nesterov4.2 Polyak与Nesterov的比较 Ref 1. 梯度下降算法 先考虑一元情形。假设待更新的参数为 θ \theta θ&#xf…...

Vue2实现主内容滚动到指定位置时,侧边导航栏也跟随选中变化

需求背景: PC端项目需要实现一个有侧边导航栏,可点击跳转至对应内容区域,类似锚点导航, 同时主内容区域上下滚动时,可实现左侧导航栏选中样式能实时跟随变动的效果。 了解了一下,Element Plus 组件库 和 …...

dev containers plugins for vscode构建虚拟开发环境

0. 需求说明 自用笔记本构建一套开发环境,用docker 虚拟插件 dev containers,实现开发环境的构建,我想构建一套LLMs的环境,由于环境配置太多,不想污染本地环境,所以选择隔离技术 1. 环境准备 vscodedocker 2. 步骤…...

C++ | Leetcode C++题解之第433题最小基因变化

题目&#xff1a; 题解&#xff1a; class Solution { public:int minMutation(string start, string end, vector<string>& bank) {int m start.size();int n bank.size();vector<vector<int>> adj(n);int endIndex -1;for (int i 0; i < n; i)…...

Qt窗口——QMenuBar

文章目录 QMenuBar示例演示给菜单栏设置快捷键给菜单项设置快捷键添加子菜单添加分割线添加图标 QMenuBar Qt中采用QMenuBar来创建菜单栏&#xff0c;一个主窗口&#xff0c;只允许有一个菜单栏&#xff0c;位于主窗口的顶部、主窗口标题栏下面&#xff1b;一个菜单栏里面有多…...

python网站创建001:内容概览

内容概览&#xff1a; 1. Python环境搭建&#xff08;Python解释器、Pycharm、环境变量等&#xff09; 2. 基础语法&#xff08;条件、循环、输入输出、编码等&#xff09; 3. 数据类型型&#xff08;整型、布尔型、字符串、列表、字典、元组、集合等&#xff09; 4. 函数&…...

代码随想录第22天|

class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index s.size() - 1; // 饼干数组的下标int result 0;for (int i g.size() - 1; i > 0; i--) { // 遍历…...

WPF-基础-02 DispatcherObject类

public abstract class DispatcherObject {protected DispatcherObject();public Dispatcher Dispatcher { get; }public bool CheckAccess();public void VerifyAccess(); }WPF中使用Dispatcher更新界面 xaml<Grid><TextBlock x:Name"tbkShow" Horizontal…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别

一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...