如何区分垃圾
上面说到的“引用计数”法,通过统计控制生成对象和删除对象时的引用数来判断。垃圾回收程序收集计数为0的对象即可。但是这种方法无法解决循环引用。所以,后来实现的垃圾判断算法中,都是从程序运行的根节点出发,遍历整个对象引用,查找存活的对象。那么在这种方式的实现中,垃圾回收从哪儿开始的呢?即,从哪儿开始查找哪些对象是正在被当前系统使用的。上面分析的堆和栈的区别,其中栈是真正进行程序执行地方,所以要获取哪些对象正在被使用,则需要从Java栈开始。同时,一个栈是与一个线程对应的,因此,如果有多个线程的话,则必须对这些线程对应的所有的栈进行检查。
同时,除了栈外,还有系统运行时的寄存器等,也是存储程序运行数据的。这样,以栈或寄存器中的引用为起点,我们可以找到堆中的对象,又从这些对象找到对堆中其他对象的引用,这种引用逐步扩展,最终以null引用或者基本类型结束,这样就形成了一颗以Java栈中引用所对应的对象为根节点的一颗对象树,如果栈中有多个引用,则最终会形成多颗对象树。在这些对象树上的对象,都是当前系统运行所需要的对象,不能被垃圾回收。而其他剩余对象,则可以视为无法被引用到的对象,可以被当做垃圾进行回收。
因此,垃圾回收的起点是一些根对象(java栈, 静态变量, 寄存器...)。而最简单的Java栈就是Java程序执行的main函数。这种回收方式,也是上面提到的“标记-清除”的回收方式
如何处理碎片
由于不同Java对象存活时间是不一定的,因此,在程序运行一段时间以后,如果不进行内存整理,就会出现零散的内存碎片。碎片最直接的问题就是会导致无法分配大块的内存空间,以及程序运行效率降低。所以,在上面提到的基本垃圾回收算法中,“复制”方式和“标记-整理”方式,都可以解决碎片的问题。
如何解决同时存在的对象创建和对象回收问题
垃圾回收线程是回收内存的,而程序运行线程则是消耗(或分配)内存的,一个回收内存,一个分配内存,从这点看,两者是矛盾的。因此,在现有的垃圾回收方式中,要进行垃圾回收前,一般都需要暂停整个应用(即:暂停内存的分配),然后进行垃圾回收,回收完成后再继续应用。这种实现方式是最直接,而且最有效的解决二者矛盾的方式。
但是这种方式有一个很明显的弊端,就是当堆空间持续增大时,垃圾回收的时间也将会相应的持续增大,对应应用暂停的时间也会相应的增大。一些对相应时间要求很高的应用,比如最大暂停时间要求是几百毫秒,那么当堆空间大于几个G时,就很有可能超过这个限制,在这种情况下,垃圾回收将会成为系统运行的一个瓶颈。为解决这种矛盾,有了并发垃圾回收算法,使用这种算法,垃圾回收线程与程序运行线程同时运行。在这种方式下,解决了暂停的问题,但是因为需要在新生成对象的同时又要回收对象,算法复杂性会大大增加,系统的处理能力也会相应降低,同时,“碎片”问题将会比较难解决。
原文:http://www.iteye.com/wiki/jvm/2862-JVM
发表评论
-
通过Java/JMX得到full GC次数?
2011-01-21 11:51 1308今天有个同事问如何能 ... -
深入理解JVM
2011-01-21 11:50 6761 Java技术与Java虚拟机 说起Java,人 ... -
JVM调优总结(十二)-参考资料
2011-01-21 11:49 810能整理出上面一些东西,也是因为站在巨人的肩上。下面是一 ... -
JVM调优总结(十)-调优方法
2011-01-21 11:49 676JVM调优工具 Jconsole,jProfile,Vi ... -
JVM调优总结(九)-新一代的垃圾回收算法
2011-01-21 11:48 777垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度 ... -
JVM调优总结(八)-典型配置举例2
2011-01-21 11:47 755常见配置汇总 堆设置 -Xms:初始堆 ... -
JVM调优总结(七)-典型配置举例1
2011-01-21 11:47 761以下配置主要针对分代垃圾回收算法而言。 堆大 ... -
JVM调优总结(六)-分代垃圾回收详述2
2011-01-21 11:46 821分代垃圾回收流程示意 ... -
JVM调优总结(五)-分代垃圾回收详述1
2011-01-21 11:46 645为什么要分代 分代的垃圾回收策略,是基于这样一个事实 ... -
JVM调优总结(三)-基本垃圾回收算法
2011-01-21 11:44 694可以从不同的的角 ... -
JVM内存管理:深入垃圾收集器与内存分配策略
2011-01-21 11:43 886Java与C++之间有一堵由内存动态分配和垃圾收集技术所围 ... -
JVM内存管理:深入Java内存区域与OOM
2011-01-21 11:43 611Java与C++之间有一堵由内存动态分配和垃圾收集技 ... -
java线程安全总结
2011-01-21 11:42 646最近想将java基础 ... -
慢慢琢磨JVM——恭喜JavaEye重新开张
2011-01-21 11:40 7401 JVM简介 JVM是我们Javaer的最基本功底了, ... -
JVM 几个重要的参数
2011-01-21 11:37 906<本文提供的设置仅仅是在高压力, 多CPU, 高内存环境 ... -
JVM调优总结(二)-一些概念
2011-01-21 11:36 744Java对象的大小 基 ... -
JVM调优总结(一)-- 一些概念
2011-01-21 11:31 608转:http://www.iteye.com/wiki ...
相关推荐
垃圾回收面临的问题包括处理速度、暂停时间和内存碎片等问题。 在典型配置举例部分,文档提供了实例来说明如何设置JVM参数来优化垃圾回收和内存分配。此外,文档还提到了新一代垃圾回收算法,例如G1垃圾回收器,它...
JVM调优的目的是为了提升应用程序的性能,减少垃圾回收(GC)对程序运行的影响,优化内存的使用。在JVM调优中,垃圾回收的算法和策略是非常关键的部分。基本的垃圾回收算法包括标记-清除算法、复制算法、标记-整理算法...
本总结旨在分享作者在实践中不断探索与总结的经验,为读者提供一份全面而实用的JVM调优指南。 #### 关键知识点 ##### 1. JVM基础知识 - **JVM结构与工作原理**:了解JVM的基本组成及其工作流程对于进行有效的性能...
总结起来,高并发系统下的JVM调优涉及对内存管理的深入理解、性能监控工具的运用、垃圾回收机制的掌握以及JVM参数的精细调整。架构师需要不断学习和实践,才能在系统架构设计中有效地运用这些知识,确保系统在大促...
总结来说,莫枢在Qcon2011杭州的演讲揭示了淘宝在JVM优化上的深度实践,包括但不限于内存管理、类加载、垃圾回收、性能监控等方面。这些经验对于任何使用Java技术栈的大型企业来说都具有极高的参考价值,提醒我们...
优化JVM可以减少程序的启动时间,提高响应速度,减少内存消耗,以及避免因垃圾回收引起的暂停时间过长等问题。 以下是一些可能涵盖在文档中的JVM优化关键知识点: 1. **内存管理**:包括堆内存(新生代、老年代、...
- 调整JVM的垃圾回收策略,例如通过`-verbose:gc`参数开启垃圾回收的日志记录。 - 分析GC日志,根据应用的特点调整垃圾回收策略。 - 使用工具如VisualVM来分析GC日志,以便更好地理解垃圾回收的行为。 #### 四、...
在了解这些垃圾回收器的基础上,面试者还应当掌握垃圾回收中的性能调优、内存分配策略、以及如何监控垃圾回收的性能指标等。 这些知识点不仅对于通过面试至关重要,对于理解Go语言在实际开发中所面临的内存管理问题...
- `-XX:+UseParallelGC`或`-XX:+UseG1GC`: 根据系统资源和应用特点选择合适的垃圾回收策略。 以上JVM参数需要根据服务器硬件资源和应用特性进行合理设置。 4. **负载均衡和集群** 对于大型企业级应用,仅靠...
- **调优策略**:监控内存使用情况、调整垃圾回收策略、减少内存碎片等。 - **工具与技术**:使用JConsole、VisualVM等工具进行性能分析。 **知识点十二:MySQL事务隔离级别** - **隔离级别种类**:读未提交、读已...
- JVM中的引用类型包括强引用、软引用、弱引用和虚引用,其中软引用可以帮助加速垃圾回收过程。 - **GC分代回收机制**: - 堆被分为Young(年轻代)、Tenured(年老代)和Perm(持久代)。 - 不同类型的垃圾收集...
进一步检查WebSphere的`native_stderr.log`文件,我们发现内存溢出的原因在于Java堆内存被Java对象完全占用,且垃圾回收(Garbage Collection,简称GC)机制无法有效清理,导致新内存空间的分配失败。 ##### Java...
- JVM调优涉及堆大小设置、垃圾回收策略调整、方法区配置等,目标是提升应用性能并减少停顿时间。 12. **Java 8及以后的新特性** - Lambda表达式:简化匿名函数的编写。 - Stream API:提供一种新的数据处理方式...
5. **垃圾回收(GC)优化**:调整JVM的垃圾回收参数,减少GC停顿时间。 总的来说,HDFS的容错机制保证了系统的稳定运行,而有效的调优策略则能进一步提升其性能和效率。在大数据环境中,理解并掌握这些知识点对于...
同时需要注意,过大的堆内存会导致更长的垃圾回收时间,从而影响性能。 #### 三、本地I/O与TCP连接调整 **1. Accept Backlog** - **定义**:Accept Backlog属性指定了服务器向操作系统请求的连接队列的大小。 - *...