`
fredlong
  • 浏览: 135024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA对内存的使用和垃圾回收

    博客分类:
  • java
阅读更多
作者:黄湘龙
Blog:http://fredlong.iteye.com
微博:http://www.weibo.com/fredlong


JAVA的内存分区

JAVA的内存使用分为三个区:堆区、栈区、方法区。其中方法区也是以堆的形式存在,只是和堆区的用处不一样。
堆区:
  • 存储的全部是对象本身,每个对象都包含一个与之对应的class的信息;
  • JVM中,一个进程只有一个堆区,被所有线程共享;
  • 堆中不存放基本类型和对象引用;


栈区:
  • 每个线程拥有一个栈区;
  • 栈中只保存基础数据类型和自定义对象的引用,对象都存放在堆区中;
  • 每个栈中的数据都是私有的,其他线程不能访问;
  • 栈分问三部分:基本类型区、执行上下文、操作指令区;


方法区:
  • 又叫静态区,跟堆一样,被所有线程共享;
  • 方法区中包含所有的class和static变量;
  • 方法区中包含的都是在整个程序中永远唯一的元素。



堆区的结构

堆区又根据对象的存活时间,分为三个区:新生代,老年代、永久代。
新生代分为三个区,Eden ,Survivor1,Survivor2。Eden区用来存放新创建的对象的。Survivor1,Survivor2用来存放经过一次或多次YGC之后仍然存活下来的对象。
JAVA的GC分为两种Young GC(YGC,又称MinorGC)和Full GC(FGC,又称MajorGC)。YGC是对新生代中的对象进行回收的操作,FGC是对老年代和永久代进行的操作。
根据JAVA应用程序的场景不同,可以调节新生代和老生代的大小比例。比如在一种存活时间不长的对象比较多的场景,可以让新生代足够大来尽量避免FGC.使用

什么样的对象会被回收

不被任何线程或者静态变量引用的对象将被回收,主要分为以下四种情况:
  • 对象被明确设置成null;
  • 对象在区域内创建,并且工作线程已经离开这个区域;
  • 对象的容器对象被设置成null,比如objectRoot引用了一堆object,那么当objectRoot被设置为null的时候,所有被它引用的对象也将被回收;
  • 只被weakhashmap应用的对象;


GC的细节

下面讲以下GC的细节

1.Young GC
新对象创建好了之后,就会被分配在新生代中。一般等到Eden区满了之后会触发YGC。YGC做了以下的事情。

  • 将Eden区的需要回收的对象回收了;
  • 将Eden区内的没有被回收的对象移动到空的Survivor中;
  • 将有数据的Survivor区中的对象回收了;
  • 将有数据的Survivor区中的复合条件的对象移动到空的Survivor中;
  • 将有数据的Survivor区中的复合条件的对象移动到老年代中。





2.Full GC
  • 一般是老年区满了才会触发FullGC,使用的是Mark-Sweep-Compact的算法:
  • Mark:对有用的引用进行标记;
  • Sweep:对垃圾进行清理;
  • Compact:对活着的对象进行迁移,挪到一块来,解决内存碎片问题。






下面是一些补充的知识

  • JAVA的GC是由一个叫GC的守护线程来完成的;
  • GC在回收一个对象之前会调用这个对象的finalize()方法,给这个对象一个清理垃圾的机会;
  • 开发人员不能在程序里面主动立即发起GC,System.gc()和Runtime.gc()这样的方法是给开发人员想JVM发起一起GC请求的窗口,但调用后不保证JVM什么时候发起GC;
  • JVM在堆内存满了,不能创建对象的时候,会抛出OutOfMemory的错误信息;
  • 字符串对象在永久区创建;
  • FGC会影响程序的性能,让应用程序顿一会。
  • -XX:NewRatio=1:修改新生代和老年代之间的内存比例;
  • -XX:NewSize=1GB:新生代初始大小;
  • -XX:MaxNewSize=1GB:新生代最大值;
  • -Xmx 2GB:堆的最大值;
  • -Xms 2GB:堆的最小值;
  • 上面两个值最好设置为相等。


具体GC调优的文章可以参考

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html


转载请保留本文链接:http://fredlong.iteye.com/blog/1746714
0
1
分享到:
评论

相关推荐

    java内存管理与垃圾回收

    总的来说,Java内存管理和垃圾回收机制是Java平台的基石,它们使得开发者可以专注于编写代码,而不必担心内存管理的细节。理解这些概念对于优化程序性能、避免内存溢出等问题至关重要。通过合理地分配和管理内存,...

    JAVA内存模型与垃圾回收

    JAVA内存模型与垃圾回收是Java开发中至关重要的概念,它们直接影响到程序的性能和稳定性。首先,我们来看看Java内存模型。 Java内存模型,通常被称为JVM内存模型,它定义了程序中不同部分如何访问和共享数据。在...

    java高级之垃圾回收机制

    其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...

    java垃圾回收及内存泄漏.pptx

    ### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:...通过对内存管理的理解和垃圾回收机制的学习,开发者能够更好地编写高效、稳定的Java程序,并有效避免内存泄漏等问题的发生。

    Java中内存泄露及垃圾回收机制.pdf

    4. **垃圾回收触发条件**:Java虚拟机会根据内存使用情况自动触发垃圾回收过程,例如当内存不足时或特定条件下。然而,开发者也可以通过调用`System.gc()`显式请求垃圾回收,但这不是推荐的做法,因为显式调用可能会...

    Java垃圾回收详解

    - **复制算法**:将内存分为大小相等的两块,每次只使用其中一块,在垃圾回收时将存活对象复制到另一块上,然后再把已使用过的内存空间一次性清理掉。这种方法可以避免内存碎片问题,但会浪费一半的可用内存空间。 ...

    java入门、java内存区域和OOM、垃圾回收器和垃圾回收策略

    本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...

    Java中内存泄露及垃圾回收机制参照.pdf

    Java中内存泄露及垃圾回收机制参照 Java是一种可以编写跨平台应用软件的面向对象...Java的垃圾回收机制可以自动回收内存中的垃圾,避免内存泄漏,但是程序员需要注意避免内存泄漏的几点,以确保程序的稳定性和安全性。

    JVM内存分配与垃圾回收详解

    垃圾回收器会定期地对 Java 堆中对象进行扫描,标记出不再使用的对象,并将其回收,以释放出更多的内存空间。 垃圾收集算法 垃圾收集算法是 JVM 中用于垃圾回收的算法,常见的垃圾收集算法有标记-清除算法、复制...

    Java内存与垃圾回收调优.docx

    总的来说,Java内存与垃圾回收调优是一项复杂而细致的工作,需要对JVM内存结构、垃圾回收机制以及相关工具和参数有深入理解。通过合理配置,我们可以显著提升应用性能,避免内存泄漏和长时间的垃圾收集导致的系统...

    Java内存泄露及内存无法回收解决方案

    Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...

    Java内存分配及垃圾回收文章汇总

    本篇将深入探讨Java内存分配策略以及垃圾回收机制,以帮助你更好地理解和解决相关问题。 首先,我们来看JVM的内存结构。在JDK5.0中,JVM的堆内存被分为新生代(Young Generation)、老年代(Tenured Generation)和...

    JVM内存模型以及垃圾回收相关资料

    JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。

    JVM内存管理和垃圾回收

    理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...

    Java垃圾回收机制总结

    Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 垃圾回收机制的算法有多种...

    Java中内存泄露及垃圾回收机制宣贯.pdf

    总之,Java的垃圾回收机制大大降低了内存泄漏的风险,但程序员仍需遵循最佳实践,以确保程序的高效运行和内存的合理使用。理解垃圾回收的工作原理和注意事项,对于编写高质量的Java应用程序至关重要。

    java垃圾回收器代码举例

    - Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的工作原理** - **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态...

Global site tag (gtag.js) - Google Analytics