我不想成为咸鱼系列之字符串创建方式及内存的简单分析
来源:互联网 发布:linux 邮件系统 编辑:程序博客网 时间:2024/06/10 03:01
前言:今天不学习,明天变咸鱼
我们都知道创建字符串的方式有两种(基本的创建方式,clone序列化...不考虑)a.String s1 = "asdf";b.String s2 = new String("asdf");我们首先分析下他在内存中的分配情况:对于s1来说他会在"栈"内存中创建一个引用,之后去"代码区域"中的字符串常量池中去寻找看看存不存在S1这个引用,如果不存在那么在"字符串常量池"中会有一个s1的对象,如果存在那么直接将s1的引用指向字符串常量池中即可也就是说这样: String s5 = "apple"; String s6 = "apple"; System.out.println(s5 == s6); System.out.println(s5.equals(s6));truetrue这样子就解释了为什么s1与s2不相等的原因在我认为首先内存存放的位置就不一样。一个在s1在常量池中,s2在堆中.所以不相等.程序运行时,对象是怎么进行安置的呢?特别内存是内养分配的呢?首先,你需要知道的是有五个不同的地方可以存储数据 - 1) 寄存器 - 2) 堆栈 - 3) 栈 - 4) 常量存储 - 5) 非RAM存储 分析下我以前的知识储备,如图:
下面是结合书和资料进行了调整以及补充 - 1) 寄存器:这是位于最快的存储区域,因为它位于不同于其他存储区的内部--->处理器内部.但是寄存器数量是极其有限的(如果你学过汇编语言应该清楚寄存 - 器大概有这些: 拿8086CPU来举例:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PWS 其中AX,BX,CX,DX这四个寄存器通常用来存放一般性数据. )跟CPU直接打交道的,速度非常快.按照他们的读取速度可以分为以下几类: 1. 寄存器(Register) 2. 缓存(Cache) 3. 内部存储器(RAM) 4. 外部存储器(Hard Drive)我们平时所说的内存就是第三类RAM(支持读写). - 2) 堆栈:位于通用RAM(随机访问存储器中),但是可以通过堆栈指针从处理器那里获得直接支持(这里面透露了一个信息"栈",我们应该都知道"栈"他有两种 方式 a.push() 入栈 b.pop()出栈 且遵循后进先出的原则 )若堆栈指针向下即pop()入栈,标志着要分配新的内存,相反,向上移动则意味着出栈,释放内存. 重点:在创建对象的时候,Java系统必须知道存储在堆栈内所有项(我认为是分别配的地址的引用)的确切生命周期,以便于上下移动.一般情况下,仅 仅是把对象的引用存放在堆栈中. - 3) 堆:一种通用的内存池(也位于RAM区:RAM Suppoted Read And Write),用于存放Java中所有实际的对象(内存),堆不同于堆栈的好处是:编辑器不 不需要知道存储的数据在堆里面存活多长时间。很灵活,但是为了灵活必须付出一定的代价(开辟内存是十分耗费性能的,因为存在两个问题 1.不知道对象的声明周期,需要调用JVM里面的GC来搞定(但是有的时候并不能及时收回). 2.耗费性能,如果你了解过GC的回收算法,你就会知道会消耗时间去遍历的 ), - 4)常量存储: 下面有一段话 运行时常量池(Runtime Constant Pool)是方法区(Method Area)的一部分,是各线程共享的内存区域。 - 5)非RAM存储:如果数据完全存活于程序之外,那么它可以不受程序任何的控制,在程序没有运行的时候也可以存在. 其中两个基本的例子就是:"持久化对象"和"流"对象.暂时就写到这里面.我需要深度思考.回来继续补充
阅读全文
0 0
- 我不想成为咸鱼系列之字符串创建方式及内存的简单分析
- 我不想成为真正的程序员
- 漫谈程序员系列:噢,我不想成为问题!
- 内存分配的方式及特点分析
- 内存分配的方式及特点分析
- java + 线程系列之showThread(一)----简单的线程创建方式有两种
- 为什么我不想成为Web前端程序员
- 为什么我不想成为Web前端程序员
- 创建TabHost的两种方式的简单分析
- 线程的两种创建方式及简单的对比
- C/C++面试之算法系列--几个典型的内存拷贝及字符串函数实现
- C++系列之-----字符串变量的内存分布
- String创建方式内存终极分析
- 简单的内存分析
- 一条咸鱼的校招之路
- 佛山救小悦悦阿婆渴望回归宁静 我不想成为焦点人物
- Autonomy 创始人林奇:我不想成为惠普替罪羊
- 我不想上班,怎么才能成为自由职业…
- C++中const、volatile、mutable的用法
- NFS服务器
- 机器学习——开发环境
- thinking-in-java(16) 数组
- 架构师之路-创业互联网公司如何搭建自己的技术架构
- 我不想成为咸鱼系列之字符串创建方式及内存的简单分析
- 蓝牙5.0 mesh技术分享(一)
- Python基础-偏函数 Partial function
- Java中的Atomic包使用指南
- Tomcat服务器遇到的异常(一)
- 普通程序员如何向人工智能方向转型?
- 在windows上搭建redis集群(redis-cluster)
- 在树莓派上安装go环境很简单
- Android版本更新(Service下载 Notification进度条:直接拿来用)