热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

简单了解JAVA内存区域效果知识

这篇文章主要介绍了简单了解JAVA内存区域效果知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了简单了解JAVA内存区域效果知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

JAVA内存区域介绍

程序计数器:

  • 线程私有,很小的内存空间,可以看做是当前线程所执行的字节码的行号指示器;
  • 每个线程都有一个独立的程序计数器,各个线程之间的计数器相互不影响,独立存储;
  • 如果线程执行的是Java 方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址,如果是一个Native方法,那么这个计数器的值则为undefined;
  • 该内存区域不会发生任何的OutOfMemoryError的情况(JAVA虚拟机规范中未规范)。
  • goto 保留字(Java当前版本暂且不用,也不让别人用),具体跳转到某一行,其实就是在操作程序计数器。

在虚拟机的概念模型中,字节码解释器的工作就是通过改变程序计数器的值来取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复都等都需要依赖这个程序计数器。

Java 虚拟机栈

  • 线程私有,生命周期和线程相同;
  • 为虚拟机执行JAVA方法服务;
  • 描述JAVA方法执行的动态内存模型;
  • 栈帧:每个方法在执行时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息,每一个方法的从调用到完成的过程,都对应对的虚拟机栈的入栈到出栈的过程。
  • 局部变量表:
    • 存放编译期可知的各种基本数据类型,引用类型,returnAddress类型
    • 局部变量表的内存空间是在编译期完成分配,当进入一个方法时,这个方法需要在帧分配多少内存是固定的, 在方法运行期间是不会改变局部变量表的内存大小的。
  • 如果线程请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError异常;
  • 如果虚拟机栈可以动态扩展(Jvm可动态也可以动态长度的虚拟机栈),当扩展到无法申请到足够的内存时,抛出OutOfMemoryError异常。

本地方法栈

  • 线程私有
  • 为虚拟机执行Native方法服务;
  • 作用与JAVA虚拟机栈相同,只是作用域的区别;
  • 如果本地方法请求的栈深度大于虚拟机所允许的深度,抛出StackOverflowError异常;
  • 如果虚拟机栈可以动态扩展(Jvm可动态也可以动态长度的虚拟机栈),当扩展到无法申请到足够的内存时,抛出OutOfMemoryError异常。

JAVA堆

  • 线程共享
  • JAVA虚拟机所管理的内存中最大的一块;
  • 在虚拟机启动时创建;
  • 存放对象实例(所有的对象实例和数组);
  • 垃圾收集器管理的主要区域;
  • 新生代、老年代、Eden空间;
  • 可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可;
  • 可选择固定大小或者动态扩展;
  • -Xms -Xmx 调整堆初始化大小和扩展大小;
  • 在堆中没有内存完成实例分配并且堆无法继续扩展时,抛出OutOfMemoryError异常。

方法区

  • 线程共享;
  • 存储已被虚拟机加载的类信息,常量,静态变量,即时编辑器编译后的代码等数据;
  • 类信息:
    • 类的版本
    • 字段
    • 方法
    • 接口
  • 可选择固定大小或者动态扩展;
  • 可选择不实现垃圾回收;
  • 当无法满足内存分配的时,抛出OutOfMemoryError异常。

运行时常量区

  • 方法区的一部分;
  • Class文件中除了有类的版本、字段、方法等描述信息外,还有常量池,这个主要用于存放编译期生成的各种字面量和符号引用,在类加载时进入方法区的运行时常量池中;
  • 因为属于方法区的一部分,所以当无法满足内存分配的时,抛出OutOfMemoryError异常。

直接内存

  • 不属于运行时数据区的一部分,也不是JAVA虚拟机规范中定义的内存区域;
  • 不收JAVA内存限制,但是受物理内存的限制,各个内存总和大约物理内存限制,在动态扩展时出现OutOfMemoryError异常。

在JDK1.4中新加入NIO(new Input/Output)类,引入了一种基于通道(Channel)与缓存区(Buffer)的I/O方式,他可以使用Native函数库直接分配堆外内存,然后通过一个存储在JAVA堆中的DirectByteBuffer对象作为这块内存的引用进行操作,这样可以显著提高性能,因为避免了在JAVA堆中和Native堆中来回复制数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Power Query中的删除错误/空值操作详解
    本文详细介绍了在Power Query中进行删除错误和删除空值的操作方法。首先通过转换数据选项将数据源导入到Power BI Desktop中,然后进入Power Query查询编辑器界面,将需要更换类型的字段转换为整数类型。对于出现Error值的字段,可以选择删除错误或替换错误指令进行操作。对于出现null值的数据,可以通过下拉筛选按钮勾选掉null进行删除。最终的操作结果如图所示。本文的内容旨在帮助读者学习Power Query中的删除错误和删除空值操作,并便于日后的数据处理和分析。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 微软发布OneNote for WordPress插件,支持一键从OneNote获取内容发布
    微软今日发布了OneNoteforWordPress插件,该插件支持从OneNote一键获取 ... [详细]
  • Pycharm编辑器取消双击shift弹出搜索框的方法
    在使用Pycharm编辑器时,双击shift会弹出搜索框界面,导致输入失去焦点,给用户带来不便。本文介绍了取消双击shift弹出搜索框的方法:在Pycharm中双击shift,输入registry并回车,找到“ide.suppress.double.click.handler”并勾选后,关闭即可解决该问题。通过这个方法,你再也不会被shift问题困扰了。 ... [详细]
  • 如何使用迅捷PDF编辑器给PDF文件设置全屏动画
    本文介绍了使用迅捷PDF编辑器给PDF文件设置全屏动画的方法,包括安装软件、添加PDF文件、设置动画效果和页面范围等步骤,帮助用户实现PDF文件的全屏动画效果。操作简单,适用于华为全屏等设备。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 本文讨论了在PHP中将空格转换为问号的问题,并提供了解决方案。文章指出,空格不是标准的空格,而是特殊的0xC2 0xA0字符。作者尝试使用mb_convert_encoding函数将utf8字符串转换为gbk编码,但未成功。文章建议检查编辑器是否对空格进行了特殊处理,并提供了使用base64_encode函数打印结果的方法。最后,给出了完整的代码示例。 ... [详细]
  • 本文详细介绍了Vim编辑器中的三种模式(命令模式、末行模式和编辑模式)以及它们之间的操作区别和切换方法。Vim编辑器凭借其多种命令快捷键和高效率的操作方式,得到了广大厂商和用户的认可。对于想要高效操作文本的用户来说,了解这些模式的使用方法是必不可少的。 ... [详细]
  • 本文介绍了三种方法来关闭win7电脑开机硬盘自检,分别是使用命令提示符、注册表编辑器和bios设置界面。通过取消硬盘自检可以加快电脑启动速度。详细步骤和操作说明在正文中有详细介绍。 ... [详细]
  • Win7系统如何实现Ctrl+Alt+Del热键组合呼出任务管理器
    本文介绍了在Win7系统中如何通过组策略编辑器设置,实现Ctrl+Alt+Del热键组合呼出任务管理器的方法。通过删除原有的项目并设置呼出任务管理器,用户可以方便地使用Ctrl+Alt+Del热键组合来打开任务管理器。 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
  • OC渲染器和阿诺德渲染器的特点及适用范围
    本文介绍了C4D软件自带的渲染器效果较差的问题,并推荐了四款C4D渲染器,其中包括OC渲染器和阿诺德渲染器。OC渲染器渲染速度快,简单易用,特别适合小团队和个人使用,而阿诺德渲染器具有超快的预览功能和真实的渲染效果,适合在体积光处理方面使用。两款渲染器都支持多个C4D版本和不同操作系统。 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
author-avatar
邹balitas_611
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有