`

Java内存区域划分

 
阅读更多

Java内存区域划分:
1、程序计数器:每个线程私有,记录当前线程执行的字节码的行号信息。
工作时通过改变其值来选取下一条字节码指令(单线程执行、或多线程CPU时间片切换时)。

2、虚拟机栈:每个线程私有,生命周期与线程相同,又叫方法栈或线程栈,栈内存放的元素称为栈帧。
每一次方法调用就会往栈中放入一个栈帧,栈帧记录了方法相关的基本数据类型与对象引用等,方法调用完成后该栈帧就出栈。
可通过-Xss参数来指定栈的大小,该大小会影响JVM的最大创建线程数与方法调用深度。当无法再创建线程时抛出OutOfMemoryError异常,当方法调用深度达到上限时抛出StackOverflowError异常。

3、本地方法栈:每个线程私有,与虚拟机栈类似,只是它的方法是native方法。
Hotspot虚拟机将虚拟机栈和本地方法栈作了合并。

4、堆内存:JVM所有创建的对象都在堆里分配,该区为各线程共享,可通过-Xms、-Xmx参数来设置堆的大小。
内存不足也会抛出OutOfMemoryError。
堆内存还可以细分为新生代和老年代,新生代分为Eden区、FromSurvivor区和ToSurvivor区。

5、方法区内存:又称永久代,存放虚拟机加载的类信息、常量、静态变量、即时编译器产生的代码、运行时常量池等,该区为各线程共享,可通过-XX:PermSize和-XX:MaxPermSize参数来设置其大小。
内存不足也会抛出OutOfMemoryError。
注意该区域是Sun Hotspot虚拟机独有,JRocket和IBM J9没有该区域。

运行时常量池:包括编译时产生的字面量和符号引用,还包括运行期加入的的常量信息(如使用String.intern()方法产生的串也会放入该区域)

6、直接内存:直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。nio中的DirectBuffer就是使用了直接内存。
可通过-XX:MaxDirectMemorySize(默认值为-1自动)来设置,注意它没有-XX:DirectMemorySize参数。
内存不足也会抛出OutOfMemoryError。

由上可见若抛出OutOfMemoryError,由可能是上述除程序计数器以外的内存区域可用内存不足,对于堆内存可以添加参数-XX:+HeapDumpOnOutOfMemoryError查看产生的hprof文件。

分享到:
评论

相关推荐

    浅谈Java内存区域划分和内存分配策略

    主要介绍了浅谈Java内存区域划分和内存分配策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    JVM内存区域划分Java系列2021.pdf

    JVM内存区域划分Java系列2021.pdf

    JVM内存区域划分.docx

    JVM内存区域划分

    JVM 性能调优_JVM 内存区域划分.pdf

    JVM 性能调优_JVM 内存区域划分.pdf

    Java虚拟机的内存区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成很多个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而...

    Java中内存区域的划分

    Java内存中有5个内存区域的划分 1 栈(Stack): 存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。 2 堆(Heap): new出来的东西都在堆中。堆内存里都有一个16进制的地址值。 3 方法区(Method Area):保存....

    JVM内存区域划分.pdf

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    msJavaCoder#msJava#理解JVM内存结构与Java内存模型1

    JVM内存结构Java 代码是要运行在虚拟机上的,而虚拟机在执行 Java 程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。如果

    Java虚拟机的内存划分.html

    Java虚拟机JVM详细的内存划分。划分的区域包括方法栈、堆内存、方法区、本地方法栈以及寄存器,对每个特殊区域的存放内容进行了介绍,并添加一些注意事项。最后,给出举例使用的Java代码段,分析了该代码段在运行...

    Java中内存区域的划分与异常详解

    最近在看java虚拟相关知识,把每天看到的一些内容做一个归纳总结,下面这篇文章主要给大家介绍了关于Java中内存区域的划分与异常的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看...

    Notes:This is a learning note | Java基础,JVM,源码,大数据,面经

    Java内存区域划分与对象新建过程 jvm垃圾收集机制与内存分配策略 jvm类加载机制 Java的内存模型 锁优化 Think In Java Java容器 Java并发 Java Concurrency in Practice 对象的共享 对象的组合 基础构建模块 JavaGC...

    Java内存区域与内存溢出

    内存区域  Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区...

    Java内存管理原理及内存区域详解

     Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:  ...

    学习JVM之java内存区域与异常

    关于JVM内存区域的知识对于初学者来说其实是很重要的,了解Java内存分配的原理,这对于以后JAVA的学习会有更深刻的理解。下面来看看详细介绍。

    Java内存分配和String类型的深度解析

    这块内存区域为什么要进行划分?是如何划分的?划分之后每块区域的作用是什么?如何设置各个区域的大小?  2、String类型在执行连接操作时,效率为什么会比StringBuffer或者StringBuilder低?StringBuffer和...

    Java 内存区域与内存溢出

    内存区域  Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区...

    Java新生代老年代的划分及回收算法

    Java堆(Java Heap)是JVM所管理的最大内存区域,也是所有线程共享的一块区域,在JVM启动时创建。 此内存区域存放的都是对象的实例和数组。JVM规范中说到:”所有的对象实例以及数组都要在堆上分配”。 Java堆是垃圾...

    第25讲谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError1

    第二,Java 虚拟机栈(Java Virtual Machine Stack),早期也叫 Java 栈 第三,堆(Heap),它是 Java 内存管理的核心区

    java内存管理(堆、栈、方法区)

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图所示:我认为我们最...

Global site tag (gtag.js) - Google Analytics