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

JVM-JVM内存结构

JVM-JVM内存结构参考资料:链接:Java虚拟机的内存组成以及堆内存介绍-HollisChuangsBlog链接:Java堆和栈看这篇就够-Johnny-Zhuang

JVM-JVM内存结构

参考资料:

链接:Java虚拟机的内存组成以及堆内存介绍-HollisChuang's

Blog链接:Java堆和栈看这篇就够 - Johnny-Zhuang's Technology

Java 内存之方法区和运行时常量池 - 漠然的博客 | mritd Blog

链接:从0到1起步-跟我进入堆外内存的奇妙世界 - 简书


一、虚拟机栈

栈主要用来存储局部变量和方法的调用。栈中的内存是线程私有的并且生命周期跟线程相同。栈主要是由栈帧组成。当线程调用java的方法时候,会形成一个栈帧并压入到栈中。当栈空间不足时,会抛出StackOverFlowError异常。

栈帧主要是由局部变量表、操作数栈和帧数据区这三部分组成的。

        (1)局部变量表

                    局部变量表是由数组构成所以通过索引即可进行访问,它主要存放的是基本数据类型(short,byte,int,char,boolean,double,long)和reference类型(对象的引用),当存入一个long或者double类型的时候会在数组中形成连续的两项,要取值的时候只需取其第一个索引即可。

        (2)操作数栈

                    操作数栈主要是用来存储临时的操作数据,例如:当两个局部变量进行计算时,会先将变量入栈到操作数栈中,进行计算完成后会将结果先放在操作数栈中,所以操作数栈主要用来存放临时的数据。

        (3)帧数据区

                   帧数据区主要是通过数据用来支持常量池的解析和方法的正常返回以及异常的处理。当需要用到常量池时,JVM会使用帧数据区中指向常量池的指针。当方法正常返回时,帧里的数据会处理,使之从栈中弹出,恢复到发起调用的方法栈中,如果有返回值时,会将返回值保存到发起调用该方法的操作数栈当中。当方法抛出异常时,JVM执行catch块中的代码,如果没有,则直接终止,然后JVM用帧数据区中的数据信息恢复到发起调用该方法的栈帧中,然后向上抛出同样的异常。

二、本地方法栈

与虚拟机栈类似,主要为Native方法服务。

三、方法区

           是全局共享的一块内存区域,主要存储的是定义在类中的常量、静态变量、类中声明的方法和方法字段等。默认最小值为16MB,最大值为64MB,可用-XX:PermSize和-XX:MaxPermSize参数限制方法区的大小。

            运行常量池是方法区中的一部分。同样是全局共享的区域。运行常量池主要存放的是Class被编译器编译生成的各种符号引用。当运行时常量池无法申请到新的内存时,会抛出OutOfMemoryError异常。

四、堆

        堆是全局共享的区域,主要存放的是对象的实例以及数组(所有new的对象)。可通过-Xms(最小值),-Xmx(最大值)等参数来设置堆的大小,默认当空余堆内存大于70%时,JVM会减小堆内存到-Xms指定大小的值,默认当空余堆小于40%是,JVM会增加堆内存到-Xmx指定的大小值,为了避免运行时频繁的调整堆的大小,通常将-Xms和-Xmx设置成一样。现在收集器采用的是分代收集器,所以堆内存划分为新生代、老年代和持久代。新生代主要存储新创建的对象和尚未进入老年代的对象,老年代存储的是经过多次新生代GC依然存活的对象(例如:缓存对象)。新生代主要由Eden Space和两块一样大小的 From Space和To Space构成。

五、程序计数器

        它是当前线程所执行字节码的行号指示器。字节码解释器通过改变程序计数器来选取下一条需要执行的字节码指令,分支、循环、异常处理、线程恢复等基础功能。


推荐阅读
  • 初识java关于JDK、JRE、JVM 了解一下 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注【程序新视界】。本篇为面试题系列第2篇。常见面试问 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • JavaScript简介及语言特点
    本文介绍了JavaScript的起源和发展历程,以及其在前端验证和服务器端开发中的应用。同时,还介绍了ECMAScript标准、DOM对象和BOM对象的作用及特点。最后,对JavaScript作为解释型语言和编译型语言的区别进行了说明。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
  • 开发笔记:Python之路第一篇:初识Python
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Python之路第一篇:初识Python相关的知识,希望对你有一定的参考价值。Python简介& ... [详细]
  • 近来有一个需求,是需要在androidjava基础库中插入一些log信息,完成这个工作需要的前置条件有编译好的android源码具体android源码如何编译,这 ... [详细]
author-avatar
蓝色流星魂
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有