zoukankan      html  css  js  c++  java
  • jvm内存

    原文链接:https://www.cnblogs.com/dolphin0520/p/3613043.html

     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)。

    局部变量表,顾名思义,想必不用解释大家应该明白它的作用了吧。就是用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。

    Java堆是 Java 虚拟机所管理的内存中最大的一块。 Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。Java 堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆( ” Garbage Collected Heap)。如果从内存回收的角度看,Java堆又会划分为好几个区域(新时代,老年代,等等)如果从内存分配的角度看,线程共享的 Java 堆中可能划分出多个线程私有的分配缓冲区。但无论怎么去划分,无论那个区域,java堆中存储的依然是对象的实例。进一步划分的目的是为了更好地回收内存,或者更快地分配内存。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出 OutOfMemoryError 异常。

  • 相关阅读:
    @transactional注解下失效
    string.format格式化字符串中转义大括号“{}”
    ArrayList循环遍历并删除元素的常见陷阱
    HashMap、HashTable与ConcurrentHashMap区别
    -webkit-,-moz-,-ms-,-o-具体指什么了?
    常用js正则表达式大全
    hashcode详解
    如何区分oracle服务器、oracle客户端、plsql?
    Oracle Client(客户端) 安装与配置
    Openresty使用
  • 原文地址:https://www.cnblogs.com/Alpharun/p/8515130.html
Copyright © 2011-2022 走看看