浅谈Java内存管理(一)

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

“理想”的Java垃圾回收机制

Java是打着为减轻程序员负担的旗号而诞生的一种语言。在诞生之初,的确受到了百万程序员的追捧。那么,Java的垃圾回收机制究竟是什么样的?一起来看。

· Java垃圾回收机制算法

首先,Java并没有声明JVM应该使用那种算法,所有的算法只是其回收机制可能采用的一种策略。这里列举两种:

·1.引用计数法

·2.标记法

Java在早期的时候采用的一种策略是引用计数法,即目标对象在创建时默认有一个计数器,用来统计该对象身上的引用数目,当数目为0时,表明没有变量引用该对象,则对象可回收。而垃圾回收器也主要检查回收这种对象。

除此之外,还有一种标记类的算法。

如:根搜索算法,来源于图的思想,从一个节点对象出发,只要和该对象有关,就依次传递,直到将所有节点遍历完,而剩下的没有遍历到的节点,则认为是可回收的对象,予以回收。

再如,清除类算法,这类算法有一个典型的特点。将对象记录在一张表中,还是从开头按照引用开始检索,将全程没有引用到的对象从表中释放,在将空间进行压缩;或将引用到的对象复制到新表,再将原表全部释放等。这些都是JVM可能采用的方式,具体还看虚拟机对内存对象更深度的管理方式。

·Java的垃圾回收器GC

Java中的垃圾回收器GC总共有三种类型:新生代垃圾回收器,老年代垃圾回收器和通用垃圾回收器。

·1.新生代:Serial、PraNew、Parallel Scavenge

·2.老年代:Serial Old、Parallel Old、CMS

·3.通用:G1

这三种回收器有各自的用途,具体用哪个看什么类型的对象。Serial和Serial Old都是单线程;PraNew和CMS擅长多核CPU环境;Parallel系列则追求高并发回收,对CPU利用率较高。

现实中的Java垃圾回收机制

·GC的实质

在这里直接说GC的实质显然不太妥当,但还是要简单说一下。GC依赖于JVM,是JVM中的一条低优先级的线程——这就意味着即便你使用了诸如:System.gc( ) 或 finalize( ) 这样的操作,也只是向JVM发起一个回收垃圾的请求,至于是否回收,还看JVM的调度。

·GC的局限性

GC并没有像它所期望的那样能解决所有的垃圾回收问题。比如:

·1.io类,nio类以及JDBC连接中产生的各种对象,没有显式的调用 close( ) 方法关闭读取器、套接字等;

·2.监视器类对象,包括动作监听器在内的,如果监听对象已销亡,但监听器本身还在,则也容易发生内存泄露;

·3.循环语句中有类似 Object sth = new Object( ) 这样的语句,在循环中不断创建新的对象,不断的放弃之前一次建好的对象,又不断地进行新的引用,则很容易发生内存泄露.

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

时间: 2024-10-07 00:52:48

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

浅谈Java内存管理(二)

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

浅谈Java内存模型

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

浅谈Linux内存管理机制

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

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

浅谈Java中的栈和堆

人们常说堆栈堆栈,堆和栈是内存中两处不一样的地方,什么样的数据存在栈,又是什么样的数据存在堆中? 这里浅谈Java中的栈和堆 首先,将结论写在前面,后面再用例子加以验证. Java的栈中存储以下类型数据,栈对应的英文单词是Stack 基本类型 引用类型变量 方法 Java的堆中存储以下类型数据,堆对应的英文单词是Heap 实例对象 在函数中定义的一些基本类型的变量(8种)和对象的引用变量都是在函数的栈Stack内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当