浅谈Java内存管理(二)

我们几乎无法从Java本身改变其回收机制的策列,但我们可以改变我们的编程方式和在编程中的注意事项。

1.Java没有C++中对象析构的功能,但Java的垃圾回收机制是有原则的,它会回收没有变量引用的对象。这种对象没有变量引用它,也就再也不可能有任何方法找到这个“丢失的”对象了——GC回收的就是这种对象。所以当我们确定一个对象不再有任何价值和意义时,将这个对象对应的所有变量引用全部置为NULL,这时这个对象就符合了GC的回收标准。对于我们而言也就相当于手动做了对象析构的操作,至于是否真的回收,那是Java自身的问题,至少和编程人员无关了。

2.当然,对于IO类扫描器、NIO类的套接字等对象,Java还是保留了close()、shutdown() 等方法,当我们不再用这类对象时,一定要调用这些方法关闭对象,也就相当于对象析构和置空。

3.除了人工判断IO,NIO类对象的关闭外,我们还可以使用try(){ }语句(带资源的try语句),将这类对象的创建语句置于资源块中,取义为“尝试打开扫描器或套接字,若成功则进行后边的操作;否则,自动关闭相应的对象”。

4.对于PI=3.14……这样的常量,在使用时,应尽量避免自己创建此类常量对象,尽可能使用Java的Math类中已定义好的的PI、MAX_VALUE、MIN_VALUE 静态常量,可以减少GC的负担——毕竟这类常量总不能被认为是可销毁的吧。

5. 避免在循环中针对同一变量创建对象。说到循环,不得不提一下递归。我们通常认为递归比循环更加耗费内存中的栈区,原因就是因为递归中的变量是以函数为单位产生的,虽然变量同名,但他们储存在内存中不同的单元位置,所以几乎不会出现对象无法被GC回收的现象;但是循环就不一样了,循环操作节省内存的一个很重要的原因就是一个变量依次引用创建的对象,以至于到了循环结束时,多个变量具有相同变量名的变量引用了多个对象,那么明明在循环结束时理想状态下应该只有一个变量名引用一个对象,之前循环中创建的对象都成为GC的回收目标,但是现在所有循环中创建的对象都产生了引用,还具有相同的变量名,以至于手动置空会将所有的对象都置空。反而更加麻烦。

6.使用HashMap、HashSet等泛型集合时,应当尽可能整理数据,削弱集合之间的复杂关系,否则,只要应该被回收的集合与其他集合哪怕只剩一个关系,GC都不会回收这个集合的对象。

原文地址:https://www.cnblogs.com/fusiji/p/11409855.html

时间: 2024-09-28 04:10:03

浅谈Java内存管理(二)的相关文章

浅谈Java内存管理(一)

提到Java的内存管理,我始终抱有一种又爱又恨的心理.作为一门面向对象的高级语言,Java的确为减轻程序员的负担做出了巨大的努力,它的垃圾回收机制帮助百万程序员从C系语言恼人的内存管理问题中解脱出来,成为自身的一大亮点:但同时,垃圾回收机制的不可强制执行的特点,又让了解过C/C++的人觉得自动垃圾回收反而是一种累赘,自己有管理内存的能力也不能施展,在一定程度上又限制了程序员的发挥.然而,Java又不可能因为这点就放弃自己的垃圾自动回收机制,所以,能改变的只有我们自己了. “理想”的Java垃圾回

浅谈Linux内存管理机制

经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在这方面,区别于Windows的内存管理.主要特点是,无论物理内存有多大,Linux 都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能.而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间.换句话说,每增加一

浅谈Java内存模型

Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自己也要好好的去理解,去消化.今天我也来班门弄斧,说下Java内存模型. 说到Java内存模型,不得不说到 计算机硬件方面的知识. 计算机硬件体系 我们都知道CPU 和 内存是计算机中比较核心的两个东西,它们之间会频繁的交互,随着CPU发展越来越快,内存的读写的速度远远不如CPU的处理速度,所以CPU

浅谈iOS内存管理机制

iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有另外一个对象或指针指向这块内存,那么为了表示这个后来的对象或指针对这块内存的所有权,引用计数加1变为2,之后若有一个对象或指针不再指向这块内存时,引用计数减1,表示这个对象或指针不再拥有这块内存的所有权,当一块内存的引用计数变为0,表示没有任何对象或指针持有这块内存,系统便会立刻释放掉这块内存. 其

浅谈java内存分配和回收策略

一.导论 java技术体系中所提到的内存自动化管理归根结底就是内存的分配与回收两个问题,之前已经和大家谈过java回收的相关知识,今天来和大家聊聊java对象的在内存中的分配.通俗的讲,对象的内存分配就是在堆上的分配,对象主要分配在新生代的Eden上(关于对象在内存上的分代在垃圾回收中会补上,想了解的也可以参考<深入理解java虚拟机>),如果启动了本地线程分配缓冲,讲按线程优先在TLAB上分配.少数情况下也是直接在老年代中分配. 二.经典的分配策略 1.对象优先在Eden上分配 一般情况下对

浅谈OC内存管理

MRC(手动管理内存): 1.如果使用了alloc.new.copy.retain必须使用release.autorelease来释放这个内存 2.alloc产生一个新对象,把新对象的引用计数器设置为1,retain保留对象,使对象的引用计数器+1,release使对象的引用计数器-1 3.当对象的引用计数器变成0,就会调用dealloc函数,对象释放内存 4.对象创建的时候计数器=1,retain,计数器+1,release,计数器-1,加入数组计数器+1,数组删除对象引用计数器-1 5.pr

[浅谈 Unity 内存管理]

链接:https://www.notion.so/Unity-f79bb1d4ccfc483fbd8f8eb859ae55fe 视频链接:https://www.bilibili.com/video/BV1aJ411t7N6 原文地址:https://www.cnblogs.com/sanyejun/p/12687085.html

浅谈Java回收对象的标记和对象的二次标记过程_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 一.对象的标记 1.什么是标记?怎么标记? 第一个问题相信大家都知道,标记就是对一些已死的对象打上记号,方便垃圾收集器的清理. 至于怎么标记,一般有两种方法:引用计数和可达性分析. 引用计数实现起来比较简单,就是给对象添加一个引用计数器,每当有一个地方引用它时就加1,引用失效时就减1,当计数器为0的时候就标记为可回收.这种判断效率很高,但是很多主流的虚拟机并没有采用这种方法,主要是因为它很难解决几个对象之间循环引用的

!! 浅谈Java学习方法和后期面试技巧

浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要的,比如循环系列.For,while,do-while.这方面只要大家用心点基本没什么难点. 二.面向对象:oop面向对象的时候,偏重理论,相信这方面的文章也很多,大家可以多看看,在这就不说了.重点掌握面向对象的三大特征和基本原理. 三.java核心一:这方面主要偏重API,所以在学习了这章的时候,