java内存区域——深入理解JVM读书笔记
本内容由《深入理解java虚拟机》的部分读书笔记整理而成,本读者计划连载。
通过如下图和文字介绍来了解几个运行时数据区的概念。

方法区:它是各个线程共享的区域,用于内存已被VM加载的类信息、常量、静态变量、即时编译器编译的代码等数据。JVM规范对这个区域的限制很宽松,如同堆一样不需要连续的内存、可选择固定大小、可扩展的大小外,还可以选择不实现垃圾收集。因为在些区域的垃圾收集必要性不高且效果较差。如果回收也是常量池的回收和类型的卸载,但此操作异常困难。当方法区无法满足内存的分配时,抛OutOfMemoryError。
java堆:它是VM中所管理的最大的一块线程共享的内存。它唯一的目的就是存放对象。JVM规范中描述为所有对象及数组都要存放于此。但是由于技术的发展也并不绝对。它也是垃圾收集器管理的最主要的区域。可以被分为:新生代和老年代等其划分,这样的目的只是便于划分和回收内存。JVM规范描述为它可以是物理上不连续但逻辑上必须连续的区域。如果堆存无法再扩展时抛OutOfMemoryError。
Java 虚拟机栈:它的生命同期与线程相同,因为它是描述java方法的内存模型,每个方法被执行时都会创建一个栈帧(stack frame)用于存放局部变量表、操作栈、动态链接、方法出口等信息。每个方法从开始执行到执行完成都是一个栈帧在虚拟栈中入栈到出栈的过程。在些区域中有两种异常状况:如果线程请求栈尝试大于虚拟机所允许的深度,将抛出StackOverflowError;如果VM可以动态扩展,当扩展时无法申请到足够的内存时抛OutOfMemoryError。
本地方法栈:它与java虚拟机栈相似,区别是虚拟机栈为虚拟机执行java方法服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对该区域中的方法使用的语言、方式、数据结构没有强制规定,具体的虚拟机可以自由实现它,比如 sun HotSpot 直接到本地方法栈和虚拟机栈合二为一。抛出的异常与虚拟机相同。
程序计数器:是一块较小的内存空间,它的作用可看成是当前线程执行的字节码的行号指示器。因为jvm的多线程是通过线程轮流切换并分配 处理器执行时间的方式来实现的,在任一时刻一个处理器只会执行一条线程中的指令。因为为了线程切换后能恢复到正确的执行位置,每个线程都要有一个独立的程序计数器。
java内存区域——深入理解JVM读书笔记的更多相关文章
- 深入理解JVM读书笔记思维导图
为了证明我已经啃完这本书然后买新书不用剁手...脑图画了8个钟,感觉整个人都不好了T_T 脑细胞不知道死了多少... 其实没吃透,估计若干年后要重新翻开来看...
- JVM系列1:Java内存区域
JVM系列主要分享自己都虚拟机的理解,我自学时的知识框架多来源于<深入理解Java虚拟机_JVM高级特性与最佳实践>这本书,感兴趣的朋友可直接去阅读这本书. 本系列暂定有3部分,它们是学习 ...
- 初识java内存区域
目录: 1.运行时数据区域 2.对象的创建 3.对象的内存布局 4.对象的访问定位 一.运行时数据区域 基本的java虚拟机运行时数据区如下图: 下面我们就来逐个认识这几个运行时的数据区域 1.程序计 ...
- 深入理解java虚拟机读书笔记--java内存区域和管理
第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...
- JVM学习笔记(一):Java内存区域
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...
- Java内存区域与内存溢出异常——深入理解Java虚拟机 笔记一
Java内存区域 对比与C和C++,Java程序员不需要时时刻刻在意对象的创建和删除过程造成的内存溢出.内存泄露等问题,Java虚拟机很好地帮助我们解决了内存管理的问题,但深入理解Java内存区域,有 ...
- JVM笔记(一) Java内存区域
Java 内存区域 总概 java虚拟机在执行java程序的过程中,会把它管理的内存划分为几个不同的数据区域.每当运行一个java程序时,就会启动一个虚拟机. 具体的区域如图所示: 同时,方法区 与 ...
- 深入理解JAVA虚拟机阅读笔记1——JAVA内存区域
一.Java内存区域 1.程序计数器 线程私有. 当前线程所执行的字节码的行号指示器.由于JAVA是多线程的,因此每个线程都独立的程序计数器. 异常:没有规定任何OutOfMemeryError情况的 ...
- [深入理解JVM虚拟机]第2章-Java内存区域与内存溢出异常
2.0引-Java内存区域中,栈内存和堆内存分别装什么,为什么? 栈:解决程序的运行问题,即程序如何执行,或者说如何处理数据. 堆:解决的是数据存储的问题,即数据怎么放,放在哪儿. 参考链接https ...
随机推荐
- python 解析docx文档的方法,以及利用Python从docx文档提取插入的文本对象和图片
首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. ...
- Nginx下支持ThinkPHP的Pathinfo和URl Rewrite模式
下面介绍如何使Nginx支持ThinkPHP的Pathinfo和URL Rewrite模式. 1.ThinkPHP给出了ThinkPHP的官方解决方案,如下: 打开Nginx的配置文件 /etc/ng ...
- Java线程池入门必备
线程池 一. 线程池的简介 1.什么是线程池? 最早期的工作线程处理任务的模型.一个任务的到来,会伴随着线程的创建,当处理完任务后,线程会被销毁,资源回收.这种一个任务一个线程一系列创建销毁的模式 ...
- noip借教室 题解
题目描述 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自然 ...
- mongodb取出最大值与最小值
$res=self::aggregate([ ['$match'=>[ 'msg_id'=>1007, 'D'=>16, ]], ['$group'=>[ '_id'=> ...
- [leetcode-513-Find Bottom Left Tree Value]
Given a binary tree, find the leftmost value in the last row of the tree. Example 1: Input: 2 / \ 1 ...
- 【Android Developers Training】 20. 创建一个Fragment
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- JAVA基础——变量和常量
JAVA的变量和常量知识总结 一.认识java标识符 标识符就是用于给 Java 程序中变量.类.方法等命名的符号. 使用标识符时,需要遵守几条规则: 1. 标识符可以由字母.数字.下划线(_).美 ...
- ajax数据请求5(php格式)
ajax数据请求5(php格式): <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...
- python迭代器生成器(三)
扩展的列表解析语法 今天接着昨天的继续写. 列表解析可以变得更加复杂---例如,它可以包含嵌套的循环,也可能被编写为一系列的for子句.(这里只是简单介绍一下,以后再说这个语法的问题) 例如:构建一个 ...