`
zhang_xzhi_xjtu
  • 浏览: 536846 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

深入理解堆内存和设置GC

阅读更多
JVM通过Ergonomics技术已经尽可能的让jvm不要我们去操心底层的细节,而尝试提供给我们好的服务。
但是,内存管理和gc并没有一个一劳永逸的方案。
GC有可能成为性能的瓶颈。很多时候还是要程序员自己动手去做一些调优。
以下简要介绍一些关键概念。

JVM会自动选择使用server mode还是client mode。但是我们一样可以手工设置。
java -server -client

JVM的内存管理分为堆内存(Heap Memory)和非堆内存。
Heap Memory用来存储大部分对象。
非堆内存=Code Cache+Permanent Generation。
其中Code Cache用于编译和保存本地代码(native code)的内存
Permanent Generation保存虚拟机自己的静态(refective)数据,例如类(class)和方法(method)对象。

经过统计,大部分的内存垃圾都是刚刚new出来的对象产生的,于是,Heap Memory的内存管理是分代的。
JVM的堆内存划分为Young和Tenured。Young里面有1个Eden和2个Survivor,其中一个Survivor永远为空。
按照代的从新到老的顺序:Eden,Survivor,Tenured.

Heap Memory=Eden space+ 2个Survivor space+Tenured space。

为什么Survivor有两个呢.
其中一个一直为空.
大部分对象的分配是在Eden中进行的。当进行一次gc时,可以把Eden和Survivor中的live object复制到那个空的Survivor.

可以用设置标志来查看gc的运行情况.(-verbose:gc)
这个会在console中打出如下信息
[GC 325407K->83000K(776768K), 0.2300771 secs]

GC代表这是一次Minor collection,只回收Young中的对象。
Full GC代表一次Major collection,回收Tenured。

和gc相关的性能指标

Throughput 程序真正运行时间/(程序真正运行时间+GC时间)
Pauses GC导致的程序暂停时间

常见的GC,有多种GC可供我们选择.

serial collector:
单线程GC.

parallel collector:
并行GC,多线程,如果机器是多核的比较适合.
传统的parallel collector同时只能有一个线程作Major collection.
可以引入parallel compaction,多个线程并行做Major collection.

concurrent collector:
该GC大部分的工作都是和程序并行完成的,所以Pauses的时间比较少.
GC时可以同时工作,它的原理是,将一次Major GC的标记回收过程分为多个阶段,除了初始标记阶段与最终标记阶段的执行必须暂停应用之外,其它时间应用线程都可以执行,从而减少GC过程中应用的停顿时间。
concurrent collector有可能会失败。
Concurrent mode failure: CMS回收OldGen空间的速度跟不上OldGen空间的增长速度,或者OldGen过于碎片化。JDK的较早版本存在的BUG也会引发这种类型的失败。
Promotion failure: Minor GC时,OldGen空间不足以容纳新增对象。


如何设置GC.

0 大部分情况不用调用gc,让jvm自己做好了.
1 任何时候都是让jvm先自己选择gc,当性能有问题的时候再手工调.
2 当有Pauses时间要求的时候,尝试concurrent gc.
3 当没有Pauses时间要求时,尝试parallel collector.
4 合理的设置gc的其他参数以及堆的其他参数.
5 不要迷信任何主观的想法,一定要测试,比较,修改,测试,比较,修改...的坐下去,直到性能在合理的期望中.
6 server mode时内存的划分反向了,用jsonsole可以观察到,设置参数时需要注意.

Garbage Collection
vm参数设置

实例:
Geronimo在重复装载一个工程的时候抛java.lang.OutOfMemoryError: PermGen space 异常。
JVM的PermGen内存溢出了。

改动setjavaenv.bat中的设置解决该问题。

set JAVA_OPTS="-Xms512m" "-Xmx512m" "-XX:PermSize=512m" "-XX:MaxPermSize=512m"
分享到:
评论

相关推荐

    深入理解JVM&G1; GC

    总之,《深入理解JVM & G1 GC》这本书为读者提供了理解JVM内存模型和G1 GC的深入见解,有助于Java开发者更好地理解和控制JVM的内存管理,提升应用程序的稳定性和效率。通过学习这些知识,开发者可以解决实际开发中...

    堆内存及JVM内存设置参数 小笔记

    在深入理解堆内存结构及其设置参数之前,我们需要明确几个概念: 1. **堆内存结构**:在Java堆内存中,主要分为两大块:**新生代(Young Generation)** 和 **老年代(Old Generation)**。新生代又分为三个区域:*...

    深入理解JVM & G1 GC

    《深入理解JVM & G1 GC》这篇文章和相关压缩包文件主要聚焦于Java虚拟机(JVM)的内存管理,特别是垃圾收集器(GC)的优化,特别是G1(Garbage-First)垃圾收集器的深度解析。下面将详细阐述JVM、GC的基本概念,...

    Java 内存区域和GC机制

    Java内存区域和垃圾收集(GC)机制是Java...了解并熟练掌握Java内存区域和GC机制对于优化Java应用性能、排查内存问题至关重要。开发者应根据应用需求选择合适的JVM参数和垃圾收集器,并借助相关工具进行监控和调优。

    VisualGC 内存监控工具

    《VisualGC:深入理解JVM内存监控》 VisualGC是一款强大的内存监控工具,它作为JDK1.8中jvisualvm的插件,为Java开发者提供了直观且详细的内存使用情况分析。通过安装并使用VisualGC,我们可以更好地理解和优化Java...

    Java中堆内存和栈内存详解

    Java的内存分配策略主要包括静态分配、栈式分配和堆式分配。其中,栈式分配和堆式分配是运行时动态进行的,具体如下: 1. **栈式存储分配**:栈式存储适用于已知大小的局部变量和方法参数。当一个方法被调用时,JVM...

    JAVA 内存设置原理

    在深入探讨JAVA内存设置原理之前,我们先理解一下JVM(Java虚拟机)的内存管理机制。JVM是JAVA运行时环境的核心,它负责执行JAVA字节码,同时管理程序运行时的内存分配与回收。JVM的内存模型主要由以下几个部分组成...

    IBM 堆内存分析工具

    IBM的这个工具,ha456.jar,可以帮助开发者深入理解应用程序在运行时的内存消耗情况,从而能够有效地提升系统性能并减少资源浪费。 首先,我们要明白什么是堆内存。在Java中,堆内存是程序中所有对象实例的存储区域...

    JVM性能调优-JVM内存整理及GC回收

    这份文档详细阐述了JVM性能调优的关键概念,包括JVM内存模型、垃圾回收(Garbage Collection, GC)的原理以及各种垃圾回收算法,这些都是JAVA程序员在日常工作中需要理解和掌握的核心技术。 首先,JVM内存模型是...

    gcviewer监控gc工具

    GCViewer是基于Java Swing的GUI应用,由Chris Newland开发,它能够解析并可视化JVM生成的GC日志,提供丰富的图表展示GC活动,如GC时间、堆内存使用情况、对象生存周期等,帮助开发者深入了解JVM内部的垃圾收集过程。...

    Java堆内存最佳实践.pdf

    本节主要探讨如何通过GC日志、工具分析来理解和优化Java堆内存的使用。 堆分析对于理解GC行为至关重要。GC(Garbage Collection)是Java自动内存管理的一部分,负责回收不再使用的对象所占用的内存空间。在Java中,...

    Weblogic内存大小配置

    深入了解Weblogic内存管理,可以参考官方文档和社区资源,如BEA官网(现Oracle)的技术文章和论坛讨论。此外,操作系统和JVM的官方文档也提供了关于内存管理和配置的详细指南。 总之,Weblogic内存大小配置与调优是...

    深入理解.NET内存回收机制

    通过对.NET内存回收机制的深入理解,我们可以更好地设计和开发高性能的应用程序。通过合理利用.NET提供的工具和技术,不仅能够避免内存泄漏等问题,还能有效提升应用程序的性能。在未来的技术发展中,.NET将继续优化...

    mac mat jvm gc 内存分析

    通过调整JVM参数,例如设置堆大小、新生代与老年代的比例、GC策略等,可以有效地避免内存溢出和性能瓶颈。 在进行内存分析时,MAT的几个关键功能不容忽视: - Leak Suspects报告:MAT会自动分析heap dump,提供...

    eclipse.ini内存设置各参数含义

    在深入探讨《eclipse.ini内存设置各参数含义》这一主题之前,我们首先应当明确eclipse.ini文件在Eclipse集成开发环境中的重要性及其如何通过调整内存配置参数来优化Eclipse的运行性能。以下是对该主题的详细解析: ...

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java...总的来说,深入理解Java虚拟机内存模型有助于我们更好地设计和优化Java应用程序,避免因内存问题导致的性能瓶颈或系统崩溃。通过学习和实践,我们可以编写出更高效、更稳定的代码。

    Java程序员必须了解的GC工作原理

    GC的工作模式有几种,包括串行GC、并行GC、并发GC和G1 GC。串行GC适用于轻量级应用,它在一个单独的线程中执行GC,可能导致应用暂停。并行GC则在多个线程中同时执行,可以缩短暂停时间但可能增加CPU使用率。并发GC,...

    GCViewer-FullGC分析工具

    《GCViewer:全面解析Java程序Full GC分析工具》 在Java世界中,垃圾收集(Garbage Collection, GC...通过深入理解GCViewer的功能和使用方法,开发者能够更好地诊断和优化Java应用程序的内存性能,提升整体系统效率。

    Java中堆内存和栈内存详解.doc

    ### Java中堆内存和栈内存详解 #### 一、引言 在Java编程语言中,内存管理是一项核心技能。...通过对这两者的深入理解,开发人员可以更好地管理内存资源,避免内存泄漏等问题,从而提高应用程序的整体性能和稳定性。

Global site tag (gtag.js) - Google Analytics