Java华丽转身 —— 内存学习
2014-01-17 11:16
246 查看
Java的内存主要包含4块,即heap(堆内存)、stack(栈内存)、datasegment(静态变量或是常量存放区)、codesegment(方法区)
栈:存取速度快,存放一些基本类型的变量或对象的引用变量。主要用来执行程序的。
堆: 存取速度慢,通过New()方法来创建的对象或数组。主要用来存放对象的。
静态常量区:存放的是静态变量(类变量)或是常量
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。
堆和栈的比较:
堆主要用于存放对象,栈主要是用来执行程序。
栈的优势:存取速度比堆要快,仅次于寄存器,栈数据可以共享。缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量和对象句柄。修改栈指针就可以把栈中的内容销毁,这样模式速度最快。但是需要注意,分配空间时,应事先知道这个数据区的大小。
堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。由于堆是动态的分配,编译器不需要知道从堆里分配多少空间或者是数据要停留多长时间,因此用堆保存数据灵活性更大。缺点是,由于要在运行时动态分配内存,在分配和销毁时都要占用时间,因此效率非常低。
例子:
内存图:
总结:
通过了解,学习这些内存的运行情况,更容易理解程序的运行情况,从而从更高效的角度去写程序,优化程序。
栈:存取速度快,存放一些基本类型的变量或对象的引用变量。主要用来执行程序的。
堆: 存取速度慢,通过New()方法来创建的对象或数组。主要用来存放对象的。
静态常量区:存放的是静态变量(类变量)或是常量
方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。
堆和栈的比较:
堆主要用于存放对象,栈主要是用来执行程序。
栈的优势:存取速度比堆要快,仅次于寄存器,栈数据可以共享。缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量和对象句柄。修改栈指针就可以把栈中的内容销毁,这样模式速度最快。但是需要注意,分配空间时,应事先知道这个数据区的大小。
堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。由于堆是动态的分配,编译器不需要知道从堆里分配多少空间或者是数据要停留多长时间,因此用堆保存数据灵活性更大。缺点是,由于要在运行时动态分配内存,在分配和销毁时都要占用时间,因此效率非常低。
例子:
public class Testshuzu{ //主程序 public static void main(String[] args){ //定义数组 Date[] days; days = new Date[3]; for(int i = 0; i < 3;i++){ days[i] = new Date(2004,4,i+1); } } } //定义Date有三个变量 class Date{ int year; int month ; int day; Date(int y, int m,int d){ year = y; month = m; day = d; } }
内存图:
总结:
通过了解,学习这些内存的运行情况,更容易理解程序的运行情况,从而从更高效的角度去写程序,优化程序。
相关文章推荐
- Java华丽转身 —— 内存学习
- java 内存学习
- java在内存中的类图学习笔记
- Java华丽转身——浅识J2EE十三标准
- 深刻理解JAVA中堆栈和内存是如何分配地址;有助于学习Java语言。
- JAVA学习笔记--4.多线程编程 part1.背景知识和内存模型
- Java多线程内存模型学习
- Java IO 学习(三)缓冲IO / 直接IO / 内存映射
- Java华丽转身 —— 多线程(一)必备知识
- java 内存学习 二 (内存溢出情况说明)
- 关于Java中String内存的学习
- JAVA 学习笔记-内存分配
- java学习之路----内存的分析
- 跟着实例学习java多线程4-内存可见性
- java虚拟机学习之路-java内存区域与内存溢出异常
- java学习--栈内存和堆内存的区别
- Java内存机制学习笔记
- java_croe 学习笔记之新IO---java.nio 之内存映射文件
- 马士兵java视频学习笔记第三章:内存解析
- java学习笔记]java语言基础概述之内存的划分&堆和栈