听说又被 JVM 内存区域方面的面试题给虐了?看看这篇文章吧!
副问题[/!--empirenews.page--]
根基题目
拓展题目
一 概述 对付 Java 措施员来说,在假造机自动内存打点机制下,不再必要像C/C++措施开拓措施员这样为内一个 new 操纵去写对应的 delete/free 操纵,不轻易呈现内存走漏和内存溢出题目。正是由于 Java 措施员把内存节制权力交给 Java 假造机,一旦呈现内存走漏和溢出方面的题目,假如不相识假造机是奈何行使内存的,那么排查错误将会是一个很是难题的使命。 二 运行时数据地区 Java 假造机在执行 Java 措施的进程中会把它打点的内存分别成多少个差异的数据地区。JDK. 1.8 和之前的版本略有差异,下面会先容到。 JDK 1.8之前: 线程私有的:
线程共享的:
2.1 措施计数器 措施计数器是一块较小的内存空间,可以看作是当前列程所执行的字节码的行号指示器。字节码表明器事变时通过改变这个计数器的值来选取下一条必要执行的字节码指令,分支、轮回、跳转、非常处理赏罚、线程规复等成果都必要依烂魅这个计数器来完。 其它,为了线程切换后能规复到正确的执行位置,每条线程都必要有一个独立的措施计数器,各线程之间计数器互不影响,独立存储,我们称这类内存地区为“线程私有”的内存。 从上面的先容中我们知道措施计数器首要有两个浸染: •字节码表明器通过改变措施计数器来依次读取指令,从而实当代码的流程节制,如:次序执行、选择、轮回、非常处理赏罚。•在多线程的环境下,措施计数器用于记录当前列程执行的位置,,从而当线程被切换返来的时辰可以或许知道该线程前次运行到哪儿了。 留意:措施计数器是独逐一个不会呈现 OutOfMemoryError 的内存地区,它的生命周期跟着线程的建设而建设,跟着线程的竣事而衰亡。 2.2 Java 假造机栈 与措施计数器一样,Java假造机栈也是线程私有的,它的生命周期和线程沟通,描写的是 Java 要领执行的内存模子,每次要领挪用的数据都是通过栈转达的。 Java 内存可以粗拙的区分为堆内存(Heap)和栈内存(Stack),个中栈就是此刻说的假造机栈,可能说是假造机栈中局部变量表部门。(现实上,Java假造机栈是由一个个栈帧构成,而每个栈帧中都拥有:局部变量表、操纵数栈、动态链接、要领出口信息。) 局部变量表首要存放了编译器可知的各类数据范例(boolean、byte、char、short、int、float、long、double)、工具引用(reference范例,它差异于工具自己,也许是一个指向工具起始地点的引用指针,也也许是指向一个代表工具的句柄或其他与此工具相干的位置)。 Java 假造机栈会呈现两种非常:StackOverFlowError 和 OutOfMemoryError。 •StackOverFlowError:若Java假造机栈的内存巨细不应承动态扩展,那么当线程哀求栈的深度高出当前Java假造机栈的最大深度的时辰,就抛出StackOverFlowError非常。•OutOfMemoryError:若 Java 假造机栈的内存巨细应承动态扩展,且当线程哀求栈时内存用完了,无法再动态扩展了,此时抛出OutOfMemoryError非常。 Java 假造机栈也是线程私有的,每个线程都有各自的Java假造机栈,并且跟着线程的建设而建设,跟着线程的衰亡而衰亡。 扩展:那么要领/函数怎样挪用? Java 栈可用类比数据布局中栈,Java 栈中生涯的首要内容是栈帧,每一次函数挪用城市有一个对应的栈帧被压入Java栈,每一个函数挪用竣事后,城市有一个栈帧被弹出。 Java要领有两种返回方法:
不管哪种返回方法城市导致栈帧被弹出。 2.3 当处所法栈 和假造机栈所施展的浸染很是相似,区别是:假造机栈为假造机执行 Java 要领 (也就是字节码)处事,而当处所法栈则为假造机行使到的 Native 要领处事。在 HotSpot 假造机中和 Java 假造机栈合二为一。 当处所法被执行的时辰,在当处所法栈也会建设一个栈帧,用于存放应当处所法的局部变量表、操纵数栈、动态链接、出口信息。 要领执行完毕后响应的栈帧也会出栈并开释内存空间,也会呈现 StackOverFlowError 和 OutOfMemoryError 两种非常。 2.4 堆 Java 假造机所打点的内存中最大的一块,Java 堆是全部线程共享的一块内存地区,在假造机启动时建设。此内存地区的独一目标就是存下班具实例,险些全部的工具实例以及数组都在这里分派内存。 Java 堆是垃圾网络器打点的首要地区,因此也被称作GC堆(Garbage Collected Heap).从垃圾接纳的角度,因为此刻网络器根基都回收分代垃圾网络算法,以是Java堆还可以细分为:新生代和晚年月:再过细一点有:Eden空间、From Survivor、To Survivor空间等。进一步分另外目标是更好地接纳内存,可能更快地分派内存。 ——图片来历:https://blog.csdn.net/wangbiao007/article/details/78545189[1] 2.7 直接内存 直接内存并不是假造机运行时数据区的一部门,也不是假造机类型中界说的内存地区,可是这部门内存也被频仍地行使。并且也也许导致 OutOfMemoryError 非常呈现。 (编辑:河北网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |