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

JVM的内存结构的一点理解

    博客分类:
  • java
阅读更多

              

        Java语言把内存的管理交给了JVM自己来做,向比较C++而言,一定程度上,简化了程序的开发,应为它的内存管理是JVM自己去主动做的,不需要程序员自己干预。然而,也正应为如此,一旦发生了内存泄漏和溢出等问题,调试起来也比较麻烦。所以,对JVM的内存结构还是需要有一定的理解。

 

      JVM把程序分成了如下几块内容:方法区,堆,栈,程序计数器直接内存区

 

    程序计数器(PCR)是一块比较小的内存,它用来指示下一个需要执行的Java代码或者字节码的行号,每个线程都有一个程序 计数器,应此,他是线程私有的。通常这块内存比较小,一般不需要做调整,虚拟机自动管理以及足够。

 

    栈区域(VM stack)分为两块:一块是JVM Stack,一块是Native Stack。Stack区域是线程私有的,用于存储方法内部的局部变量,操作数栈,方法出口等信息,每一个方法从调用到执行的过程,就是一个栈帧在虚拟机中入栈和出栈的过程。Native Statck是在JNI的时候使用。

 

     Java堆(Heap)是JVM中最大的一块内存区域,用于存放对象的实例,被所有线程共享的一块区域,在程序启动的时候创建起来。该区域也是垃圾回收(GC)的主要区域,现在基本都采用分带收集的算法:一般可以分为新生代和老年代,更细致一些可以到:Eden 空间,From 空间,To空间。From和To空间互相转换。

 

    方法区(Method Area) 和JAVA的堆一样,是被所有线程共享的一块区域,用于存放类信息,常量,静态变量,JIT编译之后的代码数据等,我们有时候通常叫他永久内存区,不过这个只是在Sun的HotSpot虚拟机里存在,在Jrockt和IBM等的虚拟机里并不存在这样的说法。GC在这个区域出现的比较少,但并不是永远都不会回收了。主要回收的对象是常量池和对类对象的卸载。

 

     直接内存(Direct Memory),这个区域并非JVM区域的一部分,在JAVA1.4中引入的NIO,一种基于通道与缓存区的IO方式,可以通过native分配非堆内的内存,然后使用Java堆中的DirectbyteBuffer进行应用,这块区域的内存不受JVM内存的限制,大小取决于物理内存或者进程的限制。

 

     在这几块内存区域中,除了程序计数器,其他区域都有可能发生outofMemoryError异常,不同区域的异常通过调节不同的设置来扩展。我们知道,Java的对象分为强引用,弱引用,软引用和虚引用,其中强引用只要存在,Gc都不可能对其回收。虚引用发现先及立即回收,而弱引用则发生在第二次垃圾回收的时候进行回收,软引用在内存即将不够的时候进行回收

 

     首先是Java堆溢出(java heap space),(只要不停的创建对象,使GC Root到对象之间有可达的路径,那么对象就不会被回收),对象数量达到堆的最大限制后,就会出现内存溢出异常。通过参数-Xms -Xmx可以设置堆的大小,最小与最大不同,则会自动调节,通过参数:-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出时Dump出当前堆的快照一遍时候进行分析。

 

   Stack 溢出:在HotSpot中并不区分VM Stack和Native Stack,通过参数-Xss来设置栈的大小。

   

   方法区和运行时常量池的溢出(Perm space):这一块我们称为永久代,使用参数-XX:PermSize 和-XX:MaxpermSize来控制

 

    本机内存直接溢出(Directmemory):默认与-Xmx堆的最大值相同,通过-XX:MaxDirectmemorySize指定大小,如果HeapDump文件没有明显异常,或者比较小,那可能是MaxDirectmemorySize造成的。

  

   

分享到:
评论

相关推荐

    JVM 内存结构及配置总结

    理解JVM内存结构和配置对于优化Java应用程序性能至关重要。正确的参数配置能够避免内存溢出、提高垃圾收集效率,从而提升整体系统性能。在实际应用中,开发者需要根据应用程序的特性和需求,灵活调整这些参数。同时...

    JVM内存结构.pdf

    理解JVM内存结构对于高效地编写Java应用程序至关重要。通过对JVM内存各部分的认识,我们可以更有效地管理和优化资源使用,提高应用程序的整体性能。此外,熟悉类加载机制和JDK提供的各种调优工具,也是解决性能问题...

    JVM内存结构.zip

    JVM内存结构的理解对于优化Java程序性能、避免内存溢出等问题至关重要。以下是对JVM内存结构的详细阐述: 1. **堆内存(Heap)** 堆内存是Java程序中最大的一块内存区域,用于存储对象实例。所有通过`new`关键字...

    深入理解JVM内存结构及运行原理全套视频加资料

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...

    jvm 内存分析文档

    理解JVM内存结构和内存分配机制对于避免内存溢出(OutOfMemoryError)、提升程序性能、减少垃圾回收开销至关重要。开发者应关注内存配置、对象生命周期管理以及适当的垃圾回收策略,以优化应用程序的性能和稳定性。

    JVM内存结构笔记.rar

    总之,深入理解JVM内存结构及其管理机制,有助于我们编写更高效、更稳定的Java程序,并能有效地处理内存相关问题。这份"JVM内存结构笔记"将详细阐述这些内容,是学习和研究JVM内存管理的重要参考资料。

    JVM内存空间分配笔记

    ### JVM内存空间分配详解 #### 一、JVM内存模型概览 ...综上所述,理解JVM内存分配机制对于Java开发者来说至关重要,这不仅有助于编写高效、稳定的代码,还能在遇到性能瓶颈时快速定位问题并进行优化。

    jvm内存基本结构及垃圾回收

    理解JVM内存结构和垃圾回收机制对于Java开发者至关重要,它可以帮助我们更好地优化程序性能,避免内存溢出等问题。通过调整JVM参数,如堆大小、新生代与老年代的比例、垃圾收集器的选择等,我们可以根据应用的需求...

    JVM内存结构

    JVM内存结构的理解对于优化Java程序的性能至关重要。JVM内存主要分为以下几个区域: 1. **程序计数器(Program Counter Register)**:每个线程都有一个独立的程序计数器,用于存储当前线程正在执行的字节码指令...

    Java虚拟机 JVM 内存结构介绍

    Java虚拟机(JVM)内存结构是理解Java...总之,JVM内存结构是Java平台的核心特性,它为程序提供了动态的内存分配和管理,确保了程序的稳定性和效率。深入理解这一结构,有助于开发者写出更高效、更健壮的Java应用程序。

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细...通过这份白皮书的学习,读者将能够深入理解JVM内存管理的复杂性,并掌握处理内存问题的有效方法。

    JVM内存参数详解以及配置调优

    本资源详细讨论了 JVM 内存参数的配置和调优,包括 JVM 的结构、内存管理、垃圾回收、堆和非堆内存、内存分配和限制等方面,为开发人员和运维人员提供了一份详细的指南,以帮助他们更好地理解和优化 JVM 的性能。

    JVM-内存管理 2012-12.pdf

    总结而言,JVM内存管理涉及多个层面,包括内存结构的划分、内存空间的分配与回收机制、以及内存分析工具的使用。对Java开发人员而言,理解这些内存管理机制不仅能够帮助其编写出更加稳定和高效的代码,还能在发生...

    一文搞懂JVM内存结构

    了解JVM内存结构对于优化代码性能、防止内存泄漏以及理解程序运行时的行为至关重要。本文将深入探讨JVM内存的各个区域,帮助你全面掌握JVM的工作原理。 首先,JVM内存主要分为以下几个部分: 1. **程序计数器...

    linux & JVM内存结构分析

    总结来说,Linux和JVM内存结构分析是提升系统效率和稳定性的重要手段。通过阅读和分析上述文件,我们可以深入了解系统资源的使用情况,进而进行针对性的调优。对于IT专业人士而言,掌握这些知识不仅能提升工作效率,...

    JVM内存日志

    总结,通过理解JVM内存结构,熟练运用`jmap`工具,结合`dump.txt`文件的分析,我们可以有效地诊断和优化Java应用程序的内存使用,提高系统性能。在实际工作中,定期监控和分析JVM内存日志是确保应用稳定性和高效运行...

    jvm的内存结构图的ppt模型分析.zip

    理解JVM内存结构对于优化Java程序至关重要。例如,合理设置新生代和老年代的比例,可以提高垃圾回收效率;控制栈帧大小和数量,能防止栈溢出;而了解直接内存的使用,可以帮助减少系统内存压力。 此外,JVM内存管理...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...

    JVM内存配置优化

    #### 一、理解JVM内存模型 在进行JVM内存配置优化之前,我们需要了解Java虚拟机(JVM)的内存结构。Java的逻辑内存模型大致分为几个部分: 1. **堆内存(Heap)**:主要用于存储对象实例、数组等引用类型的数据。在...

    JVM内存结构、Java内存模型、Java对象模型1

    Java内存模型(JMM)与JVM内存结构不同,它是针对多线程环境下内存访问的抽象模型。JMM确保在多线程环境下,共享变量的读写操作具有正确的顺序和可见性,通过volatile、synchronized等关键字来实现这一目标。JMM关注...

Global site tag (gtag.js) - Google Analytics