Java内存区域

    
    1.程序计数器(Program Counter Register)
        在虚拟机中一块较小的内存空间。它的作用能够看做是当前线程所运行的字节码的行号指示器。 在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条须要运行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都须要依赖这个计数器来完毕

        因为Java虚拟机的多线程是通过线程轮流切换并分配处理器运行时间的方式来实现的。在不论什么一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)仅仅会运行一条线程中的指令。

因此,为了线程切换后能恢复到正确的运行位置。每条线程都须要有个独立的程序计数器,各条线程之间的计数器互不影响,独立存储。我们称这类内存区域为"线程私有"的内存

    假设线程正在运行的是一个Java方法,这个计数器记录的是正在运行虚拟机字节码指令的地址;假设正在运行的Native方法,这个计算器值则为空(Undefined),此内存区域是唯一一个在Java虚拟机规范中没有规定不论什么OutOfMemoryError情况的区域。

    2.Java虚拟机栈(Java Virtual Machine Stacks)    
        与程序计数器一样。Java虚拟机栈也是线程私有的。它的生命周期与线程同样。虚拟机栈描写叙述的是Java方法运行的内存模型:每一个方法被运行的时候都会同一时候创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息。每一个方法被调用直至运行完毕的过程,就相应着一个栈帧在虚拟机栈中充入栈到出栈的过程

        寻常大家说堆(Heap)栈(Stack)。这样的划分比較粗糙。所说的“栈”指的就是虚拟机栈。或者说是虚拟机栈中的局部变量表部分。局部变量表存放了编译期可知的各种基本类型(boolean、byte、char、short、int、float、long、double)、对象引用(Reference类型。它不等同于对象本身,依据不同的虚拟机实现,它可能是一个运行对象起始地址的引用指针,也可能是运行一个代表对象的句柄或其它与此对象相关的位置)和returnAddress类型(指向了一条字节码指令的地址)。
    64位长度的Long和Double类型的数据会占用2个局部变量空间(Slot)。其它的数据类型仅仅占用1个。局部变量表所需的内存空间在编译期间完毕分配,也就是一个方法的局部变量空间是完毕确定的。在方法执行期间不会改变局部变量表的大小。

    3.本地方法栈(Native Method Stacks)
        和虚拟机栈发挥的作用是很相似的,其差别只是是虚拟机栈为虚拟机仅仅想你个Java方法(也就是字节码)服务。而本地方法栈则是为虚拟机使用到的Nativce方法服务。虚拟机规范中对本地方法栈的方法使用的语言、使用方式与数据结构并没有强制规定。因此详细的虚拟机能够自由实现它。甚至有的虚拟机(譬如Sun
HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

    4.Java堆
        对大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存最大的一块

Java堆是被全部线程共享的一块内存区域。在虚拟机启动时创建。词内存区域的唯一目的就是存放对象实例。差点儿全部的对象实例都在这里分配内存。

这一点在Java虚拟机规划中的描写叙述是:全部的对象实例以及数组都要在堆上分配,可是随着JIT编译器的发展与逃逸分析技术的逐渐成熟。栈上分配、标量替换优化技术将会导致一些微妙的变化发生。全部的对象都分配在对上也渐渐变得不是那么“绝对了”。

    同一时候Java堆还是垃圾收集器管理的主要区域。因此非常多时候也被称作"GC 堆"(Garbage Collected Heap)。假设从内存回收的角度看,因为如今的收集器基本都是採用的分代收集算法,所以Java堆中还能够细分为:新生代和老年代

    5.方法区
        方法区(Method Area)和Java堆一样。是各个线程共享的内存区域。它用于存储已被虚拟机载入的类信息、常量、静态变量、即时编译器后的代码等数据

尽管Java虚拟机规范把方法区描写叙述为堆的一个逻辑部分。可是它却有一个别名叫做Non-Heap(非堆)。目的应该是与Java堆区分开来。


    6.执行时常量池(Runtime Constant Pool)
        执行时常量池是方法区是一部分。Class文件里除了有类的版本号、字段、方法、接口等描写叙述信息外,另一项信息是常量池。用于存放编译器生成的各种字面量和符号引用,这部分内存将在类载入后存放到方法区的执行时常量池中。
        相对于Class文件常量池的另外一个重要特征是具备动态性。Java语言并不要求常量一定仅仅能在编译期产生,也就是并不是预置入Class文件里常量池的内存才干进入方法区执行时常量池。执行期间也可能将新的常量放入池中,这样的特性被开发者利用得比較多的便是String类的intern方法。
        既然执行时常量池是方法区的一部分,自然会收到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemryError异常。

    
    7.直接内存(Direct Memory)
        直接内存并非虚拟机执行时数据区的一部分。也不是Java虚拟机规范中定义的内存区域,可是这部分内存也被频繁地使用,并且也可能导致OutOfMemoryError异常出现。
        在JDK1.4中新增加了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/O方式,它能够使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。

这样能在一些场景中显著提高性能,由于避免了在Java堆和Native堆中来回复制数据。

        显然。本机直接的内存分配不会收到Java堆大小的限制。可是。既然是内存。则肯定还是会受到本机总内存(包含RAM以及SWAP区或者分页文件)的大小及处理器寻址空间的限制。server管理员配置虚拟机參数时,通常会依据实际内存设置-Xmx等參数信息。但常常会忽略掉直接内存,使得各个内存区域的总和大于物理内存限制(包物理上的和操作系统级的限制)。从而导致动态扩展时出现OutOfMemoryError异常。 



01-Jvm 内存区域复习笔记的更多相关文章

  1. JVM基础知识(1)-JVM内存区域与内存溢出

    JVM基础知识(1)-JVM内存区域与内存溢出 0. 目录 什么是JVM 运行时数据区域 HotSpot虚拟机对象探秘 OutOfMemoryError异常 1. 什么是JVM 1.1. 什么是JVM ...

  2. JVM内存区域模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆” ,"perm",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共 ...

  3. 初始jvm(一)---jvm内存区域与溢出

    jvm内存区域与溢出 为什么学习jvm 木板原理,最短的一块板决定一个水的深度,当一个系统垃圾收集成为瓶颈的时候,那么就需要你对jvm的了解掌握. 当一个系统出现内存溢出,内存泄露的时候,因为你懂jv ...

  4. JVM内存区域详解

    本文分为两部分:一是JVM内存区域的讲解:二是常见的内存溢出异常分析. 1.JVM内存区域 java虚拟机在执行java程序的过程中会把它管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途, ...

  5. Java虚拟机------JVM内存区域

    JVM内存区域运行时数据区域分为两种: JVM内存区域 运行时数据区域分为两种: 线程隔离的数据区: 程序计数器 Java虚拟机栈 本地方法栈 所有线程程共享的数据区: Java堆 方法区 JVM 内 ...

  6. JVM内存区域划分及垃圾回收

    第一部分.闲扯+概述 近来在研读<深入理解java虚拟机>一书,读完之后做个小结,算是记录一下自己的学习所得,在成长的路上,只能死磕. 要理解JVM,就要先从其内存区域划分开始,知道其由几 ...

  7. JVM 内存区域 (运行时数据区域)

    JVM 内存区域 (运行时数据区域) 链接:https://www.jianshu.com/p/ec479baf4d06 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它所管理的内 ...

  8. 走进JVM【二】理解JVM内存区域

    引言 对于C++程序员,内存分配与回收的处理一直是令人头疼的问题.Java由于自身的自动内存管理机制,使得管理内存变得非常轻松,不容易出现内存泄漏,溢出的问题. 不容易不代表不会出现问题,一旦内存泄漏 ...

  9. JVM内存区域的划分(内存结构或者内存模型)

    JVM内存区域的划分(内存结构或者内存模型)   运行时数据区域: 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 程序计数器(线程私有): 是当前线程所 ...

随机推荐

  1. APUE 学习笔记 —— 文件I/O

    本章节主要讲了 Linux 系统下的关于文件I/O操作的几个函数:open.read.write.lseek.close 的使用和需要注意的一些细节.接着,又介绍了多进程见如何共享文件.下面开始知识点 ...

  2. caioj 1076 动态规划入门(中链式3:最大的算式)

    一开始写了一个复杂度很大的方法,然后还过了(千万记得开longlong ) #include<cstdio> #include<cstring> #include<alg ...

  3. HNU 12933 Random Walks Catalan数 阶乘求逆元新技能

    一个Catalan数的题,打表对每个数都求一次逆元会T,于是问到了一种求阶乘逆元的打表新方法. 比如打一个1~n的阶乘的逆元的表,假如叫inv[n],可以先用费马小定理什么的求出inv[n],再用递推 ...

  4. shiro整合thymeleaf

    1.引入依赖 <!--thymeleaf中使用shiro--> <dependency> <groupId>com.github.theborakompanioni ...

  5. 【Henu ACM Round#19 B】 Luxurious Houses

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 从右往左维护最大值. 看到比最大值小(或等于)的话.就递增到比最大值大1就好. [代码] #include <bits/std ...

  6. POJ 1088: 滑雪(经典 DP+记忆化搜索)

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 74996   Accepted: 27818 Description ...

  7. Android 6.0 执行时权限处理全然解析

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/50709663: 本文出自:[张鸿洋的博客] 一.概述 随着Android 6. ...

  8. CodeForces 570B Simple Game 概率

    原题: http://codeforces.com/contest/570/problem/B 题目: Simple Game time limit per test1 second memory l ...

  9. Exception: Operation xx of contract xx specifies multiple request body parameters to be serialized without any wrapper elements.

    Operation 'CreateProductCodeStock' of contract 'IChileService' specifies multiple request body param ...

  10. 23. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题1

    这个是angular1.6默认给hash路由上添加了!(感叹号),导致出错,修改方法如下(添加配置,去掉默认前缀感叹号):   angular.module('routingDemoApp',['ng ...