知识点干货--内存优化【1】之内存简介

元宵节,又称上元节、小正月、元夕或灯节,是春节之后的第一个重要节日,是中国亦是汉字文化圈的地区和海外华人的传统节日之一。正月是农历的元月,古人称夜为“宵”,所以把一年中第一个月圆之夜正月十五称为元宵节。
中国古俗中,上元节(元宵节)、中元节、下元节合称三元。元宵节始于2000多年前的汉朝。汉文帝时下令将正月十五定为元宵节。汉武帝时,“太一神”祭祀活动定在正月十五(太一:主宰宇宙一切之神)。司马迁创建“太初历”时,就已将元宵节确定为重大节日。
传统习俗出门赏月、燃灯放焰、喜猜灯谜、共吃元宵、拉兔子灯等。此外,不少地方元宵节还增加了耍龙灯、耍狮子、踩高跷、划旱船、扭秧歌、打太平鼓等传统民俗表演。
传说元宵节是汉文帝时为纪念“平吕”而设。汉高祖刘邦死后,吕后之子刘盈登基为汉惠帝。惠帝生性懦弱,优柔寡断,大权渐渐落在吕后手中.汉惠帝病死后吕后独揽朝政把刘氏天下变成了吕氏天下,朝中老臣,刘氏宗室深感愤慨,但都惧怕吕后残暴而敢怒不敢言。
吕后病死后,诸吕惶惶不安害怕遭到伤害和排挤。于是,在上将军吕禄家中秘密集合,共谋作乱之事,以便彻底夺取刘氏江山。此事传至刘氏宗室齐王刘襄耳中,刘襄为保刘氏江山,决定起兵讨伐诸吕随后与开国老臣周勃,陈平取得联系,设计解除了吕禄,“诸吕之乱”终于被彻底平定。
平乱之后,众臣拥立刘邦的第二个儿子刘恒登基,称汉文帝.文帝深感太平盛世来之不易,便把平息“诸吕之乱”的正月十五,定为与民同乐日,京城里家家张灯结彩,以示庆祝。从此,正月十五便成了一个普天同庆的民间节日——“闹元宵”。

今天带给大家的是关于内存优化方面的,这类文章也是一个系列。我们先从内存简介开始吧。

Android内存是一很大的主题,涉及到内存分配,使用,回收,泄露,检测工具,内存优化等等一系列的课题,如果想完全讲透讲明白,仅仅靠几篇文章是做不到的,我这里的总结也只起到一个抛砖引玉的作用,只涉及一些最常见的概念,总结以及优化方案等的方面,想学习一些更深入的主题,除了可以参考官方的正式文档外,还需要各位多实践才能掌握的更深刻。

让我们先从了解内存的概念开始吧。
RAM(random access memory)随机存取存储器,简称内存。
这个大家应该比较熟悉,我们说的内存一般指的就是RAM。我们这里拿C/C++和Java的内存做个对比来解释RAM的概念。
C/C++和Java内存分类基本上相同的,广义上一般分为RAM和ROM。

一般Java在内存分配时会涉及到以下几个区域:

1、寄存器(Registers):

速度最快的存储场所,因为寄存器位于处理器内部,所以存储读取都很快,但是我们在程序中无法控制。

2、栈(Stack)(和C/C++不同,Java没有栈对象):

存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中。

3、堆(Heap)Java使用GC回收,C/C++ 使用free,delete):

堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器(GC)来管理。

4、静态域(static field)(和C/C++不同,分带和不带static):

静态存储区域就是指在固定的位置存放应用程序运行时一直存在的数据,Java在内存中专门划分了一个静态存储区域来管理这些特殊的静态数据变量,相当于C++中的全局变量。和C/C++不同,带和不带static,带时有效范围是某个文件或模块区域有效,不带时表示整个工程有效,在任意文件可以使用。

5、常量池(constant pool):

虚拟机必须为每个被装载的类型维护一个常量池。常量池就是该类型所用到常量的一个有序集和,包括直接常量(如string,integer等)和对其他类型,字段和方法的符号引用。

6、非RAM存储:

硬盘等永久存储空间

ROM是Read Only Memory的缩写,翻译过来就是只读存储器,程序直接加载的载体。我们说的存储空间指的就是ROM。我们可以这样来对比理解,它就相当于电脑中的硬盘,而RAM相当于内存。

怎样理解栈和堆以及二者简单对比

它们都可以用来存储对象,但是所谓“尺有所长,寸有所短”,它们都有各自优点和缺点。

“栈”?

当定义一个变量时,Java就在栈中为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
它的优点:是存取速度比堆要快,仅次于寄存器。但缺点也很明显,存在栈中的数据大小与生存期必须是确定的。

“堆”?

当堆中的new产生数组和对象超出其作用域后,它们不会被释放,只有在没有引用变量指向它们的时候才变成垃圾,不能再被使用。即使这样,所占内存也不会立即释放,而是等待被垃圾回收器收走。这也是Java比较占内存的原因。
它的特点:堆是一个运行时数据区,可以动态地分配内存大小,因此存取速度较慢。也正因为这个特点,堆的生存期不必事先告诉编译器,而且Java的垃圾收集器会自动收走这些不再使用的数据。

二者简单对比,这里只列举两点区别:

1、变量生命周期

栈变量退出作用域后自动释放,而堆不会。
栈变量如局部变量,使用比较方便,用完也不用考虑释放,出了作用域就会被回收;而堆使用new申请,出了作用域也不会释放,除非没有对象再引用它。GC才会考虑回收。

2、变量访问速度

栈存取速度比堆要快,仅次于寄存器。但栈变量不如堆变量灵活。

以上就是关于内存的一个简单介绍,后篇将会总结JVM内存和GC,敬请期待。谢谢。

知识点干货--内存优化【1】之内存简介_第1张图片
本公众号将以推送Android各种技术干货或碎片化知识,以及整理老司机日常工作中踩过的坑涉及到的经验知识为主,也会不定期将正在学习使用的新技术总结出来进行分享。每天一点干货小知识把你的碎片时间充分利用起来。

你可能感兴趣的:(知识点干货--内存优化【1】之内存简介)