博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java内存区域
阅读量:6419 次
发布时间:2019-06-23

本文共 1072 字,大约阅读时间需要 3 分钟。

hot3.png

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

 

11225534_hdZB.jpg

 

11225534_Czie.png

 

 

  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版)

转载于:https://my.oschina.net/xiaowangqiongyou/blog/1535462

你可能感兴趣的文章
降低数据中心能源消耗
查看>>
《Python Cookbook(第3版)中文版》——1.8 与字典有关的计算问题
查看>>
《提高转化率!网页A/B测试与多变量测试实战指南》一2.5 勇气与责任心
查看>>
深入实践Spring Boot3.2 控制器设计
查看>>
《微信小程序:开发入门及案例详解》—— 导读
查看>>
降低JRuby的内存占用的可能方法
查看>>
如何创建和使用Python CGI脚本
查看>>
RHCSA 系列(九): 安装、配置及加固一个 Web 和 FTP 服务器
查看>>
《jQuery、jQuery UI及jQuery Mobile技巧与示例》——3.7 示例:添加函数的返回结果...
查看>>
并发集合(一)引言
查看>>
如何写gdb命令脚本
查看>>
Android ListView展示不同的布局
查看>>
oracle 表(下)
查看>>
iOS宏(自己使用,持续更新)
查看>>
手把手玩转win8开发系列课程(3)
查看>>
NGINX引入线程池 性能提升9倍
查看>>
《淘宝技术这十年》读书笔记 (四). 分布式时代和中间件
查看>>
linux下mongodb定时备份指定的集合
查看>>
SMP架构多线程程序的一种性能衰退现象—False Sharing
查看>>
choose MariaDB 10 or 5.x
查看>>