`

java堆、栈、方法区内存溢出

jvm 
阅读更多
1.java堆内存溢出
  java堆用于存储对象,只要不断的创建对象,并且保证GC Roots到对象的之间有可达路径来避免垃圾回收机制清楚这些对象,那么在对象数量达到最大堆容量限制后就会产生内存溢出异常。
2.栈内存溢出
  在单个线程下,无论是由于栈帧太大还是虚拟机栈容量太小,当内存无法分配的时候,虚拟机抛出的都是StackOverflowError异常。
  多线程下,不断建立线程会产生内存溢出,但这样的内存溢出和栈空间是否足够大并不存在任何联系。在这种情况下,为每个线程的栈分配的内存越大,反而越容易产生内存溢出。
3.方法区内存溢出
  HotSpot  jdk1.7之前字符串常量池是方法区的一部分,方法区叫做“永久代”,在1.7之前无限的创建对象就会造成内存溢出,提示信息:PermGen space
而是用jdk1.7之后,开始逐步去永久代,就不会产生内存溢出。

  方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等,如果动态生成大量的Class文件,也会产生内存溢出。常见的场景还有:大量JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为java类)、基于OSGi的应用(即使是同一个类文件,被不同的类加载器加载也会视为不同的类)。
分享到:
评论
1 楼 bigShirly 2016-12-06  
小伙纸,不错呀

相关推荐

    jvm内存溢出

    - **方法区内存溢出(outOfMemoryError:permgen space)**:随着Java 8的发布,方法区被元空间(Metaspace)所替代,但它仍然可能发生内存溢出。当程序加载了大量的类、常量、静态变量,或者使用了反射、CGLIB等技术...

    防止内存溢出_jar文件_

    Java使用JVM(Java Virtual Machine)来执行代码,其内存分为堆内存、栈内存、方法区、程序计数器和本地方法栈等几个区域。内存溢出通常发生在堆内存或方法区内。 3. **JVM内存参数调整** - **堆内存**:通过`-...

    JVM内存模型

    永久区内存溢出相对少见,一般是由于需要加载海量的Class数据,超过了非堆内存的容量导致。栈内存也会溢出,但是更加少见。 为了避免内存溢出异常,需要对JVM进行优化。堆内存优化可以通过调整JVM启动参数来实现,...

    java内存分析.pdf

    5. 类加载器(ClassLoader):JVM通过类加载器来加载.class文件,并将其转换成二进制字节流,然后转换为方法区内的运行时数据结构,最后生成在Java堆中唯一的java.lang.Class对象。 6. 执行引擎(Execution Engine...

    Java工程师应用技术汇总

    - **MethodAreaOutOfMemory**:方法区内存溢出。 - **ConstantPoolOutOfMemory**:常量池内存溢出。 - **DirectMemoryOutOfMemory**:直接内存溢出。 - **StackOutOfMemory**:栈内存溢出。 - **StackOverflow**:栈...

    java虚拟机详解免费.pdf

    内存区域方面,JVM将内存划分为若干个运行时数据区,包括方法区、堆、Java栈、程序计数器以及本地方法栈。方法区用于存储已被虚拟机加载的类信息、常量、静态变量等数据;堆是JVM所管理的最大的一块内存空间,主要...

    JVM 32道面试题和答案.docx

    2. **Java 虚拟机栈(Java Virtual Machine Stack)**:每个线程都有一个独立的Java虚拟机栈,用于存储方法调用过程中的局部变量表、操作数栈、动态链接和方法返回地址等信息。栈帧随着方法的调用和返回而入栈和出栈...

    JAVA核心知识点整理.pdf

    在Java核心知识点整理中,JVM相关的内容是一个非常重要的部分,它包含了程序计数器、虚拟机栈、本地方法栈、堆、方法区等内存区域的划分,以及垃圾回收算法、引用类型和垃圾收集器等知识点。 程序计数器是线程私有...

    java虚拟机.docx

    - **运行时常量池(Runtime Constant Pool)**:方法区内的一部分,用于存放编译期生成的各种字面量和符号引用。 #### 五、对象的生命周期 - **对象的创建**:在Java堆中分配内存空间,并初始化对象状态。 - **对象...

    java核心笔记.pdf

    类加载机制是指JVM在运行Java程序时,将编译后的.class文件中的二进制数据读入到内存中,将其转换为方法区内的运行时数据结构,并且在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的...

    JVM运行时数据区

    综上所述,JVM的运行时数据区主要包括程序计数器、栈、堆、方法区、运行时常量池以及本地方法栈。这些区域对于Java程序的正常运行至关重要,理解它们的工作原理有助于开发者更好地管理和优化Java应用程序的性能。

    Java虚拟机(JVM)面试题(2022最新版)-重点

    **Runtime Data Area (运行时数据区域):** JVM的内存区域,分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区等部分。这些区域分别存储了不同类型的数据。 #### JVM运行时数据区详解 **JVM运行时数据区**是...

    java虚拟内存.pdf

    - Java栈(Java Stack):存储基本类型的局部变量和对象引用。 - 程序计数器(Program Counter):指向当前线程所执行的字节码指令的地址。 - 本地方法栈(Native Method Stack):为JVM执行本地方法服务。 3. ...

    Java虚拟机规范(EN,se7)-带书签目录超清文字版.pdf

    5. 方法区内的运行时常量池(Runtime Constant Pool):存放各种字面量和符号引用。 三、类加载机制 Java的类加载过程包括加载、验证、准备、解析和初始化五个阶段。动态加载使得类可以在运行时被加载到JVM中,提高...

    Java虚拟机(JVM)面试宝典1.pdf

    - **GC根节点**:通常包括Java栈中的本地变量、方法区中的静态变量、运行时常量池中的引用等。 - **对象回收条件**:当一个对象无法通过任何引用链访问到时,即被认为是不可达的,从而成为垃圾回收的目标。 **2.2 ...

    【JVM和性能优化】1.Java内存区域

    文章目录了解的必要性JVM历史JVM数据区域私有区共有区内存区域版本变化1.61.71.8元空间栈跟堆Java中的对象都是在堆中分配吗逃逸分析标量替换栈上分配同步消除JVM对象对象创建过程对象内存布局对象访问方式通过句柄...

Global site tag (gtag.js) - Google Analytics