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

 更新时间:2019年10月31日 09:03:23   作者:晚安,Jake  
这篇文章主要介绍了简单了解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堆中来回复制数据。

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

相关文章

  • SpringMVC中@ModelAttribute注解的使用教程

    SpringMVC中@ModelAttribute注解的使用教程

    在SpringMVC中,我们可以通过使用@ModelAttribute注解标记方法,实现类似于Struts2中Preparable拦截器的效果,这篇文章主要给大家介绍了关于SpringMVC中@ModelAttribute注解使用的相关资料,需要的朋友可以参考下
    2021-08-08
  • JDK1.7的ConcurrentHashMap源码解析

    JDK1.7的ConcurrentHashMap源码解析

    这篇文章主要介绍了JDK1.7的ConcurrentHashMap源码解析,HashMap是非线程安全的,而HashTable是线程安全的,但是HashTable实现同步的方法比较暴力,即在所有的方法体上添加synchronized关键字,需要的朋友可以参考下
    2023-12-12
  • Java实现图片裁剪功能的示例详解

    Java实现图片裁剪功能的示例详解

    这篇文章主要介绍了如何利用Java实现图片裁剪功能,可以将图片按照自定义尺寸进行裁剪,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-01-01
  • 浅析Java中Future接口的使用方法

    浅析Java中Future接口的使用方法

    在Java开发中,异步编程是提高系统性能和响应能力的重要手段之一。本文将深入探讨Future接口的原理和源码解读,帮助读者更好地理解Future接口的工作机制和使用方法
    2023-05-05
  • springboot接口接收数组及多个参数的问题及解决

    springboot接口接收数组及多个参数的问题及解决

    这篇文章主要介绍了springboot接口接收数组及多个参数的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • spring+hibernate 两种整合方式配置文件的方法

    spring+hibernate 两种整合方式配置文件的方法

    本篇文章主要介绍了spring+hibernate 两种整合方式配置文件的方法,主要有两种方式 1、注解方式 2、xml方式实现,有兴趣的可以了解一下。
    2017-04-04
  • Spring根据XML配置文件注入属性的方法

    Spring根据XML配置文件注入属性的方法

    下面小编就为大家带来一篇Spring根据XML配置文件注入属性的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • springboot工程jar包部署到云服务器的方法

    springboot工程jar包部署到云服务器的方法

    这篇文章主要介绍了springboot工程jar包部署到云服务器的方法,本文通过实例介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • Springboot接口参数校验的方法

    Springboot接口参数校验的方法

    在设计接口时我们通常需要对接口中的非法参数做校验,以降低在程序运行时因为一些非法参数而导致程序发生异常的风险,这篇文章给大家介绍Springboot接口参数校验的方法,感兴趣的朋友一起看看吧
    2024-03-03
  • Java 给PPT添加动画效果的示例

    Java 给PPT添加动画效果的示例

    这篇文章主要介绍了Java 给PPT添加动画效果的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04

最新评论