在学习java中发现内存分配问题还是分不大清,java中除了new运算符为对象动态的分配内存,还有哪些会分配内存,具体怎么分配呢,例如
String s = "Hello world!";
该句话在String池中创建了一个String对象,该对象值为"Hello world",那有没有分配内存呢?
希望达人来指导,谢谢!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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.   

    1 当然有,否则字符串存在哪里?
    2 那个字符串是在字符串常量池里面,而不是new出来的在堆里面的。这个字符串在类装载的时候就已经存在了。
      

  3.   

    java中的内存是自动管理的,虽然是自动管理但是依然有一定的规则,对于引用类型通常会在堆内存中分配一个空间来存储对象,基本类型通常是在栈内存中分配的,而String是一个特列,虽然String在java中是一个引用类型的数据,但是因为他太常被用到,所以,一般String类型的数据会存放在字符串常量池中。
      

  4.   

    很对呀
    基本上有两种类型
    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);等等
      

  5.   

    String s = "Hello world!"; 
    它只是在内存中声名了一个字符串型的变量,但是java是动态创建的,也就是说在java运行的时候才会分配内存空间即java运行时才会以String类型存储s = "Hello world!"; 
      

  6.   

    程序执行的过程
    程序从硬盘载入的内存->有四个内存区供程序使用
    heap(堆 ),stack(栈),data segment,code segment
    heap堆:用来存放new出来的东西
    stack栈:局部变量。
    data segment:静态变量,字符串常量。
    code segment:存放代码
    String s是在栈里分配内存
    "Hello world!" 在堆里面分配内存
      

  7.   

    堆、栈、代码段、数据段这四个部分是不是就是java中内存格局呢?那字符串池在哪个部分呢?在堆里面吗?那字符串中的对象是new出来的东西?……达人,救我!
      

  8.   

    基本数据类型放在栈中的,而new出来时的对象放在堆里。 String s = "Hello world!";  字符串s 应该在栈中
      

  9.   

    String s = "abc"; //创建了1个String对象
    String s = new String ("abc");//创建了2个String对象String不是基本类型
      

  10.   

    什么都不说了,去看JVM规范去了
      

  11.   

    已经了解了,我不了解的是java中内存分配问题,其实3、4楼讲的不错,还是自己看书去把,明晚结分把。
      

  12.   

    java中,对象都是在堆上的,包括字符串对象和数组对象,栈上只能保存简单类型和引用类型的变量,这是虚拟机的规范中明确定义的。
    一个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。
      

  13.   

    http://blog.csdn.net/carefree31441
    5楼说的很全了!
      

  14.   

    如果String s = "Hello world"是在java类里面已经写好的,那“Hello world”就在常量池里面。如果是动态赋值的话就在堆里面分配内存。
      

  15.   

    String s = "Hello world!";
    本人理解:1.在"栈"空间创建了一个String类型的变量s,
              2.在DataSegment中创建了一个String类的对象,内容为"Hello world!"
              3.s 指向了 DataSegment中的"Hello world!".