Java内存解析 程序的执行过程

原文地址http://www.cnblogs.com/111testing/p/8443549.html

Java内存解析

栈、堆、常量池等虽同属Java内存分配时操作的区域,但其适用范围和功用却大不相同。本文将深入Java核心,讲解Java内存分配方面的知识。


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

stack(栈)

    存放基本类型的数据和对象的引用,即存放变量。

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

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

heap(堆)

   存放new产生的数据。

data segment

   分为静态域和常量域。

静态域

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

常量池

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

code segment:存放代码。


下面我来举几个简单的小例子来让大家认识一下这几个区域具体存放的内容:

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

例1. 非静态和静态变量的创建

   String str = "abc";  static Int a = 10;  //创建String类型的变量str;创建Int类型变量a

   内存解析:

   这里的str是非静态变量所以将其放入到栈中,而静态变量a则需要放入静态域中,对于变量值"abc"和10则都应该放入到常量池当中

例2. 对象的创建

   String str=new String("abc");  //创建String类型的对象str

   内存解析:

   这里的str是String类型的对象,所以放入栈中,而new出来的东西则放入到堆中,对于初始值"abc"则放入到常量池中即可。

 

例3. 数组的创建

   Int s[] = new Int[3];s[0]=3;s[1]=2;s[2]=3;

   内存解析:

   这里的s[]是一个数组变量,所以放入到栈中,new出来的东西还是放入到堆中,最后的每个元素的值则放入到常量池当中。

 

 

   程序的执行过程


阅读更多
个人分类: Java面试
上一篇java 常用集合list与Set、Map区别及适用场景总结
下一篇Java 容器基础知识
想对作者说点什么? 我来说一句

JAVA中的面向对象与内存解析

2014年04月14日 17.83MB 下载

mina程序执行过程

2014年09月26日 36KB 下载

类对象的创建及内存解析

2018年01月30日 105.57MB 下载

java 索引介绍

2013年11月01日 5KB 下载

一个占用内存的小程序源码

2013年06月12日 188B 下载

java内存解压zip文件

2017年10月11日 5KB 下载

java监控系统链接和内存使用情况

2016年06月29日 6.62MB 下载

没有更多推荐了,返回首页

关闭
关闭