文档章节

Java内存区域

小王穷遊
 小王穷遊
发布于 2017/09/11 22:52
字数 718
阅读 16
收藏 0

java虚拟机在运行时,讲内存划分为若干不同的数据区域,如下图所示:

 

 

 

 

  1. 程序计数器
            当前线程所执行的字节码的信号指示器。
            在虚拟机的概念模型中,字节码解释器,就是通过改变这个计数器的值,来选择下一条需要执行的字节码指令。分支、循环、跳转、异常处理、线程恢复等基础功能。
            为了线程切换后,能恢复到正确的执行位置,每个线程都独立拥有一个程序计数器。
            唯一的一个在Java虚拟机规范中,没有规定任何OutOfMemoryError情况的区域。
     
  2. 虚拟机栈
            Java方法执行的内存模型。
            每个方法执行时,都会创建一个栈帧,用于存储:局部变量表操作数栈动态链接方法出口等信息。
            局部变量表:基本数据类型、对象引用(起始地址、代表对象的句柄、对象的相关位置)、returnAddress。局部变量表所需的空间,在编译阶段就完全确定。
            Java虚拟机在这个区域规定了两种异常:StackOverFlowError、OutOfMemoryError。
     
  3. 本地方法栈
            Native方法执行的内存模型。
            Java虚拟机在这个区域规定了两种异常:StackOverFlowError、OutOfMemoryError。
     

  4.         所有的实例对象以及数组都要在堆上分配。但是随着JIT编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。
            线程共享。
            Java堆可以物理上不连续,只要逻辑上连续即可。
            异常:OutOfMemoryError
     
  5. 方法区
            用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。
            线程共享。内存回收目标:常量池的回收、类型的卸载。
            异常:OutOfMemoryError
            运行时常量池:用于存放编译期生成的各种字面量和符号引用。运行期间也可能有新的常量加入,比如String类的intern()方法。
     
  6. 直接内存
            并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
            NIO类,可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。可以显著提升性能。避免了在Java堆和Native堆中来回复制数据。
            分配虚拟机内存时,需注意。各个内存区域总和,不能大于物理内存限制。

 

    注:参考《深入理解Java虚拟机》(第2版)

© 著作权归作者所有

共有 人打赏支持
小王穷遊
粉丝 7
博文 61
码字总数 19881
作品 0
成都
程序员

暂无文章

简单谈一谈压力测试

最近,在做API的压力测试,趟了不少坑,然后呢,简要记录一下。 压测前需要准备的一些事 拿到API文档不要立马上手,先基准测试,就是执行一次接口测试,至少要压这个接口,要先熟悉一下他的参...

浮躁的码农
28分钟前
0
0
PHP 错误调查

一.定义:PHP错误是由PHP无法读懂执行的代码引起的错误。 二:错误日志 error log 1.在php.ini 里设置 log_errors = on, log文件位置 error_log=/tmp/php_errors.log 2.代码里设置ini_set('...

忙碌的小蜜蜂
31分钟前
0
0
knn算法

import numpy as np def CreateDateSet(): group = np.array([[1.0, 2.0], [1.2, 0.1], [0.1, 1.4], [0.3, 3.5]]) labels = ['A','A','B','B'] return group,labels coding:utf-8 from numpy......

南桥北木
32分钟前
0
0
自己手写一个 SpringMVC 框架

前端框架很多,但没有一个框架称霸,后端框架现在Spring已经完成大一统.所以学习Spring是Java程序员的必修课. Spring 框架对于 Java 后端程序员来说再熟悉不过了,以前只知道它用的反射实现的,...

别打我会飞
今天
2
0
01-《Apache Tomcat 9》之文件索引

《Apache Tomcat 9》是《看Apache官方文档学英语》的第一个专栏!让我们一起在看文档的过程中学英语,在学英语的过程中夯实技术! Documentation Index - 文件索引 Introduction - 介绍 This...

飞鱼说编程
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部