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. 惊艳发现VS工具python项目Search Paths的应用

    之前,在没有发现VS工具python项目Search Paths的应用时,举个例子:假如项目的文件目录如下: maintest/maintest.py想要使用common/tools.py文件时,不得 ...

  2. Plotting trees from Random Forest models with ggraph

    Today, I want to show how I use Thomas Lin Pederson's awesome ggraph package to plot decision trees ...

  3. 初码-Azure系列-如何在控制面板中选择中文版操作系统

    之前在文章<初码-Azure系列-记一次从阿里云到Azure的迁移和部署>中说到,默认的Windows Server 2016操作系统是英文版,后来摸索出中文版的方法,如下:

  4. C# Ajax 返回json数据--前后台交互

    本人实习生一枚,遇到这个问题,网上找的试了试基本可以,自己搞了一下.可以供新手参考,大神如有指点,请不吝赐教. 版权声明:本文为博主原创文章,未经博主允许不得转载. 前台JavaScript代码: & ...

  5. JavaSE教程-04Java中循环语句for,while,do···while

    ** Java的循环语句 ** 引入: 生活中有循环,程序的世界也有循环. 思考:生活中有哪些循环的事情? 总结:什么是循环? 重复做类似的事情,而且有终止条件,如果没有终止条件会是怎样? 类似这样的 ...

  6. PHP版本替换, phpinfo和php -v显示版本信息不一致

    环境:OS X EI Capitan 10.11 & lnmp 背景: 1想将lamp(xampp安装的,php5.2)换成 lnmp(php7.0)   2php5.2卸载(xampp卸载& ...

  7. MySQL 5.7中 performance_schema 替代 show profile 命令

    本文出处:http://www.cnblogs.com/wy123/p/6979499.html show profile 命令用于跟踪执行过的sql语句的资源消耗信息,可以帮助查看sql语句的执行情 ...

  8. mysql revise

    DATABASE create database db_name; use db_name; alter database db_name; drop database db_name; show d ...

  9. Spring 依赖注入之从不会到稍微会一点儿

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  10. 使用外部容器运行spring-boot项目:不使用spring-boot内置容器让spring-boot项目运行在外部tomcat容器中

    前言:本项目基于maven构建 spring-boot项目可以快速构建web应用,其内置的tomcat容器也十分方便我们的测试运行: spring-boot项目需要部署在外部容器中的时候,spring ...