当前位置: 首页 > 编程笔记 >

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

容柏
2023-03-14
本文向大家介绍简单了解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堆中来回复制数据。

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

 类似资料:
  • 本文向大家介绍简单了解JAVA内存泄漏和溢出区别及联系,包括了简单了解JAVA内存泄漏和溢出区别及联系的使用技巧和注意事项,需要的朋友参考一下 1、内存泄漏memory leak :   是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 2、内存溢出 out of memory :   指程序申请内存时,没有足够的内存供申请者使用

  • 一、Java内存区域 方法区(公有): 用户存储已被虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等数据。异常状态 OutOfMemoryError 其中包含常量池:用户存放编译器生成的各种字面量和符号引用。 堆(公有): 是JVM所管理的内存中最大的一块。唯一目的就是存放实例对象,几乎所有的对象实例都在这里分配。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。异

  • 问题内容: 我已经阅读了很多有关Java内存区域的信息,但看起来只是一团糟。主要是由于引入了新区域而不是java8。现在有问题: java8 +中包括哪些区域? 其中的方法和变量存储之前java8和java8 +? 除了类元数据信息外,是否存储任何其他内容? 存储器区域的结构是否取决于的实现? 谢谢您的回答。 问题答案: 内存区域的结构是否取决于JVM的实现? 绝对。PermGen或Metaspa

  • 本文向大家介绍简单了解python的内存管理机制,包括了简单了解python的内存管理机制的使用技巧和注意事项,需要的朋友参考一下 Python引入了一个机制:引用计数。 引用计数 python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。 总结一下对象会在

  • 本文向大家介绍简单了解JAVA SimpleDateFormat yyyy和YYYY的区别,包括了简单了解JAVA SimpleDateFormat yyyy和YYYY的区别的使用技巧和注意事项,需要的朋友参考一下 最近有一个功能是对输入的日期格式化,设计给出的范例是 YYYY-MM-dd HH:mm:ss,于是我简单验证了一下是可以的,然后就这么在手册里写了。然后偶然发现有地方也用yyyy啊,这

  • 本文向大家介绍简单了解java中int和Integer的区别,包括了简单了解java中int和Integer的区别的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了简单了解java中int和Integer的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1、Integer是int的包装类,int则是java的一种基本数据类型 2、I