`
guoshaobin
  • 浏览: 15114 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

JVM内存管理

    博客分类:
  • java
jvm 
阅读更多
内存空间
    可划分为方法区、堆、本地方法栈、PC寄存器及JVM方法栈。

方法区
    方法区存放了要加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域。方法区域也是全局共享的,在一定条件下它也会被GC,当方法区域要使用的内存超过其允许的大小时,会抛出OutOfMemory.
    这块区域对应Permanet Generation,又称为持久代,默认最小值为16MB,最大值为64MB。可通过-XX:PermSize及-XX:MaxPermSize来指定最小值和最大值。


    堆用于存储对象实例及数组值,可以认为Java中所有通过new创建的内存都在此分配,Heap中对象所占用的内存由GC进行回收,在32位操作系统上最大为2GB,在64位操作系统上则没有限制,其大小可通过-Xms和-Xmx来控制,-Xms为JVM启动时申请的最小Heap内存,默认为物理内存的1/64但小于1GB;-Xmx为JVM可申请的最大Heap内存,默认为物理内存的1/4但小于!GB,默认当空余堆内存小于40%时,JVM会增大Heap到-Xmx指定的大小,可通过-XX:MinHeapFreeRatio=来指定这个比例;当空余堆内存大于70%时,JVM会减小Heap的大小到-Xms的大小,可以通过-XX:MaxHeapFreeRatio=来指定这个比例,对于运行系统而言,为避免在运行时频繁调整Heap的大小,通常将-Xms和-Xmx的值设置为一样。

JDK1.2后堆采用了分代管理


1、新生代(New Genertion)
    大多情况下JAVA程序中新建的对象都从新生代分配内存,新生代有Eden Space和两块相同大小的Survivor Space(通常又称为S0和S1或者From和To)构成,可通过-Xmx参赛来指定新生代的大小,也可以通过-XX:SurvivorRatio来调整Eden Space及Survivor Space的大小。不同的GC方式会以不同的方式按比值来划分Eden Space 和Survivor Space,有些GC方式还会根据运行状况来动态调整Eden、S0、S1的大小。
2、旧生代(Old Gennertion)
    用于存放新生代中经过多次垃圾回收仍然存活的对象,例如换成对象,新建的对象也是有可能在旧生代上直接分配内存。主要有两种情况(由不同的GC实现来决定):一种为大对象,可通过在启动参数上设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表当对象超过多大时就不在新生代分配,而是直接在旧生代分配,此参赛在新生代采用Parallel Scavenge GC是无效,Parallel Scavenge GC会根据运行状况决定什么对象直接在旧生代生分配内存;另一种为大的数组对象,且数组中无引用外部对象。
    旧生代所占用的内存大小为-Xmx对应的值减去-Xmn对应的值。
   
本地方法栈
    本地方法栈用于支持native方法的执行,存储了每个native方法调用的状态,在Sun JDK的实现中本地方法栈和JVM方法栈是同一个。
PC寄存器和JVM方法栈
    每个线程均会创建PC寄存器和JVM方法栈,PC寄存器占用的可能为CPU寄存器或者操作系统内存,JVM方法栈占用的为操作系统内存,JVM方法栈为线程私有,其在内存分配上非常高效。当本地运行完毕时,其对应的栈帧所占用的内存也会自动释放。
    当JVM方法在空间不足时,会抛出StackOverFlowError的错误,在Sun JDK中可以通过-Xss来指定其大小。

内存分配
    Java对象所占用的内存主要从堆上进行分配,堆是所有线程共享的,因此在堆上分配内存时需要进行加锁,这导致了创建对象开销比较大。当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则会抛出OutOfMemory.
    Sun JDK为了提升内存分配的效率,会为每个新创建的线程在新生代的Eden Space上分配一块独立的空间,这块空间称为TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行情况计算而得,可通过-XX:TLABWasteTargetPersent来设置TLAB可占用的Eden Space的百分比,默认值是1%。JVM将根据这个比率、线程数量及线程是否频繁分配对象来给每个线程分配合适大小的TLAB空间。在TLAB上分配内存是不需要加锁,因此JVM在给线程中的对象分配内存是会尽量在TLAB上分配,如果对象过大或者TLAB空间已用完,则仍然在堆上进行分配。因此在编写Java程序时,通常多个小的对象比大 的对象分配起来更高效,可通过在启动参赛上增加-XX:+PrintTLAB 来查看TLAB空间使用情况。

对象引用关系上,除了默认的强引用外,还有软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)三种。
A a = new A();就是强引用。
采用软引用来建立引用的对象,当JVM内存不足时会被回收,因此SoftReference很适合用于实现缓存。另外,当GC认为扫描的SoftRefernece不经常使用时,也会进行回收,存活时间可通过-XX:SoftRefLRUPolicyMSPerMB来进行控制,其含义为每兆堆空间中SoftRefernece的存活时间,默认为1秒。
Object object = new Object();
SoftReference<Object> softRef = new SoftReference<Object>(object);
object = null;
取用get取,有可能为空。

弱引用:采用软引用建立的对象没有强引用后,GC时即会被自动释放。
Object object1 = new Object();
WeakReference<Object> weakRef = new WeakReference<Object>(object1);
object1 = null;

虚引用

  














分享到:
评论

相关推荐

    JVM 内存管理之道

    JVM 内存管理之道 JVM垃圾回收机制 JVM GC组合 JVM 内存监控工具

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...

    jvm内存管理,pdf

    ### JVM内存管理详解 #### 一、引言 在探讨JVM内存管理之前,我们先来看一下为何要深入了解这一主题。对于深入掌握Java的人来说,内存管理是不可或缺的一部分。随着技术的发展,内存管理变得越来越自动化,但这也...

    JVM-内存管理 2012-12.pdf

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

    JVM内存管理及调优

    **JVM内存管理及调优** Java虚拟机(JVM)是Java程序运行的基础,它为Java应用程序提供了运行环境。JVM内存管理是优化Java应用性能的关键环节,涉及到内存分配、垃圾回收以及内存溢出等问题。毕玄,一位在淘宝有着...

    JVM内存管理学习笔记

    《JVM内存管理学习笔记》 在Java世界中,JVM(Java Virtual Machine)是运行所有Java应用程序的核心。深入理解JVM内存管理对于优化程序性能、预防和解决内存泄漏问题至关重要。本文将从JVM内存模型、内存区域划分、...

    JVM内存管理和JVM垃圾回收

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

    JVM内存管理、调优与监控考据

    总的来说,JVM内存管理、调优与监控是一项综合性的技术工作,需要对JVM内部机制有深入理解,并结合具体应用场景进行细致的分析和实践。由于JVM的实现可能存在差异,且规范与实现之间存在一定的不一致性,因此,进行...

    JVM内存管理和垃圾回收

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

    JVM内存管理白皮书[借鉴].pdf

    在《JVM内存管理白皮书》中,深入探讨了JVM如何处理内存分配、垃圾收集以及各种收集器的工作原理。以下是对该白皮书部分内容的详细解读: 1. 显式与自动内存管理: 在传统的C++等语言中,程序员需要手动进行内存...

    从JVM内存管理的角度谈谈静态方法和静态属性

    理解JVM内存管理和静态成员的工作原理对于优化Java程序的性能至关重要。合理的对象创建、内存使用以及静态成员的恰当运用,都可以帮助提升程序效率并降低内存消耗。在编写代码时,应根据实际需求选择静态或非静态...

    JVM内存管理面试常见问题全解.doc

    JVM 内存管理面试常见问题全解 JVM 内存管理是 Java 程序员必须掌握的重要知识点,本文将对 JVM 内存管理的面试常见问题进行全解。 一、什么是 JVM Java Virtual Machine(Java 虚拟机)是 Java 程序实现跨平台的...

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

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

    JVM内存管理知识思维导图.png

    JVM内存管理知识思维导图.png

    JVM内存管理-GC模型-编写GC友好的代码.pdf

    ### JVM内存管理与GC模型详解 #### 一、引言 在现代软件开发中,Java虚拟机(JVM)作为一种广泛使用的平台,其内部机制尤其是内存管理和垃圾收集(GC)模型,对提升程序性能和稳定性至关重要。本文将深入探讨Sun ...

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

    Java虚拟机(JVM)内存管理和...总结来说,JVM内存管理和垃圾回收是一个复杂而精细的过程,涉及多种策略和算法,旨在高效利用内存,减少应用暂停时间,并防止内存泄漏。理解和掌握这些原理对优化Java应用性能至关重要。

Global site tag (gtag.js) - Google Analytics