精华内容
下载资源
问答
  • Java内存分区

    千次阅读 2018-08-29 13:36:35
    Java程序是交由JVM执行的,所以Java内存区域划分的时候事实上是指JVM区域划分 1、Java程序执行过程: 如图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类...

    Java程序是交由JVM执行的,所以Java内存区域划分的时候事实上是指JVM区域划分

    1、Java程序执行过程:

    如图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作Runtime Data Area(运行时数据区)也就是我们常常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。

    一、运行时数据区域包括五部分

          根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法区(Native Method Stack)、方法区(Method Area)、堆(Heap)。

    如上图所示,JVM运行时数据区包括这五部分,在JVM规范中虽然规定了程序在执行期间运行时数据区应该包括这几部分,但是至于具体如何实现并没有做出规定,不同的虚拟机厂商可以有不同的实现方式。

    二、运行时数据区的每部分到底存储了那些数据?

    1、程序计数器

         程序计数器(Program Counter Regist)也有称作为PC寄存器,在汇编语言中,程序计数器是指CUP中的寄存器就,它保存的是程序当前执行的指令地址(也可以说是下一条指令的所在存储单元地址),当CUP需要指令时,需要从程序计数器中得到当前 执行的指令所在存储单元地址,然后根据得到的地址获取到指令,在得到指令后,程序计数器便会自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有指令。

         虽然JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CUP寄存器,但是JVM中的程序计数器的功能跟汇编语言中的程序计数器的功能在逻辑上是等同的,也就是说是用来指示 执行哪条指令的。

    由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这么说,程序计数器是每个线程所私有的。

      在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。

      由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

    2、Java栈

          Java栈也称作是虚拟机栈(Java Vitual Machine Stack),也就是我们常常所说的栈,跟c语言的数据段中的栈类似。事实上,Java栈是Java方法执行的内存模型。

           Java栈中存放的是一个个栈帧,每个栈帧对应着一个被调用的方法,在栈帧中包括局部变量表(Local Variable)、操作数栈(Operaand Stack)、指向当前方法所属的类的运行时常量池的引用(Reference to runtime constant tool)、方法返回地址(Return Address)和一些额外的附加信息。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。讲到这里,大家就应该会明白为什么 在 使用 递归方法的时候容易导致栈内存溢出的现象了以及为什么栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己的垃圾回收机制),这部分空间的分配和释放都是由系统自动实施的。对于所有的程序设计语言来说,栈这部分空间对程序员来说是不透明的。下图表示了一个Java栈的模型:

            局部变量表,顾名思义,就是用来存储放出方法中的局部变量(包括在方法中申明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储他的值,对于应用类型的变量,存的是指向对象的应用。

          操作栈帧,想必学过数据结构中的栈的朋友想必对表达式求值问题不会陌生,栈最典型的一个应用就是用来对表达式求值。想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,程序中的所有计算过程都是在借助于操作数栈来完成的。

         指向运行时常量池的引用,因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时的常量池

         方法返回地址,当一个方法执行完毕后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法的返回地址。

         由于每个线程执行正在执行的方法可能不同,因此每个线程都有一个Java栈,互不干扰。

    3、本地方法栈

      本地方法栈与Java栈的作用和原理相似,区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是执行本地方法(Native Method)服务的,在JVM规范中,并没有对本地方法栈的具体实现方法以及数据结构做强制规定,虚拟机可以自由实现它,在HOTSpot虚拟机中直接把本地方法栈和Java栈合二为一。

    4、堆

         在c语言中,堆这部分空间是唯一一个程序员管理的内存区域,程序员可以通过malloc函数和free函数在堆上申请和释放空间

          Java中的堆是用来存储对象本身以及数组(当然,数组引用是放在Java栈中的)。只不过和c语言不通,在Java中,程序员基本不关心空间释放的问题,Java的垃圾回收机制会自动进行处理,因此这部分空间也是Java垃圾收集器管理的主要区域。另外堆是被所有线程池共享的,在JVM中只有一个堆。

    5、方法区

         方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程池共享的区域。在方法区中,存储每个类的信息(包括类的名称、方法信息、字段信息)静态变量、常量以及编译器变异后的的代码等。

       在class文件中除了类的字段、方法、接口等描述信息外,还有一项是常量池,用来存储编译期间生成的字面量和符号引用。

       在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的常量池就被创建出来。当然并非class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如string的intern方法。

       在JVM规范中,没有强制要求方法区必须实现垃圾回收机。

    展开全文
  • java内存区域

    2020-12-22 14:48:34
    了解Java GC机制,必须先清楚在JVM中内存区域的划分。在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块:1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前...
  • Java内存区域

    2020-02-06 15:06:43
    Java内存区域与OOM 文章目录Java内存区域与OOM引言概述内存区域程序计数器VM Stack虚拟机栈Native Stack本地方法栈Heap堆内存方法区与常量池Direct Memory直接内存讲讲OOM总结 引言 一句契合Java/C++使用者的话,...

    Java内存区域与OOM

    引言

    一句契合Java/C++使用者的话,“两者之间存在一堵由内存分配与GC技术筑建起来的高墙,墙里面的人想出去,墙外面的人却想进来”。

    概述

    Java有着自动的内存分配管理机制,也有自己独特的内存回收机制,只有熟练掌握这些知识,才能够真正地使用这门语言

    内存区域

    先上一个内存区域图:

    在这里插入图片描述

    如图,JAVA运行时内存区域分为

    • 方法区(线程共享)
    • 堆(线程共享)
    • 虚拟机栈(线程私有)
    • 本地方法栈(线程私有)
    • 程序计数器(线程私有)

    下面我们来讲讲这些内存区域所负责的工作。

    程序计数器

    • JVM中的程序计数器与操作系统中的程序计数器功能是一致的,只不过操作系统的程序计数器记录的是下一条执行指令的地址,而JVM的程序计数器记录的是“当前”线程执行的字节码指令或者分支、循环、异常、线程恢复等功能的字节码支持。
    • 程序计数器对不同方法的支持
    Java methodJNI
    记录执行的字节码指令地址Native方法这个计数器记录为空值
    • 程序计数器是JVM中唯一不会出现OOM的地方。

    VM Stack虚拟机栈

    • JVM中的虚拟机栈也是线程私有的,一个线程在执行指令的过程中,会创建自己的虚拟机栈,生命周期与线程相同。
    • 虚拟机栈的描述
      • 其中栈帧的内容其实是线程执行的方法,可以这么说,线程每执行一个方法,就会在自己的虚拟机栈上创建一个方法栈帧,栈帧中包括局部变量表、操作数栈(OP)、动态链接、方法出口等信息。
    • 栈帧中的局部变量表存放了编译早期可知的各种基本数据类型以及引用类型。
    • 虚拟机栈
      • 当调用深度超过栈深度,就会发生SOF异常
      • 当分配栈帧时内存不足,则会发生OOM异常

    总之,一个线程在执行过程中,一个方法执行完毕,则会将栈帧弹出栈。


    Native Stack本地方法栈

    • 本地方法栈与虚拟机栈的功能一样,只不过执行的是JNI方法,因此,有些虚拟机会将这两部分合二为一。

    Heap堆内存

    • 这里的堆内存是指JVM中的堆内存区域,而非计算机的堆内存区。

    堆内存的功能

    • 对象实例、数组都在堆上分配内存的地方
    • 堆内存也是GC的重点关照之处,通过对堆内存的进一步划分,GC可以更好地回收内存和提高JVM的运行性能

    堆内存的特点

    • 堆内存从宏观是来讲是线程共享内存,但是,在JAVA的实现中,可能会对线程划分出一些私有的本地缓冲,即类似与ThreadLocalMap之类的,这是语言层面上的内存私有,与JVM层面的内存共享不同。
    • 堆内存并不要求物理上是连续的,同时,堆内存处于JVM内,而JVM本身也相当于一个程序,堆内存与OS的内存之间,会存在一层复制,(Netty的0拷贝技术也是利用堆外内存)

    当堆内存不足的时候,会发生OOM异常。


    方法区与常量池

    • 方法区与区中的常量池都是线程共享的,它不属于堆内存,它存放着JVM加载的Class信息、常量、静态变量等信息。
    • 可能有的人会认为这个属于GC中的永久代,而实际上,GC中的永久代仍然位于堆内存中,而方法区是“永久”,但并非永久代。

    特点

    • JVM的常量池与C是不同的,C的常量在编译时已经进行空间的分配,而JVM的常量池是动态的,比如进行动态的类加载,就会改变常量池分配的大小。或者String的intern也可以动态拓展方法区常量池。
    • 由于常量池也是动态的,因此,也会发生OOM异常。

    Direct Memory直接内存

    什么是直接内存

    • 直接内存并不是运行时数据区的一部分,它并不属于JVM的内部内存,但是这部分内存有很大的应用以及操作不当的风险,因此这里必须对堆外内存进行解释。
    • 名“堆外内存”或“直接内存”

    直接内存的特点

    • 在JDK1.4之后,引入了NIO,它基于一种Channel与Buffer的I/O方式,可以使用Native方法进行堆外内存的分配,然后利用一个存储在JAVA堆中的一个DirectByteBuffer对象作为这块堆外内存的引用进行操作,实际数据是存储在堆外。这样能够减少数据在JVM与OS堆中互通有无的性能消耗。

    应用

    • Netty就是利用堆外内存进行channel数据的0拷贝,加快传输速度。

    注意

    • 物理内存=JVM设置的最大内存+(JVM)堆外内存
    • 有时候我们只考虑了JVM的内存大小参数,而忽略了堆外内存大小,也是会发生OOM

    讲讲OOM

    OOM即OutOfMemoryError,发生OOM有两种可能:

    • 内存溢出
      • 这个是比较常见的,如使用时候把太多的数据加载到JVM而没有及时释放,就会出现这个问题。
    • 内存泄漏
      • 发生这个问题,肯定是代码中某些地方存在引用,而又非必须的引用。

    解决方式:

    • 讲dump日志进行转储,利用分析工具,确认内存中的对象是否是必要存在,如果非必要存在,那么很可能就是发生了内存泄漏,再去查看GC Roots,减少不必要的引用即可解决。
    • 如果是内存不足,那么就从物理、虚拟机、代码上去拓展优化。

    总结

    以上就是JVM内存区域的解释,掌握了JVM内存区域,才能理解JAVA的GC机制,以及编写更加高性能的代码。

    展开全文
  • Java 内存分区

    千次阅读 2018-08-16 17:12:43
    Java 内存分区主要分5个方面 1.程序计数器 又叫程序寄存器 线程私有  JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)。如果线程正在执行的是一个Java方法(非...

    Java 内存分区主要分5个方面

    1.程序计数器  又叫程序寄存器 线程私有 

    JVM支持多个线程同时运行,当每一个新线程被创建时,它都将得到它自己的PC寄存器(程序计数器)。如果线程正在执行的是一个Java方法(非native),那么PC寄存器的值将总是指向下一条将被执行的指令,如果方法是 native的,程序计数器寄存器的值不会被定义。 JVM的程序计数器寄存器的宽度足够保证可以持有一个返回地址或者native的指针。

     

    2.Java栈   线程私有  

    JVM为每个新创建的线程都分配一个栈。也就是说,对于一个Java程序来说,它的运行就是通过对栈的操作来完成的。栈以帧为单位保存线程的状态。JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作。我们知道,某个线程正在执行的方法称为此线程的当前方法。我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧,这个帧自然成为了当前帧。在此方法执行期间,这个帧将用来保存参数、局部变量、中间计算过程和其他数据。从Java的这种分配机制来看,堆栈又可以这样理解;局部变量和对象引用都是放在栈区,代码运行完就会被自动回收。

     

    3.Java堆  线程共享

    成员变量 是属于对象所有的 所以是放在堆区  对象本身也是放在堆区  这是是JavaGC的核心 不会自动回收 

    jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,对象在这里被分配内存.

     

    4. 方法区  线程共享

    当虚拟机装载一个class文件时,它会从这个class文件包含的二进制数据中解析类型信息,然后把这些类型信息(包括类信息、常量、静态变量等)放到方法区中,该内存区域被所有线程共享。虽然JVM规范把方法区描述为堆得一个逻辑部分,但是他有一个别名叫Non-heap(非堆),目的应该是与Java堆区分开。主要有string常量 final常量  static修饰的 都是在方法区

     

    5.本地方法栈

    主要是存放Native的方法。

     

    展开全文
  • Java 内存区域

    2021-08-23 09:55:49
    Java 虚拟机在执行Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而...

            Java 虚拟机在执行Java 程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程启动而一直存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。具体如下图

    线程共享区域:方法区,堆

    线程私有区域:虚拟机栈,本地方法栈,程序计数器

     1 程序计数器 

            程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里[插图],字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。
    由于Java虚拟机的多线程是通过线程轮流切换、分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。
            如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。此内存区域是唯一一个在《Java虚拟机规范》中没有规定任何OutOfMemoryError情况的区域。

     2 Java虚拟机栈

          与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
            重点说一下局部变量表:局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。

    3 本地方法栈 

            本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native)方法服务。

    4 Java堆 

             Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java世界里“几乎”所有的对象实例都在这里分配内存。在《Java虚拟机规范》中对Java堆的描述是:“所有的对象实例以及数组都应当在堆上分配”,随着Java语言的发展,现在已经能看到些许迹象表明日后可能出现值类型的支持,即使只考虑现在,由于即时编译技术的进步,尤其是逃逸分析技术的日渐强大,栈上分配、标量替换等优化手段已经导致一些微妙的变化悄然发生,Java对象实例都分配在堆上也渐渐变得不是那么绝对了。
           根据《Java虚拟机规范》的规定,Java堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的,这点就像我们用磁盘空间去存储文件一样,并不要求每个文件都连续存放。但对于大对象(典型的如数组对象),多数虚拟机实现出于实现简单、存储高效的考虑,很可能会要求连续的内存空间。
            Java堆既可以被实现成固定大小的,也可以是可扩展的,不过当前主流的Java虚拟机都是按照可扩展来实现的(通过参数-Xmx和-Xms设定)。如果在Java堆中没有内存完成实例分配,并且堆也无法再扩展时,Java虚拟机将会抛出OutOfMemoryError异常。

    5 方法区 

             方法区(MethodArea)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区分开来。
            说到方法区,不得不提一下“永久代”这个概念,尤其是在JDK 8以前,许多Java程序员都习惯在HotSpot虚拟机上开发、部署程序,很多人都更愿意把方法区称呼为“永久代”(Permanent Generation),或将两者混为一谈。本质上这两者并不是等价的,本质上而言永久代只是实现方法区而已,到了JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Meta-space)来代替,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。
            根据《Java虚拟机规范》的规定,如果方法区无法满足新的内存分配需求时,将抛出OutOfMemoryError异常。

    6 运行时常量池 

             运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
            Java虚拟机对于Class文件每一部分(自然也包括常量池)的格式都有严格规定,如每一个字节用于存储哪种数据都必须符合规范上的要求才会被虚拟机认可、加载和执行,但对于运行时常量池,《Java虚拟机规范》并没有做任何细节的要求,不同提供商实现的虚拟机可以按照自己的需要来实现这个内存区域,不过一般来说,除了保存Class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性,Java语言并不要求常量一定只有编译期才能产生,也就是说,并非预置入Class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可以将新的常量放入池中,这种特性被开发人员利用得比较多的便是String类的intern()方法。
            既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常。

    7 直接内存 

            直接内存(Direct Memory)并不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致OutOfMemoryError异常出现,显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,则肯定还是会受到本机总内存(包括物理内存、SWAP分区或者分页文件)大小以及处理器寻址空间的限制,一般服务器管理员配置虚拟机参数时,会根据实际内存去设置-Xmx等参数信息,但经常忽略掉直接内存,使得各个内存区域总和大于物理内存限制(包括物理的和操作系统级的限制),从而导致动态扩展时出现OutOfMemoryError异常。

    想和大家探讨一下为什么HotSpot要废弃永久代而改用元空间呢?

    1 在方法区里面已经说明,JRockit、J9等虚拟机是没有永久代一说的,都是本地内存中实现的元空间(Meta-space)来代替,所以HotSpot虚拟机为了以后和JRockit、J9等虚拟机融合,废弃永久代。
    2 永久代放在Java虚拟机的运行时数据区域中,毫无疑问会受内存大小影响,如果加载的类过多,必然会导致永久代内存溢出,不利于管理。

    展开全文
  • 比如本文我们要讨论的JVM内存结构、JAVA内存结构、JAVA内存区域、Java内存模型,这就是几个截然不同的概念,但是很多人容易弄混。 可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、JAVA内存结构、JAVA内存...
  • Java内存区域
  • 今天小编就为大家分享一篇关于Java内存区域和内存模型讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 主要介绍了Java内存区域与内存溢出异常详解的相关资料,需要的朋友可以参考下
  • JAVA内存分区与CC++内存分区的总结
  • 深入探讨Java内存区域

    2020-09-03 11:38:04
    本篇文章对Java内存区域的使用进行了详细的介绍,内容很全面,需要的朋友可以参考下
  • java内存区域和内存溢出.xmind
  • Java 内存分区讲解

    千次阅读 多人点赞 2019-07-25 11:19:46
    对于一个Java开发者,了解Java中的对象、变量等存放的内存区域是十分重要的。本文将全面讲解Java虚拟机中的内存模型和分区Java虚拟机把管理的内存划分为几个不同的数据区域,如下图所示。 下面就分别展开...
  • Java内存区域与Java内存模型

    千次阅读 2018-02-25 15:09:43
    Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有其用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数据区域...
  • 主要介绍了浅谈Java内存区域划分和内存分配策略,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java内存区域怎么划分的?

    万次阅读 2020-09-18 15:12:57
    Java内存区域怎么划分的? 运行时数据区域包含以下五个区域:程序计数器,Java虚拟机栈,本地方法栈,堆,方法区(其中前三个区域各线程私有,相互独立,后面两个区域所有线程共享) 线程私用的部分(Java虚拟机栈,...
  • Java内存区域划分和内存分配策略

    千次阅读 多人点赞 2020-05-15 12:32:46
    Java内存区域划分和内存分配策略 如果不知道,类的静态变量存储在那? 方法的局部变量存储在那? 赶快收藏 Java内存区域主要可以分为共享内存,堆、方法区和线程私有内存,虚拟机栈、本地方法栈和程序计数器。如下...
  • 《深入理解java虚拟机》第2章 Java内存区域与内存溢出异常.pdf
  • 主要介绍了简单了解JAVA内存区域效果知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 《深入理解Java虚拟机 1》Java内存区域与内存分配策略.pdf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 296,088
精华内容 118,435
关键字:

java内存区域

java 订阅