java内存

2023-10-26

在java视频中,一直强调java内存的重要性,如果真正理解 了java内存的分配情况和程序运行时的java内存,那么你会对 java编程的思想,会更加深刻。

Java内存分配与管理是Java的核心技术之一,Java的内存分配有三种,

一、静态存储区:内存在程序编译时就分配好了,比如静态变量;

二、栈区(stack):各种原始数据类型的局部变量都是在栈上创 建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。

栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知的栈一样,栈式存储分配按照先进后出的原则进行分配。

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。

1.基本类型的变量:如:(int,short,long, byte ,float , double , Boolean ,char),栈有个很重要的特殊性,就是存在栈中的数据可以共享,例如:

Int a=1;

Int b=1;

Int a =3;

Java编译器会先处理 int a=1;首先它会在栈中创建一个变量为a的引用,然后在栈中查找是否有“1”这个值,如果没有找到,就将1存放到栈中,然后将a指向1,接着处理b=1,在创建玩b的引用变量后,因为栈中已经存在“1”这个值,所以,直接将b指向“1”,这就出现了a和b同时指向“1”的情况。

然后处理a=3;,在栈中没有找到“3”,所以把“3”放到栈中,接着就把a指向“3”,这个地址,因此a值的变化不会影响到b 的值。这就是栈的数据共享,节省了很大的内存。在程序编译的时候那些常量(1和3),都是放在常量池中的。

2.对象引用变量:在创建一个对象(实例化new)后,在栈中定义一个特殊的变量,让栈中的这个变量取值等于数组或者对象在堆内存中的首地址,这就变成了引用变量,引用变量就相当于是为数组和对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。

如:String str = new String(“Hello”);

首先在常量池中有一个“Hello”,处理后,把“Hello”复制到堆中一份,在栈中创建一个对象引用变量,指向堆中“Hello”的首地址。

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

三、堆区(heap):对象(包括数组)都是在堆中创建的。程序在 运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。

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

堆主要用来存放对象的堆是应用程序在运行的时候请求操作系统分配给自己内存,由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间,因此用堆的效率非常低.但是堆的 优点在于,编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面 向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.

因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定,要求创建一个对象时会在堆里自动进行数据的保存.当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花 掉更长的时间!这也正是导致我们刚才所说的效率低的原因


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java内存 的相关文章

  • Java中printf左对齐

    当我运行该程序时 阶乘值右对齐 有没有办法让它左对齐 同时保持中间 50 个空格 public class Exercise 5 13 public static void main String args int numbers 1 2
  • 当线程无法访问所有已用堆时查找 Java 内存泄漏

    我正在研究基于 Java 的大型系统中潜在的内存泄漏 或至少是内存浪费 JVM 运行时的最大堆大小为 5 GB 2 3GB 堆使用量是应用程序的预期基准 可能会有更高的峰值 在我正在调查的过载场景中 堆被填满 使用 Eclipse Memo
  • 线程“main”中出现异常 java.lang.NoClassDefFoundError:无法初始化类 com.sun.jersey.core.header.MediaTypes

    我正在尝试运行一个球衣客户端并面临这个问题 WS级 import javax ws rs GET import javax ws rs Path import javax ws rs Produces import javax ws rs
  • 具有多字符替换的字符串组合(产生返回Java的替代重写)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 还有另一篇 Stack Overflow 帖子是为与车辆登记号相关的算法创建的 根据输入的车牌 例如ABC123 和列表 替换值 例如
  • Spring MVC 配置启用

    我正在从头开始建立一个项目 目前我正在配置Spring MVC 4 1 5使用java配置 整个应用程序正在 tomcat gradle 插件上运行 有人可以解释一下为什么我需要对班级进行以下调用DefaultServletHandlerC
  • Java 8 列表到带有总和的 EnumMap

    我有以下课程 public class Mark private Long id private Student student private Integer value 0 private Subject subject public
  • 如何将 Google proto 时间戳转换为 Java LocalDate?

    我们需要将 Google Protobuf 时间戳转换为正常日期 在这种情况下 有没有办法将 Google Proto 缓冲区时间戳转换为 JavaLocalDate直接地 tl dr 作为 UTC 时刻 转换为java time Inst
  • 如何从属性中获取枚举值

    我有一个带有值的枚举VALID and INVALID 它们有一个与之关联的布尔属性 我想根据我提供的布尔值获取枚举值 如果是true我应该得到VALID 如果是false我应该得到INVALID 我想根据成员变量的值 在如下所示的 get
  • 为什么 JPA/hibernate 不能映射到 MySQL blob 类型?

    我收到以下错误 Caused by org hibernate HibernateException Wrong column type in TestTable for column PAYLOAD Found blob expected
  • 将 LinkedHashset 内容复制到新的 ArrayList?

    我有一个最初包含一些内容的 listView 如果它得到相同的内容 我通过删除重复linkedhashset 现在 我想复制linkedhashset内容 即没有重复的内容到新的ArrayList 我尝试复制通过 p addAll 0 lh
  • 0x0A 和 0x0D 之间的区别

    我正在研究蓝牙 我试图编写代码以在连接时继续监听输入流 我遇到了以下代码片段 int data mmInStream read if data 0x0A else if data 0x0D buffer new byte arr byte
  • 在 Eclipse 中编写链接特定行的注释

    我正在 Java 中使用 Eclipse 并且处理很长的类 我需要这样的功能 在方法的顶部注释中 例如 有一个由该方法执行的操作列表 对于列出的每个操作 我想将注释的一部分 超链接 到相关代码的特定行 然后使用 Ctrl Click 到该行
  • 字符串包含相同的字符但仍然不同[重复]

    这个问题在这里已经有答案了 我正在尝试读取一个 txt 文件并使用每个句子作为团队的名称 同时使用该名称查找另一个 txt 文件以获取其内容 所有 txt 文件都位于我的资产文件夹的根目录中 第一个 txt 文件工作正常 我使用assetm
  • 使用 JSeperator - Java 时出现异常间隙

    我一直在开发 Swing GUI 并在添加后出现一些不寻常和不需要的间隙JSeperator 知道如何删除它们吗 或者任何其他选择来很好地实现这一目标 视觉描述 之前差距就很明显了JLabel 速度 及之后JSlider 相关代码 cont
  • 什么触发了java垃圾收集器

    我对 Java 中垃圾收集的工作原理有点困惑 我知道当不再有对某个对象的实时引用时 该对象就有资格进行垃圾回收 但是如果它有对实时对象的引用怎么办 可以说我有一个节点集合 它们再次引用更多节点 List 1 gt Node a gt Nod
  • GWT 和身份验证

    保护 GWT Tomcat 应用程序执行身份验证和授权的最佳策略是什么 有两种基本策略 确保入口点安全 确保远程服务的安全 确保入口点安全 最简单的方法是使用常规 Web 应用程序安全工具限制对 GWT 生成的 html js 文件的访问
  • 缓冲区溢出(与)缓冲区溢出(与)堆栈溢出[重复]

    这个问题在这里已经有答案了 可能的重复 堆栈溢出和缓冲区溢出有什么区别 https stackoverflow com questions 1120575 what is the difference between a stack ove
  • 在 WildFly 10 中添加 jar 作为部署

    有没有办法 我们可以将 jar 部署为库 部署WildFly 10就像我们可以做到的那样weblogic服务器 或者我们可以将 jar 放在服务器的任何文件夹中并将这些依赖项定义为provided 我得到了什么部署方式jars on Wil
  • 如何使用 GWT 2.4 在服务器端动态创建 UI

    我正在尝试使用 Google Web Toolkit v2 4 创建用户界面 由于多种原因 我需要在运行时指定服务器上接口的内容 我的意思不仅仅是按钮需要动态标签等 而是整个 UI 需要在运行时创建 我的大部分 UI 都可以指定为直接的 H
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些

随机推荐

  • <Python>PyQt5,多窗口之间参数传递和函数调用

    PyQt5的多窗口之间参数如何传递 函数如何调用 之前在学习PyQt5的过程中 试着自己编写一个音乐播放器 基本功能实现后 希望添加一个独立的播放列表 然后实现播放列表和播放主界面之间的函数调用 双击播放列表的歌曲 主窗口播放歌曲 这虽然是
  • 数据库应用:MySQL高级语句(三)存储过程

    目录 一 理论 1 存储过程 2 存储过程操作 3 存储过程的参数 4 存储过程的控制语句 二 实验 1 创建和调用存储过程 编辑 编辑 2 存储过程的参数 3 存储过程的控制语句 三 总结 一 理论 1 存储过程 1 概念 存储过程是一组
  • Android 删除文件

    删除文件 代码逻辑实现 一 首先是将数据给 查 出来 二 删除操作 一 删除系统数据库表对应的索引 二 删除成功后需要更新MediaStore 不然下次查出来的数据有发现怎么删除了的还在 三 根据个人需求 重新查一遍数据 更新数据列表 注意
  • matlab向量生成和运算

    向量的生成 1 直接输入 a 1 2 3 4 2 冒号运算符 3 从矩阵中抽取行或者列 4 线性等分法 利用元素间的等差值来实现 利用函数的形式来实现的 语法格式如下 向量名 linespace 第一个元素数值 最后一个元素数值 向量位数
  • Java架构师之旅(二十九 附录《MyBatis3 用户指南》中文版)

    夜光序言 岁月波光粼粼 赋予爱与生命 唯有生活不能被他人代替 只会有寂寞相随 正文 MyBatis 3 2010 08 01 翻译的一个版本 虽难比较老了 但是有一些基础还是值得学习 毕竟是中文版 Contents MyBatis是什么 6
  • SpringBoot项目启动后执行指定方法的四种实现

    今日的好天气 文章目录 方式一 方法上添加注解 PostConstruct 1 定义 2 PostConstruct和 Autowired 构造函数的执行顺序 3 PostConstruct使用时注意事项 4 几点建议 方式二 实现Comm
  • 深度学习03-卷积神经网络(CNN)

    简介 CNN 即卷积神经网络 Convolutional Neural Network 是一种常用于图像和视频处理的深度学习模型 与传统神经网络相比 CNN 有着更好的处理图像和序列数据的能力 因为它能够自动学习图像中的特征 并提取出最有用
  • Java RSA加密解密及签名验证

    一 简介 RSA公开密钥密码体制是一种使用不同的加密密钥与解密密钥 在公开密钥密码体制中 加密密钥 即公开密钥 PK是公开信息 而解密密钥 即秘密密钥 SK是需要保密的 加密算法E和解密算法D也都是公开的 虽然解密密钥SK是由公开密钥PK决
  • opengl的纹理过滤

    和纹理映射相关的另一个重要概念是 过滤 我们已经讨论了怎样将纹理坐标 这是个0到1之间的分数 映射到纹素上 纹理贴图中纹素的坐标总是以整数定义的 但是如果纹理坐标映射到纹素上的坐标为 152 34 745 14 怎么办 不明智的方案是将这个
  • css的三种引入方式

    目录 三种引入方式 1 行内样式 2 内部样式 内嵌式 3 外部样式 3 1外链式 3 2导入式 引入方式的优先级 三种引入方式 1 行内样式 行内样式就是直接把css样式添加在HTML标签中 作为style样式的属性值
  • DDR4 设计概述以及分析仿真案例(硬件学习)

    转载 DDR4 设计概述以及分析仿真案例 硬件设计讨论 EDA365电子论坛网 引言 随着计算机 服务器的性能需求越来越高 DDR4开始应用在一些高端设计中 然而目前关于DDR4的资料非常少 尤其是针对SI 信号完整性 部分以及相关中文资料
  • ODBC 各种数据库连接串

    Overview Generally one of the first steps when you are trying to work with databases is open it You can find several typ
  • 查看及配置交换机管理地址

    查看及配置交换机管理地址 问题 交换机是目前用于组建局域网的主要设备 交换机根据MAC地址表实现数据帧的转发 通过查看MAC地址表更加有利于交换机工作原理的理解 通过查看CISCO设备邻居信息来了解网络拓扑 通过telnet方式远程访问 配
  • Selenium+python之隐藏浏览器的“Chrome正在受到自动软件的控制“提示语

    在执行测试用例 细心的人都会发现 浏览器的title部分 有一句提示语 Chrome正在受到自动软件的控制 那么 能不能去掉这句提示语呢 也是没问题的 同样的 使用 headless 在浏览器中加入 disable infobars 这个参
  • pyecharts学习小总结——Bar(柱状图)、Pie(饼图)、Line(线图)、Page(页面组件)、Tab(分页组件)、Grid(组合组件)

    目录 pyecharts常用模块总结 Bar 柱状图 1 旋转x轴标签 2 添加工具箱 3 柱状图与折线图混合 4 标注x轴名称 5 设置垂直的一天时间线 6 旋转x和y轴 Pie 饼图 1 设置位置和半径大小 Line 线图 1 设置平滑
  • pip install scipy时发生zipfile.BadZipFile: File is not a zip file解决办法

    应该是下载时发生了丢包 我在官网下载时 只有14M 切换到豆瓣源有30M 附上地址 https pypi doubanio com simple scipy
  • java程序移植_java JDBC 提高程序可移植性

    介绍jdbc一般的程序 程序编程相关 jb oracle weblogic c 很多java初学者在开始接触jdbc编程的时候 在网上与大部分的教材上都是这样 推荐阅读 Java线程入门 什么是线程 import java sql 扩展信息
  • 预训练语言模型(PLMs)综述

    预训练语言模型 PLMs 内容来自AACL 2022 Tutorial https d223302 github io AACL2022 Pretrain Language Model Tutorial https d223302 gith
  • Mysql进阶索引篇02——InnoDB存储引擎的数据存储结构

    前言 前面我们已经剖析了mysql中InnoDB与MyISAM索引的数据结构 了解了B 树的设计思想 原理 并且介绍了B 树与Hash结构 平衡二叉树 AVL树 B树等的区别和实际应用场景 页和页之间并不一定在物理上相连 只是在逻辑上使用双
  • java内存

    在java视频中 一直强调java内存的重要性 如果真正理解 了java内存的分配情况和程序运行时的java内存 那么你会对 java编程的思想 会更加深刻 Java内存分配与管理是Java的核心技术之一 Java的内存分配有三种 一 静态