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. Java中的局部变量表及使用jclasslib进行查看

    直接上下载地址 jclasslib是一个独立的工具,不是包含在JDK中的工具,需要自己进行下载,下载地址如下: http://downfile.downcc.com/down/JClassLib_wi ...

  2. 1、在eclipse中导入Java的jar包方法---JDBC【图文说明】

    1.Eclipse环境下jar包导入 在Eclipse环境下编写Java程序,常常会借用到各种jar包.如:连接数据库时,导入jar包是必须的.导入方法如下: 1.打开eclipse,右击要导入jar ...

  3. Automated Front End Test - Xvfb, Chromedriver, Selenium, Jenkins

    1. Install Xvfbm, google-chrome-stable and chromedriver in Jenkins sudo apt-get install -y xvfb goog ...

  4. 数组去重,call、apply、bind之间的区别,this用法总结

    一.数组去重,直接写到Array原型链上. //该方法只能去除相同的数字 不会去判断24和'24'是不同的 所有数字和字符串数字是相同是重复的 Array.prototype.redup=functi ...

  5. Java基础知识二次学习-- 第一章 java基础

    基础知识有时候感觉时间长似乎有点生疏,正好这几天有时间有机会,就决定重新做一轮二次学习,挑重避轻 回过头来重新整理基础知识,能收获到之前不少遗漏的,所以这一次就称作查漏补缺吧!废话不多说,开始! 第一 ...

  6. 关于EF中直接执行sql语句的参数化问题

    某天 , 在review项目中代码的时候, 发现有哥们直接通过 Database.ExecuteSqlCommand("select * from order_info where  com ...

  7. 每天一道Java题[10]

    题目 阐述创建线程最常用的两种方法及其对比. 解答 方法一:继承Thread类实现 步骤: 创建Thread类的子类,如MyThread. 重写Thread类的run()方法. 实例化MyThread ...

  8. 【WPF】如何获取命令行参数

    应用程序以 Main 方法为入口点,如果为 Main 方法指定一个 string[] 类型的参数,在程序运行时,这个参数会获取到传递给应用程序的命令行参数. 而 WPF 应用程序比较特殊,因为在VS中 ...

  9. Java中设计模式之单例设计模式-1

    单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...

  10. Windows server 2008 r2 开启Aero

    1.右键“计算机”----“管理”----“添加功能”,选上“桌面体验”,一般来说要把服务器系统做成工作 站的话,最好再选上“优质WINDOWS音频视频体验”,如果有无线网卡再选上“无线LAN服务”, ...