`

java中的内存分配机制(转帖)

 
阅读更多
Java把内存划分成两种:一种是栈内存,一种是堆内存。   
   在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。   
   当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。   
     堆内存用来存放由new创建的对象和数组。   
    在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。   
     在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。   
    引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
   
    
具体的说:
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
     Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,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, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
    比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。

String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
     因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
     另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。由于String类的immutable性质,当String变量需要经常变换其值时,应 该考虑使用StringBuffer类,以提高程序效率。
来自:http://read.newbooks.com.cn/info/196414.html
分享到:
评论

相关推荐

    转帖经典---JAVA设计模式

    在Java中,设计模式分为三类:创建型模式、结构型模式和行为型模式。 创建型模式关注于对象的创建,它们包括: 1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 2. 工厂方法模式(Factory ...

    论坛转帖工具.rar

    标题中的“论坛转帖工具.rar”表明这是一个用于在论坛之间转移帖子的软件工具,通常用于帮助用户方便地将一个论坛的帖子内容复制到另一个论坛,可能是为了分享信息、讨论或保存重要的帖子。这类工具可能包括自动抓取...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    VxWorks 编程的几个误区(转帖)

    - **内存分配**:合理规划内存分配方案,避免碎片化问题。 - **动态内存管理**:利用VxWorks提供的动态内存管理函数(如vmAlloc、vmFree等)来高效地分配和释放内存。 - **内存保护**:通过设置内存保护区域来防止...

    编辑人员转帖去水印工具

    总之,编辑人员转帖去水印工具如Teorex Inpaint,为图像编辑提供了便利,通过其独特的算法和技术,我们可以高效地去除图片中的水印,提高内容的质量。但在使用过程中,务必遵守版权法和相关法律法规,以维护良好的...

    [转帖]世界编程大赛第一名写的程序

    标题和描述中的“世界编程大赛第一名写的程序”这一知识点,实际上指向了计算机科学与编程竞赛领域的一个重要概念:即在高水平的编程比赛中,优胜者所编写的代码往往蕴含着高级算法、数据结构以及编程技巧。...

    J2ME全方位开发讲解基础汇总[转帖]

    一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成了一些不必要的麻烦,下面将J2ME...

    贴吧转帖工具

    【贴吧转帖工具】是一种专为百度贴吧用户设计的便捷工具,主要用于提高用户在贴吧中的互动效率。通过这款工具,用户可以实现一键转帖和一键8经验签到的功能,极大地简化了传统操作流程,节省了用户的时间,提升了...

    转帖】CE最新过NP教程.docx

    CE是一款强大的内存编辑工具,允许玩家在游戏中修改内存数据以获得优势,但同时也可能被游戏开发者用于防止作弊。以下是通过修改CE源代码和加壳技术来规避反作弊系统的详细步骤: 1. **理解问题**:纸鹤登录器通过...

    discuz X2转帖工具、采集工具

    X2转帖工具、采集工具”是针对这个平台设计的辅助软件,主要用于帮助论坛管理员或用户批量发布帖子和采集内容,提高论坛内容更新的效率。 一、批量发帖功能 1. 自动化发布:此工具可以自动化地创建和发布帖子,...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    它提供了强大的后台管理功能和灵活的模板机制,使得非程序员也能进行网站维护。 该插件的核心组成部分包括 "copyto.js" 和 "copyto.php" 两个文件。"copyto.js" 是一个JavaScript文件,它的主要作用是在前端实现...

    【转帖】 使用 JProfiler 监控 JBoss 运行情况

    2. **配置JBoss启动参数**:在JBoss的启动脚本中添加JProfiler的代理库和监听端口等配置信息,例如: ```bash JAVA_OPTS="-agentlib:jprofilerti=port=8849 -Xbootclasspath/a:$JPROFILER_HOME/bin/agent.jar" ``...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增...9.不断更新中...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    本文将深入探讨“一键转帖功能插件”在帝国CMS 6.0系统中的应用与实现,该插件适用于GBK及UTF-8编码环境,旨在提升网站内容的分享与传播效率。我们将从安装步骤、工作原理、可能遇到的问题以及解决方案等方面进行...

    zj.rar_Java_

    【描述】中的“一位软件工程师的6年总结,值得一看,转帖”暗示了这份压缩文件可能是一位有丰富经验的Java开发者整理的个人学习和工作经验的总结。通常这样的文档会涵盖Java的基础知识、最佳实践、常见问题解决方案...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    8. **故障排查**:如果在使用过程中遇到问题,如插件不工作、报错等,用户可以查阅插件提供的文档、社区论坛或联系开发者寻求帮助。 总的来说,"转帖工具插件 for PHPwind 7.5 正式版" 提供了一个高效且用户友好的...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    HTML2UBBMaxcj 是一款专为Softii论坛设计的转帖工具,它主要用于将HTML格式的帖子内容转换成UBB代码,以便在论坛中更好地显示和分享。UBB(Universal BBCode)是一种轻量级的标记语言,常用于网络论坛,与HTML类似,...

    用PHP批量生成图片缩略图——活跃论坛转帖

    在论坛转帖的场景下,这个过程可能会更复杂,因为需要考虑图片的显示顺序、缓存策略、错误处理等因素。例如,可能需要在数据库中记录每个图片的缩略图路径,以便快速加载,同时处理上传失败或网络中断的情况。 总的...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    浮点栈结构(转帖) - 大呵呵 - 博客园_float_floatregister_

    在处理器设计中,这种结构被用来优化浮点运算的执行效率,因为栈操作通常比其他内存访问更快。浮点栈在硬件层面由一组专用的浮点寄存器组成,这些寄存器在Intel CPU中被称为XMM(eXtended Memory Model)寄存器。 ...

Global site tag (gtag.js) - Google Analytics