Java 中的内存分配

Java 程序运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

一、栈:储存局部变量

  • 局部变量:在方法的定义中或者在方法声明上的变量称为局部变量。
  • 特点:栈内存的数据用完就释放。

二、堆:储存 new 出来的东西

  • 特点:

    • 每一个 new 出来的东西都有地址值;
    • 每个变量都有默认值 (byte, short, int, long 的默认值为 0;float, double 的默认值为 0.0;char 的默认值为 “\u0000”;boolean 的默认值为 false;引用类型为 null);
    • 使用完毕就变成垃圾,但是并没有立即回收。会有垃圾回收器空闲的时候回收。

三、方法区:

一个对象的运行过程:

  1. 程序从 main 方法中进入;运行到 Phone p 时,在栈中开辟了一个空间;
  2. new Phone() 时,在队中开了一个内存空间,此时会有一个内存值为 0x0001;此时会找到对应的 Phone 的 class 文件,发现有三个变量和三个方法,于是将三个成员变量放在了堆中,但是此时的值为默认值(具体默认值见上)。注意,在方法区里也有一个地址值,假设为 0x001,可以认为在堆中也有一个位置,在堆中的位置,可以找到方法区中相对应的方法;
  3. 继续运行,p.brand = "三星";将三星赋值给 p.brand,通过栈中的 p 找到了堆中的 brand,此时的 null 值变为“三星”。剩下的类似;
  4. 当运行到 p.call("乔布斯") 时,通过栈中的 p 找到堆中存在的方法区的内存地址,从而指引到方法区中的 Phone.class 中的方法。从而将 call 方法加载到栈内存中,注意:当执行完毕后,call 方法就从栈内存中消失!剩余的如上。
  5. 最后,main 方法消失!

两个对象的运行过程:

  1. 程序从 main() 方法进入,运行到 Phone p 时,栈内存中开内存空间;
  2. new Phone() 时,在队中开了一个内存空间,内存值为 0x0001;此时会找到对应的 Phone 类,发现有三个变量,于是将三个成员变量放在了堆中,但是此时的值为默认值。又发现该类还存在方法,于是将该方法的内存值留在了堆中,在方法区里也有一个地址值,假设为 0x001,这个值与堆中的值相对应;
  3. 程序继续运行,到 p.brand 时,进行了负值,同上;
  4. 当程序运行到 Phone p2 时;到 new Phone() 时,在堆内存中开辟了内存空间 0x0002,赋值给 Phone p2;
  5. 剩下跟一个对象的内存相同。

三个对象的运行过程:

  1. 基本流程跟前两个无差别;
  2. 但是当运行到 Phone p3 时,在栈内存中分配了一个空间,然后将 p1 的内存赋值给了 p3,即此时 Phone p3 的内存是指向 0x0001 的;
  3. 继续给变量赋值,会将原来已经赋值的变量给替换掉。

 

四、本地方法区(和系统相关)

五、寄存器(给 CPU 使用)

Java 中的内存分配的更多相关文章

  1. Java基础-Java中的内存分配与回收机制

    Java基础-Java中的内存分配与回收机制 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一. 二.

  2. Java中的内存分配机制

    Java的内存分为两种:一种是栈内存,一种是堆内存. 在函数中定义的一些基本类型变量和对象的引用都在函数的栈内存中分配.当在一个代码块中定义一个变量的时候,java就在栈中为其分配内存,当超过作用域的 ...

  3. 论 Java 中的内存分配

    Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3. 堆:存放用new产生的数据 4. 静 ...

  4. 2019.12.04 Java中的内存分配

    Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入Java核心,详细介绍一下Java在内存分配方面的知识.一般 ...

  5. Java中的内存分配

    Java程序在运行时,需要在内存中分配空间,为了提高效率,就对空间进行了不同区域的划分,因为每一片区域否有特定的处理数据方式和内存管理方式. 1.栈存储局部变量 2.堆存储new出来的东西 3.方法区 ...

  6. Java数组以及内存分配

    Java数组以及内存分配 什么数组(简) 数组初始化 动态初始化 静态初始化 内存分配问题(重) 数组操作的两个常见小问题 什么是数组: 定义格式: 数组类型 [] 数组名 ; 如:常用格式,其他方式 ...

  7. Java实例化对象过程中的内存分配

    Java实例化对象过程中的内存分配: https://blog.csdn.net/qq_36934826/article/details/82685791 问题引入这里先定义一个很不标准的“书”类,这 ...

  8. java中子类实例化过程中的内存分配

    知识点: 子类继承父类之后,实例化子类时,内存中子类是如何分配内存的呢? 下面,自己会结合一个例子,解释一下,一个子类实例化过程中,内存是如何分配的 参考博客:http://www.cnblogs.c ...

  9. Java中堆内存和栈内存详解2

    Java中堆内存和栈内存详解   Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,ja ...

  10. 关于Hash集合以及Java中的内存泄漏

    <学习笔记>关于Hash集合以及Java中的内存泄漏 标签: 学习笔记内存泄露hash 2015-10-11 21:26 58人阅读 评论(0) 收藏 举报  分类: 学习笔记(5)  版 ...

随机推荐

  1. Kafka -- 基本操作

    kafka 环境的安装 docker run -d --name zookeeper_zh --restart always --network kafka-net -e ALLOW_ANONYMOU ...

  2. python_lib_0001_decorator_print_log

    def decorator_log_funcname( func ):     def wrapper(*arg, **kw):         print("")         ...

  3. NSQ(7)-nsq存在的问题

    nsq存在的缺陷 部署的难度 ​ nsq提供了一种消费者端进行服务发现的模型,所以无需告诉消费者去哪寻找对于的主题(Topic)在哪个nsqd实例上. ​ 然而,它并没有提供一种方案去解决一个生产者应 ...

  4. css选择器 权重的叠加

  5. tomcat多主多备

    主服务器默认轮询,当主服务器全部挂了,就会访问备机backup,备机也默认轮询

  6. httpcanary高级版--不闪退!!!!

    地址 https://wwm.lanzouw.com/iOf7Hz11s4j 密码:45of

  7. No.1.4

    选择器进阶 [复合选择器]:后代选择器:空格    语法:选择器1 选择器2 {css} 子代选择器:>   语法:选择器1>选择器2 {css} [并集选择器]:, 语法:选择器1 , ...

  8. Lecture 1. Introduction and Basics - Carnegie Mellon - Computer Architecture 2015 - Onur Mutlu

    1.Hamming Distance: 两个相同长度比特串对应位置的不同位的数量,一般使用 d(x,y) 来表示汉明距离.对两个比特串进行异或运算,统计结果为1的个数就是汉明距离.   ======= ...

  9. mysql两表关联

    mysql两表关联 是按照范围关联表 select * from ((select u.id,u.name,u.sex,s.street_name,u.street_code,u.birthday f ...

  10. DDD(一)微服务、领域驱动设计、领域模型

    DDD(一)微服务.领域驱动设计.领域模型 如果觉得样式不好:跳转即可 http://www.lifengying.site/(md文件复制过来有些样式会不一样) 什么是微服务 单体结构项目 优点:结 ...