网站大量收购独家精品文档,联系QQ:2885784924

Java内存管理与优化学习.pdf

  1. 1、本文档共31页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

内存管理与优化学习

内存泄漏(MemoryLeak)是指程序中已动态分配的堆内存由于某种原因程序未释放或⽆法

释放,造成系统内存的浪费。这些⽆法被回收的对象,有下⾯两个特点:

1.这些对象是可达的,即在有向图中,存在通路可以与其相连;

2.这些对象是⽆⽤的,即程序以后不会再使⽤这些对象。如果对象满⾜这两个条件,这些对

象就可以判定为内存泄漏,这些对象不会被GC所回收,然⽽它却占⽤内存。

所以要了解内存泄漏、内存抖动及内存机制,就要先了解垃圾回收的机制,知道他们为什么

不能被回收。

⼀、垃圾回收机制(GC)

简介

Java的垃圾回收(GC)是由Java虚拟机(JVM)垃圾回收器提供的⼀种对内存回收的⼀种机制,它

⼀般会在内存空闲或者内存占⽤过⾼的时候对那些没有任何引⽤的对象不定时地进⾏回收。

垃圾(Garbage)是指在运⾏程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾,回

收垃圾的过程被称为GarbageCollection,简称GC。如果不对垃圾对象进⾏回收,那么这些垃圾占⽤

的内存空间会⼀直保留到应⽤程序结束,这些内存⽆法被其它对象使⽤,甚⾄会导致内存溢出。

GC线程在执⾏时会暂停⽤⼾线程,俗称StopTheWorld,简称STW。被GC线程中断的⽤⼾线程会

在GC结束之后恢复,频繁的GC会导致应⽤程序执⾏效率降低。

不同于C++程序,C++是需要开发⼈员⾃⼰分配内存并且进⾏⾃⾏回收内存的,⽽Java程序,内存

是托管于JVM的,即对象的创建和内存的回收都是由JVM⾃⾏完成的,开发⼈员是⽆权⼲涉的,只

能尽量去优化。

内存泄露内存溢出

•内存泄露就是有对象已经不会被程序使⽤了,但是垃圾收集器⼜不能回收它们。⽐如数据库连接

或⽹络连接等需要⼿动close但是没有close的情况。内存泄露不会直接导致应⽤程序奔溃,但

是会⼀点⼀点蚕⻝JVM内存,并最终导致OOM。

•内存溢出就是JVM中的空闲内存⽆法满⾜接下来的内存分配需求,⽽且垃圾收集器也⽆法提供更

多内存,JVM就会抛出OOM。造成内存溢出的原因主要有:

a.JVM的内存设置本⾝就不够⽤。⽐如本⾝就是⼀个很庞⼤的系统,需要加载很多⼤对象,⽽

堆内存本⾝设置就很⼩不够⽤。

b.代码中创建了⼤量⼤对象,⽽且因为这些⼤对象存在被引⽤,所以⻓时间⽆法被垃圾收集器

收集。

c.存在内存泄露。

(1)JVM内存模型

虚拟机栈、本地⽅法栈和程序计数器,这三个区域是线程私有的。⽐如栈帧的⽣命周期是和线程关联

的,即随线程⽽⽣,随线程⽽死。

虚拟机栈其实就是⽤来描述Java⽅法执⾏的,所以每个⽅法执⾏的时候都会创建⼀个栈帧,每个栈帧

都包含:局部变量、操作数栈、动态链接、⽅法出⼝,当⽅法执⾏完成之后,对应的栈帧便会出栈。

所以它的内存分配是具备确定性的,因此我们并不需要太过关注包括虚拟机栈在内的这⼏个线程私有

区域的内存使⽤情况。

相反,另外两个线程共享的区域:⽅法区和堆内存,则是重点关注的对象。因为这两个区域主要存放

对象、数组等不具有确定性的数据,例如创建对象,每个⽅法运⾏的过程中创建的对象的数量是不确

定的,即占⽤的内存是不确定的,可能不需要创建对象,也可能会创建很多对象,所以这两个区域也

是垃圾回收器进⾏垃圾回收的最重要的内存区域。

JVM采⽤分代回收的算法,即根据对象的⽣命周期进⾏区分并进⾏分代存储和回收,其主要分为年轻

代、⽼年代、持久代

堆内存主要由年轻代和⽼年代组成,⽽⽅法区主要存储持久代的数据。

(2)JVM判断内存对象是否存活的算法

要回收垃圾,就要知道哪些对象是垃圾,所以就有了判断对象是否存活的算法。有2种算法:

•引⽤计数算法

•可达性分析算法

⽽现在jvm采⽤的是第⼆种可达性分析算法

引⽤计数法

⼀个对象被创建之后,系统会给这个对象初始化⼀个引⽤计数器,当这个对象被引⽤了,则计数器

+1,⽽当该引⽤失效后,计数器便-1,直到计数器为0,意味着该对象不再被使⽤了,则可以将其进

⾏回收了。

这种算法其实很好⽤,判定⽐较简单,效率也很⾼,但是却有⼀个很致命的缺点,就是它⽆法避免循

环引⽤,即两个对象之间循环引⽤的时候,各⾃的计数器始终不会变成0,所以引⽤计数算法只出现在

了早

文档评论(0)

185****5527 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档