粗浅看 深度解析Java内存原型

2024-08-26 20:18

本文主要是介绍粗浅看 深度解析Java内存原型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

寄存器

我们在程序中无法控制。

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在

堆中。

堆:存放用 new 产生的数据。 静态域:存放在对象中用static定义的静态成员。 常量池:存放常量。

非 RAM 存储:硬盘等永久存储空间。

常量池 

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的 class 文件中的一些数

据。除了包含代码中所定义的各种基本类型(如 int、long 等等)和对象型(如

String  及数组)的常量值(final)外,还包含一些以文本形式出现的符号引用, 比如:

1、类和接口的全限定名;

2、字段的名称和描述符;

3、方法的名称和描述符。

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集合,包括直接常量(string,integer 等)和其他类型:字段和方 法的符号引用。对于 String 常量,它的值是在常量池中的。而 JVM 中的常量池 在 内 存 当 中 是 以 表 的 形 式 存 在 的 , 对 于 String 类型,有一张固定 长度的 CONSTANT_String_info 表用来存储文字字符串值,注意:该表只存储文字字符串 值,不存储符号引用。说到这里,对常量池中的字符串值的存储位置应该有一个比较明了的理解了。在程序执行的时候,常量池会储存在 Method Area,而不是 堆中。

栈的基本单位是帧(或栈帧):每当一个 Java 线程运行的时候,Java 虚拟机 会为该线程分配一个 Java 栈。该线程在执行某个 Java 方法的时候,向 Java 栈压 入一个帧,这个帧用于存储参数、局部变量、操作数、中间运算结果等。当这个 方法执行完的时候,帧会从栈中弹出。Java 栈上的所有数据是私有的,其他线程 都不能访问该线程的栈数据。在函数中定义的一些基本类型的变量数据和对象的 引用变量都在函数的栈内存中分配。当在一段代码块中定义一个变量时,Java 就 在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java 会自动释放掉 为该变量所分配的内存空间,该内存空间可以立即被另作他用。

Java 虚拟机中的堆用来存放由 new 创建的对象和数组。在堆中分配的内存,

由 Java  虚拟机的自动垃圾回收机制来管理堆的内存。简单的说和栈相对,堆主 要是用来存放 Java  对象的,栈主要是用来存放对象引用的。在堆中产生了一个 数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于 数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中 的引用变量来访问堆中的数组或对象。引用变量就相当于是为数组或对象起的一个名称。

引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用 域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产 生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释 放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。这也是 Java  比较占内存的原因。实际上,栈中的变量指向堆内存中的变量,这 就是 Java 中的指针!

java 的堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new + 构造器等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因 为它是在运行时动态分配内存的,Java 的垃圾收集器会自动收走这些不再使用的 数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

栈的优势是存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是, 存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基 本类型的变量数据(int,short,long,byte,float,double,boolean,char)和 对象引用。

栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定 义: int a=3;int b=3;编译器先处理 int a = 3;首先它会在栈中创建一个变量 为 a 的引用,然后查找栈中是否有 3 这个值,如果没找到,就将 3 存放进来,然 后将a 指向 3,接着处理 int b = 3;在创建完 b 的引用变量后,因为在栈中已经 有 3 这个值,便将 b 直接指向 3 这样,就出现了 a 与 b 同时均指向 3 的情况。

这时,如果再令 a=4;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4 存放进来,并令 a 指向 4;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。

要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同 的,因为这种情况 a 的修改并不会影响到 b,它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

业务思想

关于JAVA内存的分析是很有必要的,在随着工作和学习的不断深入,分析内存原型是很重要的一步。它可以帮助我们更好地理清我们的思路,知道内存中是如何分配和运行的。


这篇关于粗浅看 深度解析Java内存原型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1109571

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4