内存图及其画法

所有的文件都存在硬盘上,首次使用的时候才会进入内存

进程:有自己的Main方法,并且依赖自己Main运行起来的程序。独占一块内存区域,互不干扰。内存中有一个一个的进程。

操作系统只认识c语言。操作系统调度驱动管理硬件,所以卖硬件的时候要配驱动,要不用户不会用,而驱动基本以c语言为主,操作系统直接调动驱动(以驱动为主),所以只认识c语言。

  • java等语言会转成c语言,操作系统在内存上运行他们。
  • 操作系统是内存管理的核心组件,它负责协调和优化内存的使用,以确保计算机系统高效、稳定地运行。

用数组以c语言申请空间。java把内存空间分成五大份如下:

方法区

只写了这两个常量池

Test.java:

package 内存图;

public class Test {
    
    public static void main(String[] mmm) {
        
        Person x1 = new Person();

        
    }
    public static void m1() {        
    }
    public static void m2() {
            
    }
    public static void m3() {
        
    }
    public static void m4() {
        
    }
    public static void m5() {
        
    }
    public void m6() {
        
    }
}

Person.java:

package 内存图;

public class Person{
    public int age;
    public String name;
    public static int flag;
    public void m1(){  //static--静态修饰

    }
    public void m2(){

    }
    public static void m3(){

    }
}

static有无的区别:

静态方法(有颜色的那部分)实际存储在静态常量池,类信息常量池只是指向它的指针

静态的方法可以调用静态的,非静态的可以调用静态的和非静态的。被static方法修饰的可以直接被调用。解释如下:

静态的相当于被创造出来了,可以直接调用。非静态的没有被造出来,不能直接调用,但是同级别的都在图纸上,非静态之间可以互相被调用。

栈,堆

方法被调用是拷贝一份入栈,方法执行完毕之后就会出栈。

package 内存图;

public class Test {
    
    public static void main(String[] mmm) {        
        
                Person x1 = new Person();

                //基本类型的值和句柄在一块
                int a = 9;
                //引用类型,无法预估大小,b是个变量,没办法在栈中申请空间,它的句柄(变量)与值没有在一块
        String b = "asd";
        m1();
        m2();
        int c = 20;
        if(a < c) {
            int k = 12;
            if(k > a)
   //作用域的内部原理:(超作用域就不能操作了)
   //在此范围内新声明变量的句柄要被消掉,找对应的括号,执行完之后在他里面声明的变量都要被摧毁
                        {
                String w = b;
            }
   
        }
    }
    public static void m1() {
        m3();
    }
    public static void m2() {
        m4();
    }
    public static void m3() {
        m5();
    }
    public static void m4() {
 //静态被创造出来了,不再创造了,所以要创造非静态的。调动方法的话也是调动创造出来的方法(白色的:非静态的),拷贝这个创造出来的方法入栈
 //静态的方法或属性在方法区的静态常量池里面只有一份,非静态的方法在每个对象里面都有一份
              Person xx = new Person(); // Person类型的,底层是指针 *xx = (*)maolloc(); 申请空间
        xx.m1();
  
                Person xx2 = new Person();
        xx2.m2();
                xx.m2();
  //静态的可以通过类或对象来调用(指针可以直接调用静态常量池里面的),非静态的只能通过对象来调用。
                Person.m3();                                                             
    }
    public static void m5() {
        
    }
    public void m6() {
        
    }
}
  • 基本类型的值和句柄在一块;
  • 引用类型,无法预估大小,b是个变量,没办法在栈中申请空间,它的句柄(变量)与值没有在一块,与 c语言的指针一模一样。

调用一个方法之后,该方法入栈之后要运行,此时其他方法都停止运行。只有最上面的方法才会运行,变成最上面了就会恢复运行。运行完毕会出去。一个方法下面的方法就是调动它的方法。

//静态被创造出来了,不再创造了,所以要创造非静态的。调动方法的话也是调动创造出来的方法(右边白色的:非静态的),拷贝这个创造出来的方法入栈

//静态的方法或属性在方法区的静态常量池里面只有一份,非静态的方法在每个对象里面都有一份。其他语言也是如此。

里面实际是这样的(指针的大小通常是4字节(在32位系统上)或8字节(在64位系统上))

下面的二进制每次都是读一部分

c语言中要自己写free()回收内存,java中有垃圾回收机制,没人指向的话就会自动回收。

  • 堆中常量池中生成的没人指向不会被销毁,除非常量池内存不够了;其他地方生成的没人指向会被回收。

进程的组成单位是线程(以上的所有过程),线程---依托栈结构完成了一条线的方法的调用,线程的组成单位是方法。

程序计数器:配合栈使用,记录方法的开始结束、变量的有效范围等

本地方法栈:操作系统本身,进行同步翻译(把自定义的c语言转换成操作系统所带的c语言)

任何程序的运行都需要硬件来实现,对硬件的操控需要驱动,操作系统内核来调度驱动(不能同时驱动)

java变成c语言(java自定义c),把自定义的c语言方法翻译成操作系统内的c(通过本地方法栈)

一个程序的地址的长度都是固定的(32bit / 64bit)

  • 指针赋值 (a = "123"):a是一个指向字符的指针。表达式a = "123"意味着将指针a指向一个字符串常量"123"的首地址。改变了指针a的地址,使其指向了新字符串的起始位置。a现在指向了"123"这个字符串。
  • 解引用赋值 *a = "123" 改变指针所指向地址的值,但不能将字符串常量直接赋值给*a。

值不变:

a,b的指向通过w互换了,x1,x2没有受到影响

方法出栈后,可看到x1,x2没有受到影响

对别人产生影响:改变它的指向;改变指向区域的值

值传递

传的是数字或值的地址 new Person();也是值(对象的地址)

传这边的地址:

不同方法中的对象可以指向同一个值

方法1中的对象调用其他方法,调用完成后该方法1中的值、指向没有改变

C语言,java等

引用传递

传x1,x2的地址(句柄的地址)

c++中&a传的是引用

Sring类型的数组和二维数组

String[] arr3 = {"aa","cc",new String("mmm"),"aaa"};

String类型(引用类型)不能在原地存,存的是它的地址

int[] arr1 = {1,2,3,4}; //引用类型 基本类型:byte short int long float double char boolean
arr1 = new  int[] {2,2,3,1,3}; //不管长短,不管占不占满,都新生成一个内存页,不能在原地改
int[] arr2 = arr1;
String[] arr3 = {"aa","cc",new String("mmm"),"aaa"};
arr3[0] = "aaa";
arr3[1] = "aaaa";
Person aa = new Person();
Person[] arr4  = {new Person(), new Person(),aa};

变量不赋值默认都是0

package neicun;
public class test{
    public static void main(String[] nnn){
        int[][] arr={
            {1,2},
            {2,2},
            {3},
            {1,1,4}
        };
        int[][] arr2 = new int[3][2];// 3个一维数组,每个数组里面有两个数字,里面默认都是0
        arr2[1]=new int[] {3,4,5,6};
        String[][] arr3 = {
            {"aa","vv"}, {"cc","ww","ff"}, {new String("xxx")}
        };
        int[][][] arr5 = {
            { {1},{2,2} },
            { {3,4},{1} }
        };


    }
}

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

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

相关文章

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文&#xff0c;一手掌握&#xff0c;你值得拥有&#xff0c;让我们开始吧&#xff5e; ufw 与 iptables的关系 理论介绍&#xff1a; ufw&#xff08;Uncomplicated Firewall&#xff09;是一个基于iptables的前端工具&#xf…

Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用

Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…

内存管理面试常问

为什么要有虚拟内存&#xff1f; 虚拟内存 如果你是电⼦相关专业的&#xff0c;肯定在⼤学⾥捣⿎过单⽚机。 单⽚机是没有操作系统的&#xff0c;所以每次写完代码&#xff0c;都需要借助⼯具把程序烧录进去&#xff0c;这样程序才能跑起来。 另外&#xff0c; 单⽚机的 CPU …

插入排序⁻⁻⁻⁻直接插入排序希尔排序

引言 所谓的排序&#xff0c;就是使一串记录按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 常见的排序算法有&#xff1a; 今天我们主要学习插入排序的直接插入排序和希尔排序。 直接插入排序 什么是直接插入排序&#xff1f; 直接插入排序其…

基于Springboot + Vue开发的飞驰驾校预约学习平台(项目源码 + lw)

一、功能介绍 飞驰驾校预约学习平台包含管理员、教练、用户三个角色以及前后台系统。 主要功能 前台系统功能 首页展示、理论考试、教练信息、教练预约、学习资料、学习视频观看、用户留言、公告信息展示、个人中心信息管理 后台系统功能 管理员或用户登录成功后&#xff0c…

【vivado】时序报告--best时序和worst时序

利用vivado进行开发时&#xff0c;生成best时序报告和worst时序报告。 best时序报告 slow选择min_max&#xff0c;fast选择none。 worst时序报告 fast选择min_max&#xff0c;slow选择none。

深度学习GPU显卡4060ti与4060有什么区别?又与游戏显卡有什么区别?

深度学习GPU显卡4060 Ti与4060的区别 &#xff1a; 性能差异 &#xff1a; 4060 Ti : 4060 Ti通常比4060更强大&#xff0c;具有更多的CUDA核心和更高的显存带宽&#xff0c;因此在计算密集型任务&#xff08;如深度学习训练和推理&#xff09;中表现更好。其显卡核心频率、CUD…

李飞飞:Agent AI 多模态交互的前沿探索

发布于:2024 年 11 月 27 日 星期三 北京 #RAG #李飞飞 #Agent #多模态 #大模型 Agent AI在多模态交互方面展现出巨大潜力,通过整合各类技术,在游戏、机器人、医疗等领域广泛应用。如游戏中优化NPC行为,机器人领域实现多模态操作等。然而,其面临数据隐私、偏见、可解释性…

leetcode 3001. 捕获黑皇后需要的最少移动次数 中等

现有一个下标从 1 开始的 8 x 8 棋盘&#xff0c;上面有 3 枚棋子。 给你 6 个整数 a 、b 、c 、d 、e 和 f &#xff0c;其中&#xff1a; (a, b) 表示白色车的位置。(c, d) 表示白色象的位置。(e, f) 表示黑皇后的位置。 假定你只能移动白色棋子&#xff0c;返回捕获黑皇后…

bash命令缓存导致命令执行失败的问题

1、问题背景 为了修复老版本 vsftpd 的安全漏洞&#xff0c;需要把生产环境上 vsftpd 版本升级到 vsftpd-3.0.5&#xff0c;因为直接使用 rpm 包的方式进行升级还涉及到下层依赖包的升级(生产环境上的依赖包版本不能随意变更&#xff0c;可能会影响其他上层应用)&#xff0c;所…

Docker部署的gitlab升级的详细步骤(升级到17.6.1版本)

文章目录 一、Gitlab提示升级信息二、老版本的docker运行gitlab命令三、备份老版本Gitlab数据四、确定升级路线五、升级(共分3个版本升级)5.1 升级第一步(17.1.2 > 17.3.7)5.2 升级第二步(17.3.7 > 17.5.3)5.3 升级第三步(17.5.3 > 17.6.1) 六、web端访问gitlab服务 一…

Spring03——基于xml的Spring应用

Spring开发中主要对Bean的配置 Bean的常用配置一览如下&#xff1a; Xml配置方式功能描述<bean id"" class"">Bean的id和全限定名配置<bean name"">通过name设置Bean的别名&#xff0c;通过别名也能直接获取到Bean实例<bean sc…

源码可运行-PHP注册登录源码,PHP实现登陆后才能访问页面

最近有一个项目需要实现会员注册和页面登陆后才能访问&#xff0c;所以简单的HTML是无法实现的&#xff0c;就必须通过PHP、html和Mysql来实现&#xff0c;先给大家看一下登录和注册页的效果图。&#xff08;注册完成后会自动跳转到登录窗口&#xff0c;即使A用户登陆后分享了网…

使用Goland对6.5840项目进行go build出现异常

使用Goland对6.5840项目进行go build出现异常 Lab地址: https://pdos.csail.mit.edu/6.824/labs/lab-mr.html项目地址: git://g.csail.mit.edu/6.5840-golabs-2024 6.5840运行环境: mac系统 goland git clone git://g.csail.mit.edu/6.5840-golabs-2024 6.5840 cd 6.5840/src…

35页PDF | 元数据与数据血缘落地实施(限免下载)

一、前言 这份报告详细介绍了元数据与数据血缘的概念、重要性以及在企业数据中台中的应用。报告阐述了数据中台的核心价值在于整合和管理体系内的数据&#xff0c;以提升数据资产化能力并支持业务决策。报告还涵盖了元数据的分类&#xff08;技术元数据和业务元数据&#xff0…

【Flink】Flink Checkpoint 流程解析

Flink Checkpoint 流程解析 Checkpoint 流程解析 Flink Checkpoint 流程解析Checkpint 流程概括Checkpoint 触发流程解析 (Flink 1.20)任务启动后 JobManager 开始定期对任务执行 CheckpointJobManager 使用 CheckpointCoordinator 触发 CheckpointCheckpointCoordinator 初始化…

vue3项目最新eslint9+prettier+husky+stylelint+vscode配置

一、eslint9和prettier通用配置 安装必装插件 ESlint9.x pnpm add eslintlatest -DESlint配置 vue 规则 , typescript解析器 pnpm add eslint-plugin-vue typescript-eslint -DESlint配置 JavaScript 规则 pnpm add eslint/js -D配置所有全局变量 globals pnpm add globa…

MacOS安装软件后无法启动报错:“已损坏,无法打开,你应该将它移到废纸篓“

目录 报错截图 解决方法 知识科普 报错截图 解决方法 1. 打开系统设置->安全性与隐私->选择任何来源 2. 如果打开没有看到"任何来源"&#xff0c;如果不开启“任何来源”的选项&#xff0c;会直接影响到无法运行的第三方应用。开启“任何来源”的方法如下&a…

C++ STL 容器系列(三)list —— 编程世界的万能胶,数据结构中的百变精灵

STL系列学习参考&#xff1a; C STL系列__zwy的博客-CSDN博客https://blog.csdn.net/bite_zwy/category_12838593.html 学习C STL的三个境界&#xff0c;会用&#xff0c;明理&#xff0c;能扩展&#xff0c;STL中的所有容器都遵循这个规律&#xff0c;下面我们就按照这三个境…

Hive分区值的插入

对于Hive分区表&#xff0c;在我们插入数据的时候需要指定对应的分区值&#xff0c;而这里就会涉及很多种情况。比如静态分区插入、动态分区插入、提供的分区值和分区字段类型不一致&#xff0c;或者提供的分区值是NULL的情况&#xff0c;下面我们依次来展现下不同情况下的表现…