zoukankan      html  css  js  c++  java
  • 【转】java中堆和栈的区别

    转自:http://blog.csdn.net/ggibenben1314/article/details/19172055

    栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

    一、堆

        Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的。

    优点:可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据

    缺点:由于要在运行时动态分配内存,存取速度较慢。

    二、栈

        当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。

    优点:存取速度比堆要快,仅次于寄存器,栈数据可以共享

    缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

    三、举例

    1.

    int a = 3;  
    int b = 3;    

    解析:  编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况

     2.

    String str = new String("abc");  
    String str = "abc";  
    

    解析:第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 

    而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。

    3.

    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");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。

     

    其实java中也存在指针,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!理解了堆和栈的区别才能更好的分析内存。

  • 相关阅读:
    apache log4j打印日志源码出口
    filter listener interceptor的区别
    搭建oracle linux虚拟机报错解决
    top命令查看进程下线程信息以及jstack的使用
    关于跨域访问
    跨域访问
    一直性hash解决扩容后的hash算法不用变
    _创建日志_
    oracle读写文件--利用utl_file包对磁盘文件的读写操作
    oracle中utl_file包读写文件操作实例学习
  • 原文地址:https://www.cnblogs.com/sunada2005/p/3561184.html
Copyright © 2011-2022 走看看