目录
什么是内存泄漏?
总的来说:内存不在GC掌握之内。
当一个对象已经不在使用了,本该回收时,而另外一个正在使用的对象持有它的引用而导致内存不能被回收。本该回收的对象没有被回收,而一直停留在堆内存中,这就产生了内存泄漏。
Java的GC内存回收机制
当对象不再有任何的引用时候才会进行回收。
内存分配的几种策略
静态存储
静态存储是在程序编译时就已经分配,在整个程序运行期间一直存在。
存储对象: 静态数据,全局static和一些常量
栈式存储
执行函数(或方法)时,函数的一些内存变量都可以放在栈上,函数(或方法)执行结束时会自动释放。
优点:栈内存分配的运算速度很快(在处理器的指令集中)
缺点:容量有限。
堆式存储
堆式存储也叫动态内存分配。
可以通过malloc或者new来申请分配一个内存,程序员需要自己负责堆空间的释放(free或者delete)。
动态内存的生命周期由程序员决定。
优点:堆是不联系的内存区域,堆空间比较灵活也比较大
缺点:需要手动申请(malloc/new)和释放(free/delete),频繁的申请和释放会导致内存碎片,最终导致效率低。
案例分析
public class main(){ //全局变量,存在放堆中。 int number = 1; Person person = new Person(); public void count(){ // 局部变量 int sum = 0; Person pserson2 = new Person(); } }
- 成员变量全部在堆中(包括基本数据类型,引用和引用的对象实体)
这些变量属于类的,而且类对象最终还是new出来的。
- 局部变量,引用存储在堆中,引用的对象存储的堆中。
局部变量和引用属于函数(或方法),这些都是存放的栈中的。
强引用,软引用,弱引用,虚引用
强引用(StrongReference)
回收时机: 从不回收
声明周期: JAV停止的时候才会终止
使用方式: 对象的一般保存(不需要特意说明)
//str 就是强引用 String str = new String("");
软引用(SoftReference)
回收时机: 当内存不足的时候
声明周期: 内存不足时
使用方式: SoftReference<String>
//String str = new String(""); //软引用 SoftReference softReference = new SoftReference(new String(""));
弱引用 (WeakReference)
回收时机: 在垃圾回收的时候
声明周期: GC后就终止
使用方式: WeakReference<String>
//String str = new String(""); WeakReference ref = new WeakReference(new String(""));
虚引用(PhatomReference)
回收时机: 在垃圾回收的时候
声明周期: GC后就终止
使用方式: 结合ReferenceQueue来跟踪对象呗垃圾回收期回收的活动
//String str = new String(""); ReferenceQueue queue = new ReferenceQueue(); PhantomReference ref = new PhantomReference(new String(""), queue);
PS: 用得比较少,反正我没用过。
历史上的今天
暂无评论...
随机推荐
刘大白:秋江的晚上
归巢的鸟儿,尽管是倦了,还驮着斜阳回去。双翅一翻,把斜阳掉在江上;头白的芦苇,也妆成一瞬的红颜了。
沈从文:寂寞的长街,并不寂寞
有个小小的城镇,有一条寂寞的长街。那里住下许多人家,却没有一个成年的男子。因为那里出了一个土匪,所有男子便都被人带到一个很远很远的地方去,永远不再回来了。他们是五个十个用绳子编成一连,背后一个人用白木梃子敲打他们的腿,赶到别处去作军队上搬运军火的案子的。他们为了“国家” 应当忘了“妻子”。大清...
《人间值得》前言
大家好,我是中村恒子,今年90岁,从事心理(精神科)医生工作将近70年了。因为是医生,所以和大家一样每天朝九晚五地工作。与其说我仍在工作,倒不如说是被要求工作。说实话,我真心感谢信任我的患者朋友,这样我能在工作中有机会与各种各样的人交流。每个人都会有烦恼,在人世间,我们各有各的烦恼。其中,既有职...
使用ffmpeg抽取视频I帧
前言简单记录一下使用ffmpeg抽取视频I帧。window 10正文下载ffmpeghttps://ffmpeg.org/或https://github.com/GyanD/codexffmpeg/releases/tag/2024-08-26-git-98610fe95f我这...
朱自清:看花
生长在大江北岸一个城市里,那儿的园林本是著名的,但却很少,似乎自幼就不曾听见过“我们今天看花去”一类话,可见花事是不盛的。有些爱花的人,大都只是将花栽在盆里,一盆盆搁在架上,架子横放在院子里。院子照例是小小的,只够放下一个架子,架上至多搁二十多盆花罢了。有时院子里依墙筑起一座“花台”,台上种一株开花...
张悦然:旧时光是个美人
我们向前走了很远,才回头。我们追溯的时候,就为她画眉。她的眉太淡,面容太模糊,如何敌得过岁月稀释,情爱挥发。有一段梦游:我们逆走来时路,转几个风口,终于聚在往事的老宅。 于是我们给她画眉,旧时光是个美人。将眉毛一遍遍描黑,但除此之外,我们不能做什么,不能修补她惨淡的微...