Java自动内存管理机制
1、运行时数据区域划分

2、程序计数器
作用:可以看做是当前线程所执行的字节码的行号指示器。
解释:字节码指示器就是通过改变程序计数器的值来指定下一条需要执行的指令。分支,循环等 基础功能就是依赖程序计数器来完成的。
说明:由于java虚拟机的多线程是通过轮流切换并分配处理器执行时间来完成,一个处理器同一时间 只会执行一条线程中的指令。为了线程恢复后能够恢复正确的执行位置,每条线程都需要一个 独立的程序计数器,以确保线程之间互不影响。所以程序计数器是“线程私有”的内存。
注明:程序计数器区域是Java虚拟机中唯一没有定义OutOfMemory异常的区域
3、Java虚拟机栈
作用:虚拟机栈描述的是Java方法执行的内存模型
说明:每个方法被执行的时候都会创建一个栈帧 用于存储局部变量表,操作栈,动态链接, 方法出口等信息。每一个方法被调用的过程 就对应一个栈帧在虚拟机栈中从入栈到出 栈的过程。
异常:(1) 线程请求的栈深度大于虚拟机允许的栈深度, 将抛出StackOverflowError。
(2)虚拟机栈空间可以动态扩展,当动态扩展是无 法申请到足够的空间时,抛出OutOfMemory异常。
注明:Java虚拟机栈也是线程私有的,生命周期与线程相同

4、Java本地方法栈
说明:本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的, 而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地 方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。 在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一
注明:本地方法栈中也会抛出StackOverflowError和OutOfMemory异常。
5、Java堆
作用:Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
说明:在 Java 中,堆被划分成两个不同的区域:
(1)新生代 ( Young )。 新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor
(2)老年代 ( Old )。
目的:这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收。 注明:各个线程共享的内存区域
6、方法区、运行时常量池、直接内存
(1)方法区也是线程共享的区域,用于存储已经被虚拟机加载的类信息,常量,静态变量
(2)运行时常量池也是方法区的一部分。
(3)直接内存并不是虚拟机运行时数据区的一部分,也不是Java迅疾规范中定义的内存区域。 注明:方法区、直接内存无法满足内存分配需求时将抛出OutOfMemoryError异常。
Java自动内存管理机制的更多相关文章
- Java自动内存管理机制学习(一):Java内存区域与内存溢出异常
备注:本文引用自<深入理解Java虚拟机第二版> 2.1 运行时数据区域 Java虚拟机在执行Java程序的过程中把它所管理的内存划分为若干个不同的数据区域.这些区域都有各自的用途,以及创 ...
- Java自动内存管理机制学习(二):垃圾回收器与内存分配策略
备注:本文引自<深入理解Java虚拟机第二版>仅供参考 图片来自:http://csdn.net/WSYW126 垃圾收集器与内存分配策略 概述 GC要完成3件事: 哪些内存需要回收? 什 ...
- JVM自动内存管理机制——Java内存区域(下)
一.虚拟机参数配置 在上一篇<Java自动内存管理机制——Java内存区域(上)>中介绍了有关的基础知识,这一篇主要是通过一些示例来了解有关虚拟机参数的配置. 1.Java堆参数设置 a) ...
- JVM自动内存管理机制--读这篇就GO了
之前看过JVM的相关知识,当时没有留下任何学习成果物,有些遗憾.这次重新复习了下,并通过博客来做下笔记(只能记录一部分,因为写博客真的很花时间),也给其他同行一些知识分享. Java自动内存管理机制包 ...
- JVM自动内存管理机制——Java内存区域(上)
一.JVM运行时数据区域概述 Java相比较于C/C++的一个特点就是,在虚拟机自动内存管理机制的帮助下,我们不需要为每一个操作都写像C/C++一样的delete/free代码,所以也不容易出现内存泄 ...
- 【深入理解Java虚拟机】自动内存管理机制——垃圾回收机制
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
- 【深入理解Java虚拟机】自动内存管理机制——内存区域划分
Java与C++之间有一堵有内存动态分配和垃圾收集技术所围成的"高墙",墙外面的人想进去,墙里面的人却想出来.C/C++程序员既拥有每一个对象的所有权,同时也担负着每一个对象生 ...
- 2.1 自动内存管理机制--Java内存区域与内存溢出异常
自动内存管理机制 第二章.Java内存区域与内存溢出异常 [虚拟机中内存如何划分,以及哪部分区域.什么样代码和操作会导致内存溢出.各区域内存溢出的原因] 一.运行时数据区域 Java虚拟机所管理的内存 ...
- 深入理解Java虚拟机(自动内存管理机制)
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获, ...
随机推荐
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- hdu 5139(离线处理+离散化下标)
Formula Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- 在OpenResty中使用淘宝的concat进行css和js合并,同时支持GZIP静态压缩
=======================================================================================cd /usr/local ...
- 异步 JavaScript 之理解 macrotask 和 microtask(转)
这个知识点... https://blog.keifergu.me/2017/03/23/difference-between-javascript-macrotask-and-microtask/? ...
- MSSQL删除重复记录
SQL(根据自己需要改列名.表名): delete from tableA where id not in (select min(id) from tableA group by name,age)
- (29)C#多线程
使用线程的原因 1.不希望用户界面停止响应. 2.所有需要等待的操作,如文件.数据库或网络访问需要一定的时间. 一个进程的多个线程可以同时运行不同cpu或多核cpu的不同内核上 注意多线程访问相同的数 ...
- Codeforces Round #321 (Div. 2) A. Kefa and First Steps【暴力/dp/最长不递减子序列】
A. Kefa and First Steps time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- Python的程序结构[2] -> 类/Class[3] -> 内建类与内建函数
内建类与内建函数的区分 / Distinction of Built-in Type and Function 对于 Python,有许多可以不需要定义或引用就可以使用的函数(类)(参考内建模块),诸 ...
- postgres表空间、模式、表和用户/角色之间的关系
一. 角色(role)和用户(user) 1. role postgres=# create role kanon password 'kanon'; #使用role创建 ...
- Word中设置所有西文字体为新罗马
如图所示,不用一个一个设置,在字体里直接设置细纹字体:Times New Roman ,中文字体不用管.