本内容由《深入理解java虚拟机》的部分读书笔记整理而成,本读者计划连载。

通过如下图和文字介绍来了解几个运行时数据区的概念。

方法区:它是各个线程共享的区域,用于内存已被VM加载的类信息、常量、静态变量、即时编译器编译的代码等数据。JVM规范对这个区域的限制很宽松,如同堆一样不需要连续的内存、可选择固定大小、可扩展的大小外,还可以选择不实现垃圾收集。因为在些区域的垃圾收集必要性不高且效果较差。如果回收也是常量池的回收和类型的卸载,但此操作异常困难。当方法区无法满足内存的分配时,抛OutOfMemoryError。

java堆:它是VM中所管理的最大的一块线程共享的内存。它唯一的目的就是存放对象。JVM规范中描述为所有对象及数组都要存放于此。但是由于技术的发展也并不绝对。它也是垃圾收集器管理的最主要的区域。可以被分为:新生代和老年代等其划分,这样的目的只是便于划分和回收内存。JVM规范描述为它可以是物理上不连续但逻辑上必须连续的区域。如果堆存无法再扩展时抛OutOfMemoryError。

Java 虚拟机栈:它的生命同期与线程相同,因为它是描述java方法的内存模型,每个方法被执行时都会创建一个栈帧(stack frame)用于存放局部变量表、操作栈、动态链接、方法出口等信息。每个方法从开始执行到执行完成都是一个栈帧在虚拟栈中入栈到出栈的过程。在些区域中有两种异常状况:如果线程请求栈尝试大于虚拟机所允许的深度,将抛出StackOverflowError;如果VM可以动态扩展,当扩展时无法申请到足够的内存时抛OutOfMemoryError。

本地方法栈:它与java虚拟机栈相似,区别是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对该区域中的方法使用的语言、方式、数据结构没有强制规定,具体的虚拟机可以自由实现它,比如 sun HotSpot 直接到本地方法栈和虚拟机栈合二为一。抛出的异常与虚拟机相同。

程序计数器:是一块较小的内存空间,它的作用可看成是当前线程执行的字节码的行号指示器。因为jvm的多线程是通过线程轮流切换并分配 处理器执行时间的方式来实现的,在任一时刻一个处理器只会执行一条线程中的指令。因为为了线程切换后能恢复到正确的执行位置,每个线程都要有一个独立的程序计数器。

java内存区域——深入理解JVM读书笔记的更多相关文章

  1. 深入理解JVM读书笔记思维导图

    为了证明我已经啃完这本书然后买新书不用剁手...脑图画了8个钟,感觉整个人都不好了T_T 脑细胞不知道死了多少... 其实没吃透,估计若干年后要重新翻开来看...

  2. JVM系列1:Java内存区域

    JVM系列主要分享自己都虚拟机的理解,我自学时的知识框架多来源于<深入理解Java虚拟机_JVM高级特性与最佳实践>这本书,感兴趣的朋友可直接去阅读这本书. 本系列暂定有3部分,它们是学习 ...

  3. 初识java内存区域

    目录: 1.运行时数据区域 2.对象的创建 3.对象的内存布局 4.对象的访问定位 一.运行时数据区域 基本的java虚拟机运行时数据区如下图: 下面我们就来逐个认识这几个运行时的数据区域 1.程序计 ...

  4. 深入理解java虚拟机读书笔记--java内存区域和管理

    第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...

  5. JVM学习笔记(一):Java内存区域

    由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...

  6. Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一

    Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...

  7. JVM笔记(一) Java内存区域

    Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域.每当运行一个java程序时,就会启动一个虚拟机. 具体的区域如图所示: 同时,方法区 与 ...

  8. 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域

    一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...

  9. [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常

    2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...

随机推荐

  1. JavaScript严格模式有什么不同

    看ES6,瞄到“严格模式”,问了下自己什么是“严格模式”?答案好像不是很明朗,遂总结如下: 严格模式声明:“use strict”; 1.禁止变量未声明就赋值 2.限制动态绑定(属性和方法归属哪个对象 ...

  2. 纯手工打造简单分布式爬虫(Python)

    前言 这次分享的文章是我<Python爬虫开发与项目实战>基础篇 第七章的内容,关于如何手工打造简单分布式爬虫 (如果大家对这本书感兴趣的话,可以看一下 试读样章),下面是文章的具体内容. ...

  3. CSS3的使用方法解析

    自己过去有段时间使用CSS3开发过一些小的部件和效果,但是由于太久没有再次去使用,导致当自己再次去使用的时候我就需要去翻手册重新找一次然后按着方法使用才可以. 现在我就把这份CSS3的使用技巧展示给各 ...

  4. 基于android的语音识别

    1.注册账户,添加应用 2.针对android平台的选择应用,下载SDK 3.将SDK的libs下文件拷贝到工程的libs目录下 4.添加用户权限 <uses-permission androi ...

  5. CSS实现矩形按钮右边缘的中间有个往里凹的小半圆

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 【知识整理】这可能是RxJava 2.x 最好的入门教程(一)

    一.前言 RxJava 对大家而言肯定不陌生,其受欢迎程度不言而喻.而在去年的早些时候,官方便宣布,将在一段时间后不再对 RxJava 1.x 进行维护,而在仓库中另辟蹊径,开始对 RxJava 2. ...

  7. oracle备份、还原

    ----第一步:设置空表导出 ----由于Oracle 11G在用EXPORT导出时,空表不能导出.解决方法如下:(11G中有个新特性,当表无数据时,不分配segment,以节省空间) select ...

  8. 用Html5/CSS3做Winform,一步一步教你搭建CefSharp开发环境(附JavaScript异步调用C#例子,及全部源代码)上

    本文为鸡毛巾原创,原文地址:http://www.cnblogs.com/jimaojin/p/7077131.html,转载请注明 CefSharp说白了就是Chromium浏览器的嵌入式核心,我们 ...

  9. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  10. java中String与StringBuffer拼接的区别

    学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: S ...