Java内存区域划分

Java虚拟机运行时的数据区大致可划分为五部分:方法区,堆(两部分组成Java堆内存),虚拟机栈,本地方法栈(Java栈内存),程序计数器。

1.程序计数器

程序计数器占较小的内存空间,可看作当前线程所执行的字节码的行号指示器。由于虚拟机的多线程通过线程轮流切换并分配处理器执行时间来实现的,所以在任何一个时候,一个处理器都只会执行一个线程中的指令。因此,对于每个线程,必须要通过程序计数器来对其进行标志,从而进行区分。各程序计数器之间是相互独立存储的。称程序计数器所占有的这部分内存为”线程私有“的内存

2.Java虚拟机栈

Java虚拟机栈也是线程私有的。虚拟机栈描述的是Java方法执行的内存模型;每个方法在执行的同时都会创建一个栈帧用来存储局部变量表(放置了各种编译期已知的各种基本数据类型、对象引用类型和returnAddress类型)、操作数栈、动态链接等信息。每个方法从调用直到执行结束,可以看作栈帧在虚拟机栈中从进栈到出栈的过程。其中,64位长度的long和double类型的数据会占用2个局部变量空间。

Java虚拟机中,规范了两种异常情况,分别为:如果线程请求的栈深度大于虚拟机所允许的深度,则会发生StackOverflowError;如果虚拟机栈动态扩展内存时未能申请到足够的内存,则会发生OutOfMemoryError异常。

     3.本地方法栈

     虚拟机栈是为虚拟机执行Java方法服务,而本地方法栈则为虚拟机所使用的Native方法服务。本地方法栈的语言类型、使用方式和数据结构并未有强制规定。有的虚拟机甚至将本地方法栈和虚拟机栈进行合并(Sun公司的HotSpot虚拟机等)。除此之外,本地方法栈中同时会出现StackOverflow和OutOfMemory异常。

 4.Java堆

Java堆是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。它存在的唯一目的是存放对象实例。

     Java堆是垃圾收集器回收的主要区域,因此有时也被程为”GC“堆。现有的回收器大多是采用分代收集方法的,因此Java堆可划分为:新生代和老年代。基本上分别占有的内存区域为1:2;其中Java堆可进一步细致划分为:Eden空间、From Survivor空间、To Survivor空间。比例为:8:1:1.

Java堆可以使内存连续的,也可以是不连续的,只要逻辑上连续即可。在实现上,可以是固定大小的,也可以是可扩展的。主流的虚拟机都是按照可扩展的设计的。当堆中没有内存进行对象实例化时,也会抛出OutOfMemory异常。(OCM异常是常见的异常。)

5.方法区

方法区也是被所有线程共享的一个内存区域。用于存储虚拟机加载类的类信息、常量、静态变量、即时编译器编译后的代码等数据。有个别名为NON-HEAP。目的是与Java堆进行区分。

人们更愿意将方法区成为永久代,两者本质上不等价。只不过HotSpot将GC分代扩展至方法区而已,或者说利用永久代实现方法区而已

Java虚拟机-----------Java内存区域与内存溢出异常的更多相关文章

  1. 深入理解java虚拟机系列(一):java内存区域与内存溢出异常

    文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上 ...

  2. 【深入Java虚拟机】之一:Java内存区域与内存溢出

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17565503 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若 ...

  3. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  4. 【深入Java虚拟机(1)】:Java内存区域与内存溢出

    原文出处: 兰亭风雨 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器.Jav ...

  5. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  6. 读书笔记,《深入理解java虚拟机》,第二章,java内存区域与内存溢出异常

    第二节,运行时数据区域.    在这个章节中,作者给出了一个java虚拟机运行时数据区的框图,图的左侧是方法区和堆,这两个数据区是所有的线程所共享的.然后是虚拟机栈.本地方法栈.还有程序计数器,这三个 ...

  7. 深入了解Java虚拟机(1)java内存区域与内存溢出异常

    java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有,用于存储当前所执行的指令位置 2.Java虚拟机栈:线程私有,描叙Java方法执行模型:执行方法时都会创建一个栈帧,存储局 ...

  8. 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常

    Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...

  9. 深入理解java虚拟机---->java内存区域与内存溢出异常

    2. java内存区域于内存溢出异常 2.1 概述: 对于C/C++而言,内存管理具有最高的权利,既拥有每一个对象的“所有权”,又担负着每一个对象生命开始到结束的维护责任. 对于java而言,则把内存 ...

  10. java虚拟机(一)-java内存区域与内存溢出异常

    1.简述:java虚拟机在执行java程序的过程中,会把他所管理的内存分为以下几个区域, 1.1.程序计数器 1.2.虚拟机栈 1.3.本地方法栈 1.4.java堆 1.5.方法区 如图所示: 2. ...

随机推荐

  1. 使用nodejs爬前程无忧前端技能排行(半半成品)

    最近准备换工作,需要更新一下技能树.为做到有的放矢,想对招聘方的要求做个统计.正好之前了解过nodejs,所以做了个爬虫搜索数据. 具体步骤: 1.  先用fiddler分析请求需要的header和b ...

  2. android组团开发站立会议第三周第一次会议

    会议时间:组队开发第三周  星期一   开始时间晚上9:30-10:00 会议地点:学一食堂 二楼 到会人员:李志岩  王亚蕊 安帅 薛禄坤 张新宇 孙存良 会议概要:              1. ...

  3. grok 匹配log4j

    input { file { codec => multiline { pattern => "^\[2016" negate => true what => ...

  4. FreeMarker标签

    目前最流行的两种模板技术恐怕要算freemarker和velocity了,webwork2.2对两者都有不错的支持,也就是说在webwork2中你可以随意选择使用freemarker或velocity ...

  5. 虚拟机安装Android最详细教程

    虚拟机想必大家都听说过,有些同学还用过.虚拟机可以模拟出一个操作系统,基于物理机创建.可以模拟常见的 Windows,ubuntu等等. 在使用虚拟机的过程中,想必大家都遇到过一些棘手的问题,尤其是安 ...

  6. 【T-SQL】系列文章全文目录(2017-06-02更新)

    本系列[T-SQL]主要是针对T-SQL的总结. T-SQL基础 [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础]02.联接查询 [T-SQL基础]03.子查询 [T-SQL基础 ...

  7. Java文件流之练习

    1 )将"今年是反法西斯胜利70周年,举国欢庆,所以要放假啦" 字符串 使用文件字符输出流 写入到oldhappy.txt文件中,复写10000行, 要求换行 在文件的开头写入当前 ...

  8. PHP的SQL注入技术实现以及预防措施

    SQL 攻击(SQL injection,台湾称作SQL资料隐码攻击),简称注入攻击,是发生于应用程序之数据库层的安全漏洞.简而言之,是在输入的字符串之中注入SQL指 令,在设计不良的程序当中忽略了检 ...

  9. Spring学习(24)--- AOP之 Aspect instantiation models(aspect实例模式)特别说明

    重要: schema-defined aspects只支持singleton model,即 基于配置文件的aspects只支持单例模式

  10. nodejs构建多房间简易聊天室

    1.前端界面代码 前端不是重点,够用就行,下面是前端界面,具体代码可到github下载. 2.服务器端搭建 本服务器需要提供两个功能:http服务和websocket服务,由于node的事件驱动机制, ...