`

JVM--内存管理和垃圾回收

    博客分类:
  • jvm
 
阅读更多
一。内存管理
JVM管理两种类型的内存,堆(Heap)和非堆(Non-Heap);
堆是在JVM启动时创建;非堆是留给JVM自己用的,用来存放类的信息的。
它和堆不同,运行期内GC不会释放空间
1)堆
过new创建的对象的内存都在堆中分配,大小通过-Xmx和-Xms来控制。
堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区;
•新生代。新建的对象都是用新生代分配内存,Eden空间不足的时候,
 会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,
 也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
•旧生代。用于存放新生代中经过多次垃圾回收仍然存活的对象

2)非堆
方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、
每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中

非堆分为永久代(Permanent Generation)及Code Cache
JVM用持久代(Permanet Generation)来存放方法区,,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值
存放了要加载的类(class)信息、静态变量、final类型的常量、属性和方法信息



二。垃圾回收

垃圾回收的时间分别在:程序线程空闲;另一个是java内存堆不足时

JVM分别对新生代和旧生代采用不同的垃圾回收机制

1)新生代gc
新生代通常存活时间较短,因此基于Copying算法来进行回收,所谓Copying算法就是扫描出存活的对象,
并复制到一块新的完全未使用的空间中,对应于新生代,就是在Eden和From Space或To Space之间copy。
新生代采用空闲指针的方式来控制GC触发,指针保持最后一个分配的对象在新生代区间的位置,当有新的对象要分配内存时,
用于检查空间是否足够,不够就触发GC。当连续分配对象时,对象会逐渐从eden到survivor,最后到旧生代,

2)旧生代gc
旧生代与新生代不同,对象存活的时间比较长,
比较稳定,因此采用标记(Mark)算法来进行回收,
所谓标记就是扫描出存活的对象,然后再进行回收未被标记的对象,
回收后对用空出的空间要么进行合并,要么标记出来便于下次进行分配,
总之就是要减少内存碎片带来的效率损耗

3)为了不影响系统的吞吐量,特别关注Full GC(全局垃圾回收),Full GC一般是由
生代空间不足
调优时尽量让对象在新生代GC时被回收、让对象在新生代多存活一段时间和不要创建过大的对象及数组避免直接在旧生代创建对象 
 •Pemanet Generation空间不足
增大Perm Gen空间,避免太多静态对象 
 •统计得到的GC后晋升到旧生代的平均大小大于旧生代剩余空间
控制好新生代和旧生代的比例 
 •System.gc()被显示调用

内存设置原则:
内存限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),
而64bit以上的处理器就不会有限制了,内存并不是越大越好,如果过大,full gc的时间过长影响系统
这就是为什么系统正常而访问停顿,这个时间在进行垃圾回收。
例子:
JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=6970 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Xms1400m -Xmx2000m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true -Dfile.encoding=UTF-8" 
注意一下情况:
 1)新生代设置过小
一是新生代GC次数非常频繁,增大系统消耗;二是导致大对象直接进入旧生代,占据了旧生代剩余空间,诱发Full GC
2)新生代设置过大
 
一是新生代设置过大会导致旧生代过小(堆总量一定),从而诱发Full GC;二是新生代GC耗时大幅度增加
 
一般说来新生代占整个堆1/3比较合适
 
3)Survivor设置过小
 
导致对象从eden直接到达旧生代,降低了在新生代的存活时间
 
4)Survivor设置过大
 
导致eden过小,增加了GC频率
附:
   几种常见的错误
   1.java.lang.OutOfMemoryError: PermGen space
   非堆是用来存放类的信息的。它和堆不同,运行期内GC不会释放空间。
   如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,
   超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,
   只会将context更改为新部署的,非堆存的内容就会越来越多。
   2.java.lang.OutOfMemoryError: Javaheap space
   当java内存堆不足时,会不断调用GC,若连续回收都解决不了内存堆不足的问题时,就会报out of memory错误



查看jvm
   C:\Documents and Settings\Administrator>jconsole
   service:jmx:rmi:///jndi/rmi://192.168.150.102:6969/jmxrmi

  • 大小: 1.4 KB
分享到:
评论

相关推荐

    JVM-内存管理 2012-12.pdf

    JVM内存管理是Java平台的一个重要特性,其内存空间的分配和回收机制对Java应用程序的性能和稳定性有着至关重要的影响。 首先,JVM内存管理涉及的内存空间主要分为方法区(Method Area)、堆(Heap)、本地方法栈...

    JVM--内存与垃圾回收篇1

    Java虚拟机(JVM)是Java程序运行的核心,它的内存管理和垃圾回收机制对于程序的高效运行至关重要。在本文中,我们将深入探讨JVM的类加载子系统及其在内存管理中的作用。 类加载子系统,也被称为Class Loader ...

    03-VIP-JVM内存分配机制与垃圾回收算法1

    Java虚拟机(JVM)内存分配机制和垃圾回收(Garbage Collection, GC)是Java编程中的核心概念,它们直接影响到程序的性能和稳定性。本文主要围绕JVM内存区域的分配策略,尤其是对象在新生代(Young Generation)的...

    JVM内存管理和垃圾回收

    理解JVM内存管理和垃圾回收机制对于优化Java应用程序性能至关重要,开发者可以通过调整JVM参数来定制适合应用需求的内存配置和垃圾回收策略。例如,设置新生代和老年代的大小、选择合适的垃圾回收器、设定最大暂停...

    jvm-mon基于控制台的JVM监视

    2. **GC活动追踪**:它会记录垃圾收集器的活动,如Minor GC和Major GC的触发次数、耗时,有助于理解垃圾回收对性能的影响。 3. **线程状态**:`jvm-mon`可展示当前运行的线程数量及状态,如RUNNABLE、WAITING、...

    JVM历史发展和内存回收笔记

    本文将详细探讨JVM的发展历程以及内存管理中的垃圾回收机制。 一、JVM的历史发展 1. **早期阶段**:1995年,Sun Microsystems发布了Java的第一个版本,JVM作为其核心组成部分,主要应用于嵌入式设备和网络应用。初...

    JVM内存分配与垃圾回收详解

    JVM 内存分配与垃圾回收详解 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,它提供了一个平台独立的方式来执行 Java 字节码。JVM 内存分配与垃圾回收是 JVM 中两个非常重要的概念,本文将对 JVM 内存分配与垃圾...

    JVM内存模型以及垃圾回收相关资料

    JVM内存模型与垃圾回收是...总的来说,理解JVM内存模型和垃圾回收机制对于优化Java应用性能至关重要,它涉及到内存分配策略、垃圾收集算法的选择以及内存参数的调整,这些都需要开发者具备深入的JVM知识和实践经验。

    weilei-JVM-ppt.rar

    3. **内存管理**:详细讲解堆内存、栈内存、方法区、程序计数器、本地方法栈等区域的分配与回收,特别是垃圾收集机制,如分代收集、标记-清除、复制算法、标记-整理、CMS和G1等。 4. **字节码执行**:解释字节码...

    jvm性能调优-jvm内存模型和优化-performance-jvm-memorymodel-optimize.zip

    JVM内存模型的理解和优化,对于解决性能瓶颈、避免内存泄漏以及提高系统稳定性至关重要。本文将详细探讨JVM的内存结构,以及如何进行有效的调优。 一、JVM内存结构 1. **程序计数器(Program Counter Register)**...

    JVM入门实战/arthas实战/垃圾回收算法/垃圾回收器/jvm内存模型分析

    第二节:JVM内存模型 1.1 概念 1.2 JVM内存模型 1.3 Heap堆内存模型 第三节:定位垃圾对象的依据 1.1 引用计数法 1.2 可达性算法 第四节:垃圾回收算法 1.1标记清除算法 1.2复制算法 1.3 标记整理(标记压缩)...

    JVM内存管理和JVM垃圾回收

    理解JVM内存管理和垃圾回收机制对于优化Java应用的性能至关重要。开发者可以根据应用的需求和特点,通过调整JVM参数来选择合适的内存配置和垃圾回收策略。同时,使用如JVisualVM等工具进行实时监控和分析,可以帮助...

    JVM内存管理和垃圾回收.pdf

    Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到...总之,JVM内存管理和垃圾回收是优化Java应用性能的关键。了解这些概念并正确配置JVM参数,可以帮助开发者创建更高效、更稳定的软件系统。

    jvm-profiler,jvm分析器向kafka、控制台输出或自定义报告器发送度量.zip

    JVM是一种运行Java字节码的虚拟机,它负责垃圾回收、内存管理、类加载以及性能优化等工作。JVM分析器的主要目标是对JVM的内存使用、CPU消耗、线程活动、类加载情况等进行实时监测,以便于定位性能瓶颈和内存泄漏等...

    JVM-1.内存结构笔记

    JVM 内存结构是 Java 虚拟机的核心组成部分之一,包括程序计数器、虚拟机栈、本地方法栈、堆和方法区五个主要部分。 1. 程序计数器 程序计数器(Program Counter Register)是线程私有的,用于记录当前线程执行的...

    JVM内存管理和垃圾回收知识.pdf

    Java虚拟机(JVM)内存管理和垃圾回收是Java编程中至关重要的概念,它涉及到程序的性能和稳定性。本文主要探讨了JVM如何处理内存分配、垃圾检测与回收,以及各种策略和性能指标。 首先,垃圾回收是JVM的一项核心...

    jvm调优测试仓库-jvm-monitor.zip

    2. 内存配置:JVM内存分为堆内存(包括年轻代和老年代)、元空间、栈空间等。合理设置-Xms、-Xmx、-Xmn、-XX:MetaspaceSize等参数,可以避免内存溢出或内存碎片等问题。 3. 类加载机制:了解双亲委派模型、类加载器...

    jvm-full-gc调优-jvm-full-gc.zip

    1. **理解JVM内存结构**:Java内存主要分为堆内存(Heap)和非堆内存(Non-Heap),其中堆内存又分为新生代(Young Generation)、老年代(Tenured Generation或Old Generation)和持久代(Permanent Generation或...

Global site tag (gtag.js) - Google Analytics