java中的几个存储机制

新人初学java,有几个问题一直搞不懂,所以求教各位,感激不尽
1.关于堆栈和堆得问题,现在有这样一种说法,说是变量的存储机制是根据他的作用域决定的,一个方法里定义的变量,则这个变量在这个方法结束后,就会被销毁,所以他的存储的生命期是定好的,所以会存到栈里(堆栈),然后如果是定义的全局变量,是放在堆里的,但是我又看到书上说一般基本数据类型(byte,short,int long,float,double,char)这些是存放在栈里的,而引用数据类型,数组,对象(new过得,分配过内存的),是存放在堆里的,这里我就不懂了,如果我在一个类的方法里定义了另一个类的对象,那这个对象到底是存放在栈里呢,还是堆里呢?有点糊涂,还有String这个类,他好像作为一个数据类型(String a = "xxxx")这种形式,是存放在常量池里,而(String a = new String)这种形式好像是存放在堆内存里,对于这个常量池的概念我不是很懂,还望各位解答,(好像finall,static定义的是放在这里的),还有一种说法,说是存放在堆里的数据,在栈里都有一个引用(地址)是指向这个堆内存的,不知道这么理解对不对.

存放在堆里的数据,在栈里都有一个引用(地址)是指向这个堆内存的 这句话OK

http://blog.csdn.net/qq_25827845/article/details/50965908
可以看看这个,对你有帮助

         对象存储在堆中。JVM在其内存空间开辟了一个称为“堆”的存储空间,这部分空间用于存储使用new关键字所创建的对象。所创建的对象在堆中分配,同时成员变量亦在此分配,并赋初始值为零。引用类型变量c在栈内存中分配,其中保存的数据,为对象在堆内存中的地址信息。当声明好对象之后,对该对象的访问需要依靠引用变量,那么当一个对象没有任何引用时,该对象被视为废弃的对象,属于被回收的范围,同时该对象中的所有成员变量也随之被回收。可以这样认为,成员变量的生命周期为:从对象在堆中创建开始到对象从堆中被回收结束。
   JVM在其内存空间开辟一个称为”栈”的存储空间,这部分空间用于存储程序运行时在方法中声明的所有的局部变量。

方法中的变量即为局部变量,是在栈内存中分配,若变量为值类型,则在栈中存储的就是该变量的值。若变量为引用类型,则在栈中存储的是堆中对象的地址。
JVM对字符串有一个限制,让字符串作为不变对象,这样就可以做到重用。事实上,当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。因为字符串内容不能改变,所以我们可以放心的重用他们