java内存解析

来源:互联网 发布:网贷大数据查询系统 编辑:程序博客网 时间:2024/06/06 01:49

Java内存解析

  形参和局部变量在栈中分配内存空间 ,运行完自动释放,堆中的内存程序员释放,分析内存解析时,要从main()开始一步一步分析。在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。堆内存用来存放由new创建的对象和数组。 在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运行到作用域外释放。而数组&对象本身在堆中分配,即使程序运行到使用new产生数组和对象的语句所在地代码块之外,数组和对象本身占用的堆内存也不会被释放,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针! 

  静态变量(static)存放在数据区

  new创造对象,会直接执行构造函数,

  首先我们先来讲解一下内存中的各个区域。

     stack(栈):存放基本类型的数据和对象的引用,即存放变量。

      如果存放的事基本类型的数据(非静态变量),则直接将变量名和值存入stack中的内存中;

      如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)。

    heap(堆):存放new产生的数据。

    data segment:分为静态域和常量域。

      静态域:

        存放在对象中用static定义的静态成员(即静态变量,同理,如果该静态变量是基本类型则将变量名和值存入静态域,如果是引用类型则指向new出的对象)。

      常量池:

        常量池指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。除了包含代码中所定义的各种基本类型(如int、long等等)和对象型 (如String及数组)的常量值(final)还包含一些以文本形式出现的符号引用,比如:类和接口的全限定名;字段的名称和描述符;方法和名称和描述符。

  注:大家要注意String类型不是基本数据类型,所以它可以创建对象,并且它的值是放在常量池中的。

1 0
原创粉丝点击