Java虚拟机运行时数据区:

相关区域介绍:

程序计数器:

  功能:当前线程所执行字节码的行号指示器。若是Java方法记录指令地址,若为Native方法,则不记录

  隔离性:线程隔离

  Error:无

Java虚拟机栈

  功能:描述Java方法执行的内存区:每个方法执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

  隔离性:线程隔离

  Error:线程请求的栈深度大于虚拟机所允许的深度时,抛出 StackOverflowError 异常;

     动态扩展时无法申请到足够的内存,抛出 OutOfMemoryError 异常。

  局部变量表:局部变量表所需的内存空间在编译期间分配,包含各种基本数据类型,及对象引用。

  操作数栈:操作数栈是一个后入先出栈,其最大深度也是在Code属性中已经确定了的(编译时期确定)。当执行字节码指令时,各种数据类型都会加载到操作数栈中。32位数据数据类型站1个栈容量,64位数据站2个栈容量。虚拟机实现会做一些优化。将两个操作数栈重叠一部分区域,省去额外的参数复制传递。   当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令往操作数栈中写入和提取内容,也就是出栈/入栈操作。例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。

  动态链接:Class文件的编译过程中不包含传统编译中的连接步骤,一切方法调用在Class文件里面存储的都只是符号引用,而不是方法在实际运行时内存布局中的入口地址(相当于之前说的直接引用)。这些符号引用有一部分在类加载阶段或者第一次使用的时候就直接转化为直接引用(静态解析)。有的则在每一次运行期间转化为直接引用(动态连接)。

本地方法栈:

  功能:为虚拟机使用到的Native方法服务。(虚拟机栈为Java方法(也就是字节码)服务)

  隔离性:线程隔离

  Error: StackOverflowError  和 OutOfMemoryError

Java堆:

  功能:存放对象实例

  隔离性:线程共享

  Error:OutOfMemoryError

  细分:内存回收的角度:新生代、老生代

     内存分配的角度:Java堆中可能划分出多个线程私有的分配缓冲区。

  虚拟机限制:不需要连续内存空间,可以固定大小也可扩展

 

  1. JVM将内存划分为:
  2. New(年轻代)
  3. Tenured(年老代)
  4. Perm (永久代)
  5. 其中NewTenured属于堆内存,堆内存会从JVM启动参数(-Xmx,-Xms,前者是JVM最大允许分配的堆内存,后者是JVM初始分配的堆内存)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。
  6.  
  7. 年轻代(New):年轻代用来存放JVM刚分配的Java对象
  8. 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
  9. 永久代(Perm):永久代存放ClassMethod元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。
  10. New又分为几个部分:
  11. EdenEden用来存放JVM刚分配的对象
  12. Survivor1
  13. Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被CopyTenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。
  14.   
    堆配置:
  15. -Xms:初始堆大小
  16. -Xmx:最大堆大小(如果此值大于-Xms的大小,则按需分配,因此为了避免每次垃圾回收完成后JVM重新分配内存,两个只很多时候设置成相同值)
  17. -XX:NewSize=n:设置年轻代大小
  18. -XX:NewRatio=n:设置年轻代和年老代的比值,如:n=3,表示年轻代和年老代比值是13
  19. -XX:SurvivorRatio=m:年轻代中Eden区与两个Survivor区的比值。注意Suvivor区有两个,大小一样大。如:m=3,表示EdenSurvivor=32,一个Survivor区占整个年轻代的1/5
  20. XX:MaxPermSize=p:设置持久代的大小
    参考 http://www.cnblogs.com/superpang/p/5309819.html

方法区:

  功能:存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等。

  隔离性:线程共享

  Error:OutOfMemoryError

虚拟机限制:不需要连续内存空间,可以固定大小也可扩展;此区域内存的回收主要针对常量池的回收和对类型的卸载。

  运行时常量池:方法区的一部分

    功能:用于存放编译期生成的各种字面量和符号引用,及翻译出来的直接引用

     特性:动态性,运行期间也可以将新的常量放入池中。

     Error:OutOfMemoryError

这有一篇更详细的介绍:http://blog.csdn.net/u012152619/article/details/46968883

Java虚拟机各内存区域的位置及功能的介绍的更多相关文章

  1. 从Java虚拟机的内存区域、垃圾收集器及内存分配原则谈Java的内存回收机制

    一.引言: 在Java中我们只需要轻轻地new一下,就可以为实例化一个类,并分配对应的内存空间,而后似乎我们也可以不用去管它,Java自带垃圾回收器,到了对象死亡的时候垃圾回收器就会将死亡对象的内存回 ...

  2. 1 - JVM随笔分类(java虚拟机的内存区域分配(一个不断记录和推翻以及再记录的一个过程))

    java虚拟机的内存区域分配   在JVM运行时,类加载器ClassLoader在加载到类的字节码后,交由jvm的执行引擎处理, 执行过程中需要空间来存储数据(类似于Cpu及主存),此时的这段空间的分 ...

  3. Java虚拟机之内存区域

    原创文章,转载请标明出处! 目录 一.背景 二.运行时内存区域概述 1.官方描述 2.中文翻译 3.内存区域简述 4.运行时数据区简图 5.运行时数据区详图 三.JVM线程 JVM数据区域与线程关系 ...

  4. 深入理解Java虚拟机02--Java内存区域与内存溢出异常

    一.概述 我们在进行 Java 开发的时候,很少关心 Java 的内存分配等等,因为这些活都让 JVM 给我们做了.不仅自动给我们分配内存,还有自动的回收无需再占用的内存空间,以腾出内存供其他人使用. ...

  5. 深入Java虚拟机之内存区域与内存溢出

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

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

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

  7. 如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  8. Java虚拟机:内存模型详解

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 我们都知道,当虚拟机执行Java代码的时候,首先要把字节码文件加载到内存,那么这些类的信息都存放在内存中的哪个区域呢?当我们创建一个对象实 ...

  9. java虚拟机的内存模型

    一.为什么要了解java虚拟机的内存模型 java虚拟机作为java代码运行的平台,是java技术的基石.了解java虚拟机的内存模型也就变得十分必要.它能帮助我们更好的了解java代码的运行机制,更 ...

随机推荐

  1. 1、Jsp页面

    一.JSP(java server page):是以Java语言为基础的动态网页生成技术. 1.特点: a).以 .jsp 为后缀的文本文件,不需要编译(相对于程序猿来说不需要编译) b).以html ...

  2. Spring各jar包的作用

    spring.jar是包含有完整发布的单个jar 包,spring.jar中包含除了spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到 spring-m ...

  3. JavaScript类型判断instanceof与typeof对比

    经常有人会在JavaScript里写如下的方法: function checkType() { var s1 = 123; var s2 = "OK"; if (s1 instan ...

  4. 转载:Android调用相册、拍照实现缩放、切割图片

    好几天没有写博客了,感觉都有点懈怠了.笔者参加了大学生第二届软件设计大赛,这几天 一直在弄大赛的事情,没有花些时间来整理博客.好在经过一些时日比赛的东西也弄得差不多了, 接下来就是将这段时间学习里面有 ...

  5. css-单位%号-background-size-background-position-遁地龙卷风

    (-1)写在前面 我用的是chrome49,这篇是为后续做准备.重要性的调整以及毕业资料的整体导致最近没看JQuery和H5特效,以后只能晚上看了. (0)准备 div长宽都为300px,我们一张大小 ...

  6. 好代码系列(一):LazyObject

    site-packages/django/utils/functional.py def new_method_proxy(func): def inner(self, *args): if self ...

  7. Win10安装程序出现error code 2502 2503

    在Win10中,在安装msi安装包的时候常常会出现代码为2502.2503的错误.其实这种错误是由于安装权限不足造成的,可以这种msi的安装包不像其他exe的安装程序,在安装包上点击"右键& ...

  8. Android 双击 Back 键退出程序

    双击退出程序的原理无非就是设置一个退出标识(询问是否退出),如果改变了这个标识(确认退出),则再次点击时立马退出,如果短时间内没有退出,则延时重置这个标识(不退出). ================ ...

  9. Angular2 模板语法

    1. 说明 Angular2的模板用来显示组件外观,作为视图所用,用法和html语法基本一致,最简单的Angular2的模板就是一段html代码.Angular模板语法主要包括以下几个部分: l 直接 ...

  10. ubuntu下安装nodejs,无node情况

      Updating nodejs solved the issue: npm cache clean -f npm install -g n n stable node --version node ...