在学习java中发现内存分配问题还是分不大清,java中除了new运算符为对象动态的分配内存,还有哪些会分配内存,具体怎么分配呢,例如
String s = "Hello world!";
该句话在String池中创建了一个String对象,该对象值为"Hello world",那有没有分配内存呢?
希望达人来指导,谢谢!
String s = "Hello world!";
该句话在String池中创建了一个String对象,该对象值为"Hello world",那有没有分配内存呢?
希望达人来指导,谢谢!
解决方案 »
- 救命啊,,,,,求SQL 查询语句
- 如何向 Runtime.getRuntime().exec("cmd /c start") 持续发送指令。
- 求教一下异步IO的问题,课设要交了,急死了!
- 关于Java的类方法~疑惑
- 菜鸟求助!java读取内存卡中.EOL文件数据并画出波形~
- Java能干什么?
- jbuilder8中的JOptionPane.showMessageDialog弹出对话框显示中文字体太小,不美观,如何改变字体大小?
- 谁知道哪里有用java开发的管理信息系统软件(如:图书馆管理系统,人事部管理系统)的代码?
- 有在复旦金仕达工作的朋友吗公司怎样?待遇?
- 各位前辈,看看我的这个问题是什么
- 为什么我给不了分?
- 急!double型转换成String 型数据,如何将213E-2转换成2.13表达
楼主【magicxin031】截止到2008-07-26 05:47:17的历史汇总数据(不包括此帖):
发帖的总数量:0 发帖的总分数:0 每贴平均分数:0
回帖的总数量:11 得分贴总数量:0 回帖的得分率:0%
结贴的总数量:0 结贴的总分数:0
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:---------------------结分的百分比:---------------------
无满意结贴率:---------------------无满意结分率:---------------------
如何结贴请参考这里:http://topic.csdn.net/u/20080501/09/ef7ba1b3-6466-49f6-9d92-36fe6d471dd1.html
2 那个字符串是在字符串常量池里面,而不是new出来的在堆里面的。这个字符串在类装载的时候就已经存在了。
基本上有两种类型
String类型、基本数据类型
基本是放在常量池中:
String str="abc";
int i=10;
double d=3.14;等等
还有引用类型的,这个是放在堆内存中的
String str=new Strng("abc");
Integer i=new Integer(10);
Double d=new Double(3.14);等等
它只是在内存中声名了一个字符串型的变量,但是java是动态创建的,也就是说在java运行的时候才会分配内存空间即java运行时才会以String类型存储s = "Hello world!";
程序从硬盘载入的内存->有四个内存区供程序使用
heap(堆 ),stack(栈),data segment,code segment
heap堆:用来存放new出来的东西
stack栈:局部变量。
data segment:静态变量,字符串常量。
code segment:存放代码
String s是在栈里分配内存
"Hello world!" 在堆里面分配内存
String s = new String ("abc");//创建了2个String对象String不是基本类型
一个java虚拟机示例中只存在一个堆空间,因此所有线程都共享这个堆。并且一个java程序独占一个java虚拟机实例,因而
每个java程序都有它自己的堆空间-它们不会彼此干扰。同一个java程序的多个线程共享一个堆空间,所以还要考虑多线程访问对象
的同步问题。
java中分配内存只能以对象的形式从堆中分配,具体操作步骤由虚拟机负责管理,与c++相反,java不用程序员去处理内存管理方面的问题,
c++语言被攻击的最多的也是内存管理了,很容易造成堆栈崩溃,或者隐藏很深的bug,这也体现了java语言的健壮性和安全性。
程序员可以做的,就是尽量优化程序,比如需要频繁操作的字符串,可以用StringBuffer类,这个类是专门优化过的,还有就是
尽量重用对象,鼓励了设计的简约。同样,内存回收也是由虚拟机来判定是否要回收对象的,程序员可以用System.gc()方法显式通知虚拟机来提高垃圾
收集器的效率。
关于String类型的 象直接用引号引起来的这种字符串常量,包括+号连接起来的字符串常量(例如String a = "ab" + "cd";),在编译成class文件时,
会生成一张表,名为CONSTANT_STRING_INFO,虚拟机在加载class文件时,如果发现这张表,会直接在堆上创建String类型的对象,运行时
碰到引用它们的地方,直接传递引用过去。所以,String a = "ab"这种语句,在运行到这里时,只是申明一个String类型的引用标量,然后把
加载class文件时创建的对象的引用赋值给a。
5楼说的很全了!
本人理解:1.在"栈"空间创建了一个String类型的变量s,
2.在DataSegment中创建了一个String类的对象,内容为"Hello world!"
3.s 指向了 DataSegment中的"Hello world!".