`

java深度-----GC

    博客分类:
  • J2SE
阅读更多
垃圾收集的实现:
1。引用计数:一个A对象,如果有程序使用了这个引用对象,那么引用计数加1,
当一个对象使用完毕之后引用计数减1,那么引用计数为0的时候,则可以回收
他不能识别循环引用

2。跟踪收集
如果A对象引用了B对象,那么虚拟机会记住这个引用路径,同时B对象引用了C对象,那么也会记录这个路径
如果一个对象没有在路径图中,那么可以收集
缺点:需要维护一张引用的全景图,增加了内存开销,和图的遍历开销


3.基于对象跟踪的分代增量收集
基于对象跟踪---说明是由跟踪收集发展而来的,分代是指对堆进行了合理的划分
增量收集:不是每一次全部收集,而是累积的增量收集

Sun的JVM将整个堆分为三代:YoungGen,OldGen和PermGen(持久区),对YoungGen GC
是相对高效和快速的,YoungGen中,经历了若干次的 GC依然存活的对象(说明这些对象使用频率高,
不应该马上回收,所以让他们养老而不是直接干掉),"晋升"到OldGen.内存占用较大的对象,
则直接分配到OldGen(因为这种中型对象肯定不会被马上回收,会占用一定得生存时间,比如一
个数据库连接,我们需要对他进行缓存,需要反复利用,不会马上回收,所以重型对象放到老年
区可以使得他回收更慢),而PermGen 中用于存放长时间存活的对象,如 Class对象基础数据信息,
以及全局应用配置信息

Eden   survivor spaces   virtual
     


-------------Young-----------------
最开始一个对象会放到Young中的Eden,经过一定的时间会被复制到survivor spaces ,有些可能被复制到
年老区,被赋值剩余后的对象会被回收。

细致分析:
年轻区被进一步分为一个Eden区和两个Survior Space,而两个Suriveor Space
在同一时刻,总有一个是空的,这个空的Survivor Space被称为To Space,另外一个则被称为
From Space,在年轻区进行GC时,Eden中存活的对象会被copy到To Space中(大对象直接被拷贝到OldGen),
From Space 中尚不够Old资格的对象也被copy到To Space中,而剩余的则"晋升"到OldGen中。当To Space不足时,
那么本该被拷贝到To Space中的对象则被Tenured(拷贝到了年老对象当中)。。。。这里会带来性能问题哈--因为年老对象
会被认为是不应该轻易回收的,所以考量他回收的条件相对复杂得多,所以对年老对象的回收比对年轻对象的回收耗资源得多,
他甚至会挂起你的应用来收集资源,超卡。。。。。SUN JVM提供了调节Surivor Space大小的参数,当GCLog中出现Tenured字
样时,就可能是Surivor Space不够大造成的。
当年老区没有足够的空间,无法接纳由年轻晋升来的对象,那么YoungGen Collection Algorithm(年轻区算法)将会停止,
整个GC将会进行年老区域算法(因为JVM会认为,年轻区中这时也存在年老对象,当然需要使用年老算法啦)--术语:叫做
"全收集",对于OldGen不能只看其人有空闲就认为其大小已经足够,因为很可能一次年轻区的拷贝就可能触发全收集
小收集:当分配器不能满足分配请求时,先触发一个小收集,他只收集年轻区,因为年轻区的许多对象已经死亡,复制收集器
完全不用分析死亡原因,所以小收集快,高效

下面是阿里的邮件:
Dear all:
       最近在测试环境经常出现应用的jboss进程在运行了一段时间后crash的情况,在应用的jboss日志中出现以下出错信息:
# JRE version: 6.0_18-b07
# Java VM: Java HotSpot(TM) 64-Bit Server VM (16.0-b13 mixed mode linux-amd64 )
# Problematic frame:
# V  [libjvm.so+0x6227df]
#
# An error report file with more information is saved as:
# /home/6080/work/intl-myaliexpress/deploy/hs_err_pid29858.log
#
# If you would like to submit a bug report, please visit:
#    http://java.sun.com/webapps/bugreport/crash.jsp
到底是什么原因导致以上情况的发生呢?那我们就需要查看具体的hs_err_pid29858.log日志文件来找答案了。
  在该文件的第17行有以下信息:
Current thread (0x00000000542e5800):  GCTaskThread [stack: 0x00000000415a1000,0x00000000416a2000] [id=29861]
说明jvm在crash时,执行的是线程是GCTaskThread。
  我们再来看具体出了什么问题,在文件的第251——261行有以下内容:
=>0x00000000542e5800 (exited) GCTaskThread [stack: 0x00000000415a1000,0x00000000416a2000] [id=29861]
VM state:at safepoint (normal execution)
VM Mutex/Monitor currently owned by a thread:  ([mutex/lock_event])
[0x00000000542cddf0] Threads_lock - owner thread: 0x0000000054334800
[0x00000000542ce2f0] Heap_lock - owner thread: 0x00002aab00003000
Heap
PSYoungGen      total 349120K, used 348912K [0x00002aaae46d0000, 0x00002aaaf9c20000, 0x00002aaaf9c20000)
eden space 348672K, 100% used [0x00002aaae46d0000,0x00002aaaf9b50000,0x00002aaaf9b50000)
从上面的日志可以肯定是Young GC的时候发生了异常,导致JVM crash。
在询问了老董和伯虎后,发现这个是JDK1.6.0_18的已知bug,bug report地址:http://bugs.sun.com/view_bug.do?bug_id=6896647
其主要原因是card-marking performance optimization算法在实现的时候有瑕疵,在某些情况下会引起heap corruption。这个情况主要发生在新创建的大对象
和Eden space大小差不多,然后jvm做young GC的时候。                                         
解决方案:在启动参数中增加-XX:-ReduceInitialCardMarks将性能优化策略关闭。


分享到:
评论

相关推荐

    Java深度历险-完整版

    《Java深度历险》是一本全面探讨Java技术的书籍,主要关注Java虚拟机(JVM)的深入理解和相关概念。本书旨在帮助读者不仅掌握Java编程的基本语法,而且能够理解Java平台的工作原理,从而提升编程技能和解决问题的...

    JAVA内存结构-GC-CLASSLOAD

    【JAVA内存结构】 Java内存结构主要分为五个主要区域:堆(JAVA HEAP)、虚拟机栈(JAVA VIRTUAL MACHINE STACKS)、本地方法栈(NATIVE METHOD STACK)、...理解这些内存结构和GC原理对于优化Java应用性能至关重要。

    java深度历险-深入讨论java

    《Java深度历险》是一本面向已有基础的Java程序员的高级读物,旨在帮助读者深入理解Java语言的核心机制和高级特性。这本书涵盖了多个关键知识点,包括但不限于类加载机制、垃圾回收、多线程、并发编程、JVM优化、...

    Java深度历险-让你了解JDK

    《Java深度历险》是一本旨在深入探索JDK和JVM内部运作的书籍,它将带你走过一场关于Java编程语言的精彩旅程。JDK(Java Development Kit)是开发和运行Java应用程序的基础,而JVM(Java Virtual Machine)则是Java...

    GCviewer-1.35 GC分析工具

    GCviewer是一款强大的Java垃圾收集(Garbage Collection,简称GC)分析工具,版本1.35提供了对Java应用程序内存管理的深度洞察。它可以帮助开发者理解、优化和调试应用程序的内存行为,从而提升性能,避免内存泄漏等...

    用于测试jvm gc调优-share-jvm-gc.zip

    通过上述方法,我们可以对JVM的GC进行深度调优,以提高系统的整体性能和稳定性。这个"share-jvm-gc"项目很可能是为了提供一个实践和学习这些知识的平台,通过实践来加深理解和掌握JVM GC调优的技巧。

    GC-PowerStation.rar

    GC-PowerStation是一个专门针对Java垃圾收集进行深度分析和性能优化的工具或框架,通过这个名字我们可以推测,它可能提供了强大的功能来帮助开发者理解和优化Java应用的内存行为。 首先,让我们了解什么是Java垃圾...

    Java深度历险

    《Java深度历险》这本书是为那些希望深入了解Java平台运行机制的初学者和有经验的开发者准备的。它深入探讨了Java技术的核心概念,揭示了Java如何在幕后工作,帮助读者提升对Java语言的理解和应用能力。 1. **Java...

    Java-In-A-Nutshell-5th-Edition(2)

    《Java实战精华——第五版》是一部深度探讨Java编程语言的经典著作。这本书涵盖了Java语言的核心概念、语法、工具和最佳实践,旨在帮助读者快速掌握并深入理解Java编程。 1. **Java语言基础** - 类与对象:Java是...

    java深度历险+深入java虚拟机

    《Java深度历险》与《深入Java虚拟机》是两本深受Java开发者喜爱的经典书籍,它们涵盖了Java编程语言和Java虚拟机(JVM)的高级主题,旨在帮助读者深入理解Java平台的工作原理。 《Java深度历险》这本书通常会涵盖...

    从源码的角度探索Java中间件-Tomcat & Jetty的深度反汇编

    JVMGC原理及调优的基本思路: 如何监控Tomcat的性能? Tomcat线程池和I/O的并发调优 Tomcat的内存溢出原因分析及调优 Tomcat拒绝连接原因分析及网络优化 Tomcat进程占用CPU过高怎么办 谈谈Jetty性能调优的思路 热点...

    java -jvm 内存分配和jvm调优

    6. G1收集器:Java 9及以上版本推荐使用G1收集器,它能实现低延迟和高吞吐,可以通过-XX:+UseG1GC启用。 7. 对象晋升策略:通过-XX:PretenureSizeThreshold参数可以设置直接晋升到老年代的对象大小阈值。 8. 栈...

    java面试——深圳-OPPO-Java高级.zip

    - 垃圾收集:不同GC算法(如Serial、Parallel、CMS、G1、ZGC),GC日志分析,调优策略。 - 内存调优:堆大小调整,新生代与老年代比例,方法区设置等。 8. **模块化与微服务**: - JAR、WAR打包方式,以及Spring...

    Java 面试宝典 - v1.1

    《Java面试宝典》是为Java开发者准备的一份详尽的面试指南,旨在帮助...通过学习《Java面试宝典》,你将系统地掌握上述知识,从而在面试中自信应对,展示出你的专业技能和深度理解,为自己的职业生涯打开更广阔的道路。

    深入java虚拟机 中文版 pdf

    《深入Java虚拟机》这本书是IT领域中关于Java虚拟机(JVM)的深度解析之作,主要聚焦于JVM的工作原理、内部结构以及优化技巧。Java虚拟机作为Java语言的核心组件,其性能直接影响到Java应用程序的运行效率。因此,对...

    Java性能调优--关于垃圾回收机制的分析和指导

    Java性能调优,特别是关于垃圾回收...总结来说,Java性能调优中的垃圾回收机制分析是一项深度工作,需要深入理解JVM的内存管理,识别并避免内存泄漏,以及合理调整垃圾收集策略,以实现更高效、更稳定的Java应用程序。

    jvisualvm 插件集合

    DTrace是Solaris操作系统的一个强大性能分析工具,该插件使得jVisualVM能够支持DTrace脚本,从而在Java应用中实现系统级别的深度性能分析。 7. **Glassfish插件(net-java-visualvm-modules-glassfish.nbm)** ...

    java-jdk源码学习

    Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。...这是一场深度技术探索之旅,也是成为一名杰出Java开发者的必经之路。

    JAVA深度历险.rar

    《JAVA深度历险》这本书是Java开发者的一本深入学习指南,它旨在揭示Java语言的内在机制和高级特性,帮助读者从底层理解Java的工作原理。在Java编程的世界里,深度理解和熟练掌握这些知识点对于提升开发效率、优化...

    《java 深度历险》

    《Java深度历险》这本书是Java开发者深入了解Java平台和其内在机制的重要参考资料。它涵盖了从JDK(Java Development Kit)的基础到Java底层运行原理的广泛主题。以下是一些关键的知识点,这些知识点可以帮助读者...

Global site tag (gtag.js) - Google Analytics