`

堆内存和设置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.

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

相关推荐

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

    接着,文档介绍了堆内存的监控和设置参数: 1. **堆内存设置参数**:包括Xmx(堆最大可用内存,默认是本地机器物理内存的1/4)、Xms(堆初始内存,默认是本地机器物理内存的1/64)。 2. **新生代(Young)设置**:...

    Java 内存区域和GC机制

    - **GC触发条件**:当堆内存不足时,或者系统调用System.gc()时(不推荐)。 - **GC类型**:主要分为Minor GC(年轻代GC)、Major GC(老年代GC)和Full GC(全局GC)。 - **GC策略**:包括复制算法、标记-清除...

    VisualGC 内存监控工具

    VisualGC插件主要关注的是堆内存的使用情况,特别是新生代和老年代的动态变化。它能够实时展示以下关键指标: 1. **堆内存大小**:显示堆的总容量,以及已分配和剩余的空间。 2. **对象分配**:追踪对象在新生代和...

    Java中堆内存和栈内存详解

    - **垃圾回收**:Java虚拟机(JVM)会自动管理堆内存,通过垃圾回收机制(Garbage Collection, GC)来回收不再被引用的对象所占用的空间。 #### 四、内存分配策略 Java的内存分配策略主要包括静态分配、栈式分配和...

    HBase堆外内存测试

    在实验中,主机A和主机B均配置了相同的HBase堆内存总量,为8000M。对于主机B,通过合理的配置使得堆内和堆外内存结合使用,既能充分利用内存资源,又能避免频繁的GC操作对性能的影响。 ##### 配置参数示例 - 主机A...

    内存管理,GC机制,内存释放过程

    自动内存管理和GC机制: 在原始程序中,堆的内存分配是找到第一个有足够空间的内存地址,然后将该内存分配。当程序不再需要此内存中的信息时,程序员需要手动将此内存释放。堆的内存是公用的,也就是说所有进程都有...

    JAVA 内存设置原理

    本文将重点讨论堆内存的设置与管理。 #### 一、堆内存(Heap) 堆内存是JVM用来存储对象实例和数组的地方,它是JVM管理的最大块内存区域。堆内存可以被细分为三个主要区域:新生代(Young Generation)、老年代...

    weblogic内存调优

    默认情况下,JVM会根据物理内存的一定比例分配堆内存,例如-Xms设置为物理内存的1/64,-Xmx设置为物理内存的1/4。当堆内存空闲空间低于40%时,JVM会尝试扩大堆到-Xmx的上限,而当空闲空间超过70%时,会缩小到-Xms的...

    JVM垃圾回收机制与GC性能调优

    本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...

    IBM 堆内存分析工具

    IBM堆内存分析工具是针对Java应用程序进行性能优化和问题排查的重要辅助工具,它主要用于诊断IBM Java虚拟机(JVM)中的内存泄漏、过度分配等问题。IBM的这个工具,ha456.jar,可以帮助开发者深入理解应用程序在运行...

    优化Java堆内存大小的五个技巧

    你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆内存和最大堆内存。例如,`-Xms256m -Xmx1024m`将初始堆设置为256MB,最大堆设置为1024MB。 2. **监控应用内存消耗**:使用工具如VisualVM或JConsole来实时监控...

    JVM初探- 内存分配、GC原理与垃圾收集器

    分代收集算法是目前主流的收集方式,它将堆内存分为新生代和老年代,根据对象的存活周期不同,采用不同的收集策略。新生代采用复制算法,因为大部分对象很快就会变为垃圾,复制算法可以高效地回收这些对象。而老年代...

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

    它主要分为堆内存和栈内存两大部分。堆内存用于存储对象实例,而栈内存则处理方法调用时的局部变量。除此之外,JVM内存还包括方法区(存放类信息)、程序计数器(记录当前线程执行的指令地址)和本地方法栈(为JNI...

    C#中实现内存回收

    .NET中的内存分为堆和栈两部分。栈主要用于存储基本类型和引用,而堆则用于存储对象实例。当创建一个对象时,它的引用会被放在栈上,而对象本身则在堆上分配空间。垃圾回收主要关注堆上的内存。 垃圾回收的工作原理...

    mac mat jvm gc 内存分析

    MAT(Memory Analyzer Tool)是由Eclipse基金会提供的一个强大的分析工具,专门用于分析Java堆内存,帮助开发者诊断和解决内存相关的问题。本文将深入探讨MAT的使用、JVM GC的工作原理以及如何进行Mac环境下的内存...

    gcviewer监控gc工具

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

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

    JVM的内存主要分为堆内存(Heap)和非堆内存(Non-heap)。堆内存用于存储对象实例和数组,而非堆内存则包含类信息、常量池、静态变量等数据。 ### 2. 堆内存管理参数 #### -Xms 和 -Xmx 参数 - `-Xms` 参数用于...

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

    Java编程语言将内存分为两种主要区域:栈内存(Stack Memory)和堆内存(Heap Memory),这两种内存区域在程序执行过程中扮演着不同的角色。 栈内存主要用来存储程序运行过程中的基本类型变量(如int、char、...

Global site tag (gtag.js) - Google Analytics