作者:黄湘龙
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
分享到:
相关推荐
总的来说,Java内存管理和垃圾回收机制是Java平台的基石,它们使得开发者可以专注于编写代码,而不必担心内存管理的细节。理解这些概念对于优化程序性能、避免内存溢出等问题至关重要。通过合理地分配和管理内存,...
JAVA内存模型与垃圾回收是Java开发中至关重要的概念,它们直接影响到程序的性能和稳定性。首先,我们来看看Java内存模型。 Java内存模型,通常被称为JVM内存模型,它定义了程序中不同部分如何访问和共享数据。在...
其中,垃圾回收机制(Garbage Collection, GC)是Java虚拟机(JVM)的一项重要特性,它能够自动检测并回收不再使用的对象占用的内存空间,从而有效避免了内存泄漏问题。本文将详细介绍Java中的垃圾回收机制及其工作原理...
### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:...通过对内存管理的理解和垃圾回收机制的学习,开发者能够更好地编写高效、稳定的Java程序,并有效避免内存泄漏等问题的发生。
4. **垃圾回收触发条件**:Java虚拟机会根据内存使用情况自动触发垃圾回收过程,例如当内存不足时或特定条件下。然而,开发者也可以通过调用`System.gc()`显式请求垃圾回收,但这不是推荐的做法,因为显式调用可能会...
- **复制算法**:将内存分为大小相等的两块,每次只使用其中一块,在垃圾回收时将存活对象复制到另一块上,然后再把已使用过的内存空间一次性清理掉。这种方法可以避免内存碎片问题,但会浪费一半的可用内存空间。 ...
本教程将涵盖Java的基础知识,特别是关于内存管理的重要概念——Java内存区域、Out of Memory (OOM)错误以及垃圾回收器和垃圾回收策略。 1. **Java入门**: Java的学习始于基础语法,包括变量、数据类型、运算符、...
Java中内存泄露及垃圾回收机制参照 Java是一种可以编写跨平台应用软件的面向对象...Java的垃圾回收机制可以自动回收内存中的垃圾,避免内存泄漏,但是程序员需要注意避免内存泄漏的几点,以确保程序的稳定性和安全性。
垃圾回收器会定期地对 Java 堆中对象进行扫描,标记出不再使用的对象,并将其回收,以释放出更多的内存空间。 垃圾收集算法 垃圾收集算法是 JVM 中用于垃圾回收的算法,常见的垃圾收集算法有标记-清除算法、复制...
总的来说,Java内存与垃圾回收调优是一项复杂而细致的工作,需要对JVM内存结构、垃圾回收机制以及相关工具和参数有深入理解。通过合理配置,我们可以显著提升应用性能,避免内存泄漏和长时间的垃圾收集导致的系统...
Java内存管理是编程中至关重要的一个环节,尤其是对于大型、长时间运行的应用来说,内存泄漏和内存无法回收可能导致系统性能下降,甚至导致系统崩溃。本文将深入探讨Java内存泄露的原理,分析内存无法回收的原因,并...
本篇将深入探讨Java内存分配策略以及垃圾回收机制,以帮助你更好地理解和解决相关问题。 首先,我们来看JVM的内存结构。在JDK5.0中,JVM的堆内存被分为新生代(Young Generation)、老年代(Tenured Generation)和...
JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。
理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...
Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 垃圾回收机制的算法有多种...
总之,Java的垃圾回收机制大大降低了内存泄漏的风险,但程序员仍需遵循最佳实践,以确保程序的高效运行和内存的合理使用。理解垃圾回收的工作原理和注意事项,对于编写高质量的Java应用程序至关重要。
- Java内存管理的核心是对象生命周期的管理,当一个对象不再被引用时,垃圾回收器会将其占用的内存空间回收。 2. **垃圾回收器的工作原理** - **可达性分析**:垃圾回收器通过一系列称为“根”(如局部变量、静态...