Java的内存分析
2015-12-29 12:22
260 查看
寄存器
寄存器是存在在cpu上的。而内存是挂在数据总线的,数据总线就是用来决定传输数据的大小。而就是通过在寄存器上的地址来寻找相应内存。总的来说,寄存器和内存是两个东西,程序是无法来控制寄存器,所以这里了解一下就可以了。主要涉及到运行程序涉及到的就是下面这些栈(stack)、堆(heap)、静态域、常量池。栈
栈中主要存放一些基本类型的变量( int, short, long, byte,float, double, boolean, char )和对象引用。 对象是不会放置在里面的。数据共享
这个数据共享主要也是由于引用的是地址来决定的,举个例子:char str1="str1";char str2="str1";这时候再次声明Str2,同时指定两个不同的引用而相同的变量;这时候并不需要重新开辟另外一份内存,只需要两者都指向相同的地址就可以了。这样数据共享带来的就是内存上的节省。堆
存放的主要是动态生成的对象和数组。从这个存放的数据可以知道,这个堆里面存放的是,在程序运行的时候生成的一些数据。如:对象的定义和变量的定义。定义和声明
这里需要对这两个动词进行一些说明。因为在平时过程中,我是对这两个概念比较模糊。一说就是定义声明了一个变量。但是事实上确实不一样的。声明就只是定义这个变量的名字,告诉编译器会有这么一个变量。而定义就不同了,定义就是在声明之后对变量进行初始化、设置一个初始值的过程。如:int i;int i=1;就是这个区别。而在java变量的声明过程中,是不允许没有初始化变量的。
Data segment
这个包括静态域和常量池。静态域
这个就是咱们存放在对象中的静态变量常量池
这个主要是在编译完成后,存放在.class文件中(code segment)。包括一些基本的数据类型和相应的类的接口和声明。换言之就是在编译后,程序中经常使用的不会改变的。例如:基本数据类型(这个是规定,肯定没法改)。接口的命名:这个你肯定不会闲到,改改这个来解闷的。
内存分析
上图是java程序执行的过程,一般变量的内存粗存放过程。
实例:
下面通过分析一个例子来说明java变量是怎么存放在内存中的Code segment:arraylistlist[]=new arraylist[2];
Arraylist[0]=2;arraylist[1]=3;arraylist[2]=4;
因为list[]是一个变量,这是一个声明我们放到栈中。
而后面每个数组实例化出来的变量,所以放到堆中。
而实实在在存在的变量的值都是常量,所以放在常量池中,也就是上图中的datasegment。
相关文章推荐
- java中抽象类和接口的区别
- java的同步方法异步处理
- Spring 缓存及 第三方缓存接入
- java调用so库
- Huffman编码 java版
- JAVA 几种多线程的简单实例 Thread Runnable
- 更新系统或者更换Eclipse后,双击Eclipse-drawable,或者在布局文件中,查看图片时,显示乱码。png 和 jpg
- java 打jar包和运行jar
- JAVA Socket实现多客户端聊天
- BM算法 java代码
- 用来比较的java接口,Comparator 和 Comparable
- java+ajax实例
- 详细的java(GC)原理
- Java继承中属性、方法和对象的关系
- Spring MVC静态资源处理
- Java基础类Class使用指南
- org.eclipse.swt.SWTError: No more handles的解决办法
- 【spring-security】InMemoryDaoImpl在spring-security4.x版本不存在
- Winform客户端到Java服务端的图片展示和上传
- myeclipse中修改文件打开方式