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可以观察到,设置参数时需要注意.
分享到:
相关推荐
接着,文档介绍了堆内存的监控和设置参数: 1. **堆内存设置参数**:包括Xmx(堆最大可用内存,默认是本地机器物理内存的1/4)、Xms(堆初始内存,默认是本地机器物理内存的1/64)。 2. **新生代(Young)设置**:...
- **GC触发条件**:当堆内存不足时,或者系统调用System.gc()时(不推荐)。 - **GC类型**:主要分为Minor GC(年轻代GC)、Major GC(老年代GC)和Full GC(全局GC)。 - **GC策略**:包括复制算法、标记-清除...
VisualGC插件主要关注的是堆内存的使用情况,特别是新生代和老年代的动态变化。它能够实时展示以下关键指标: 1. **堆内存大小**:显示堆的总容量,以及已分配和剩余的空间。 2. **对象分配**:追踪对象在新生代和...
- **垃圾回收**:Java虚拟机(JVM)会自动管理堆内存,通过垃圾回收机制(Garbage Collection, GC)来回收不再被引用的对象所占用的空间。 #### 四、内存分配策略 Java的内存分配策略主要包括静态分配、栈式分配和...
自动内存管理和GC机制: 在原始程序中,堆的内存分配是找到第一个有足够空间的内存地址,然后将该内存分配。当程序不再需要此内存中的信息时,程序员需要手动将此内存释放。堆的内存是公用的,也就是说所有进程都有...
本文将重点讨论堆内存的设置与管理。 #### 一、堆内存(Heap) 堆内存是JVM用来存储对象实例和数组的地方,它是JVM管理的最大块内存区域。堆内存可以被细分为三个主要区域:新生代(Young Generation)、老年代...
默认情况下,JVM会根据物理内存的一定比例分配堆内存,例如-Xms设置为物理内存的1/64,-Xmx设置为物理内存的1/4。当堆内存空闲空间低于40%时,JVM会尝试扩大堆到-Xmx的上限,而当空闲空间超过70%时,会缩小到-Xms的...
本文主要探讨JVM堆内存的结构和GC的工作原理,以及如何进行性能调优。 JVM堆是Java应用程序的主要内存区域,用于存储所有类实例和数组。它分为三个主要区域:新域(Young Generation)、旧域(Old Generation)和...
IBM堆内存分析工具是针对Java应用程序进行性能优化和问题排查的重要辅助工具,它主要用于诊断IBM Java虚拟机(JVM)中的内存泄漏、过度分配等问题。IBM的这个工具,ha456.jar,可以帮助开发者深入理解应用程序在运行...
你可以通过JVM启动参数-Xms和-Xmx来分别设置初始堆内存和最大堆内存。例如,`-Xms256m -Xmx1024m`将初始堆设置为256MB,最大堆设置为1024MB。 2. **监控应用内存消耗**:使用工具如VisualVM或JConsole来实时监控...
分代收集算法是目前主流的收集方式,它将堆内存分为新生代和老年代,根据对象的存活周期不同,采用不同的收集策略。新生代采用复制算法,因为大部分对象很快就会变为垃圾,复制算法可以高效地回收这些对象。而老年代...
在实验中,主机A和主机B均配置了相同的HBase堆内存总量,为8000M。对于主机B,通过合理的配置使得堆内和堆外内存结合使用,既能充分利用内存资源,又能避免频繁的GC操作对性能的影响。 ##### 配置参数示例 - 主机A...
它主要分为堆内存和栈内存两大部分。堆内存用于存储对象实例,而栈内存则处理方法调用时的局部变量。除此之外,JVM内存还包括方法区(存放类信息)、程序计数器(记录当前线程执行的指令地址)和本地方法栈(为JNI...
.NET中的内存分为堆和栈两部分。栈主要用于存储基本类型和引用,而堆则用于存储对象实例。当创建一个对象时,它的引用会被放在栈上,而对象本身则在堆上分配空间。垃圾回收主要关注堆上的内存。 垃圾回收的工作原理...
MAT(Memory Analyzer Tool)是由Eclipse基金会提供的一个强大的分析工具,专门用于分析Java堆内存,帮助开发者诊断和解决内存相关的问题。本文将深入探讨MAT的使用、JVM GC的工作原理以及如何进行Mac环境下的内存...
GCViewer是基于Java Swing的GUI应用,由Chris Newland开发,它能够解析并可视化JVM生成的GC日志,提供丰富的图表展示GC活动,如GC时间、堆内存使用情况、对象生存周期等,帮助开发者深入了解JVM内部的垃圾收集过程。...
JVM的内存主要分为堆内存(Heap)和非堆内存(Non-heap)。堆内存用于存储对象实例和数组,而非堆内存则包含类信息、常量池、静态变量等数据。 ### 2. 堆内存管理参数 #### -Xms 和 -Xmx 参数 - `-Xms` 参数用于...
Java编程语言将内存分为两种主要区域:栈内存(Stack Memory)和堆内存(Heap Memory),这两种内存区域在程序执行过程中扮演着不同的角色。 栈内存主要用来存储程序运行过程中的基本类型变量(如int、char、...
堆内存主要存放对象实例,其大小直接影响了垃圾收集(GC)的频率和效率。本节主要探讨如何通过GC日志、工具分析来理解和优化Java堆内存的使用。 堆分析对于理解GC行为至关重要。GC(Garbage Collection)是Java自动...