人妻少妇精品视频一区

“滴,滴滴......”师父咱们到哪了?我还要赶着口试呢。
「师父:」 快了快了,下个路口就到了。真的服了这帮人了,不会开车净往里凑。
听着司机师父的报怨声,不禁想开头打油诗:满目尾灯红,耳盈刺笛声。心忧迟到久,颓首似雷轰。
一下车赶快小跑就进了富丽堂皇的旅社,不不不,是商务楼,这大厅有点派头,让我有点非分之想呀。
口试经过“咚咚咚”,“请进”。
「口试官:」 小伙子长得挺帅呀,年青人即是有活力,来先做个马虎的自我先容吧。
「阿Q:」 口试官你好,My name is “影流之主”,来自艾欧尼亚,是LOL中的最强中单(不给与反驳),论单杀莫得服过谁。我的理论禅是“无形之刃,最为致命”,天然你也可以叫我阿Q,这是我的简历。
「口试官:」 阿Q,那咱也不寒暄了,胜利切正题吧。看你jvm写的常识点最多,那就先说一下你对假造机栈的连合吧。
「阿Q:」 内心OS:这波可以吹X了。咳...咳...假造机栈早期也叫java栈,是在jvm的运转时数据区存在的一块内存区域。它是线程非常的,随线程创建而创建,随线程毕命而为止。
嗯。。。假装想一下??
家喻户晓,栈唯有进栈和出栈两种操作,是以它是一种快速灵验的分派存储模样。关于它来说,它不存在垃圾回收问题,关联词它的大小是动态的粗略固定不变的,因此它会存在栈溢出粗略内存溢出问题......
「口试官:」 打断一下啊,你刚才说会存在栈溢出和内存溢出问题,那你能区分说一下为什么会出现这种情况吗?
「阿Q:」 可以可以, 天天操天天干咱们领路假造机栈由栈帧构成,每一个设施的调用都对应着一个栈帧的入栈。咱们可以通过-Xss参数来开发栈的大小,假定咱们开发的假造机栈大小很小,当咱们调用的设施过多,也即是栈帧过多的话,就会出现StackOverflowError,即栈溢出问题。
假如咱们的栈帧不固定,开发为动态扩张的,那在咱们的内存不实时,也就莫得饱和的内存来复旧栈的扩张,这个时刻就会出现OOM越过,即内存溢出问题。
「口试官:」 嗯嗯(点头状),暗意小伙子思绪很明晰呀,那你刚才说到栈帧开发的太小会导致栈帧溢出问题,那咱们开发的大点不就可以完全幸免栈溢出了嘛。
「阿Q:」 一听即是要给我挖坑呀,像咱们一般都相比贵重中和之道,是以一听到这种齐全的问题,人妻少妇精品视频一区必须贤人点:不不不,调遣栈的大小只能以「降速」栈溢出的时刻粗略说减少栈溢出的风险。
举个例子吧
假如一个业务逻辑的设施调用需要5000次,关联词此时抛出了栈溢出的罪戾。咱们可以通过开发-Xss来得回更大的栈空间,使得调用在7000次时才会溢出。此时调遣栈大小就变得很特地旨,因为这么就会使得业务能日常复旧。
那假如是有「死递归」的情况则无论奈何进步栈大小都会溢出,这么也就莫得任何意旨了。
「口试官:」 好的,那你看一下这个马虎的小尺度,你能大体说一下它在内存中的扩充进程吗?
public void test() { byte i = 15; int j = 8; int k = i + j; }
来张图,便于全国更好地连合
「阿Q:」 先把该代码编译一下,然后搜检它的字节码文献。如上图中左边所示,扩充进程如下:
最初将要扩充的请示地址0存放到PC寄存器中,此时,局部变量表和操作数栈的数据为空; 当扩充第一条请示bipush时,将操作数15放入操作数栈中,然后将PC寄存器的值置为下一条请示的扩充地址,即2; 当扩充请示地址为2的操作请示时,将操作数栈中的数据取出来,存到局部变量表的1位置,因为该设施是实例设施,是以0位置存的是this的值,PC寄存器中的值变为3; 同要领2和3将8先放入操作数栈,然后取出来存到局部变量表中,PC寄存器中的值也由3->5->6; 当扩充到地址请示为6、7、8时,将局部变量表中索引位置为1和2的数据再行加载到操作数栈中并进行iadd加操作,将得到的效果值存到操作数栈中,PC寄存器中的值也由6->7->8->9; 扩充操作请示istore_3,将操作数栈中的数据取出存到局部变量表中索引为3的位置,扩充return请示,设施为止。「口试官:」 内心OS:这小子貌似还可以呀。说的还可以,那你能说一下设施中界说的局部变量是否线程安全吗?
「阿Q:」 那我再用几个例子来说一下吧。
public class LocalParaSafeProblem { /** * 线程安全的 * 诚然StringBuilder自身线程不安全, * 但s1 变量只存在于这个栈帧的局部变量表中, * 因为栈帧是每个线程寂然的一份, * 是以这里的s1是线程安全的 */ public static void method01() { // 线程里面创建的,属于局部变量 StringBuilder s1 = new StringBuilder(); s1.append("a"); s1.append("b"); } /** * 线程不安全 * 因为此时StringBuilder是看成参数传入, * 外部的其他线程也可以看望,是以线程不安全 */ public static void method02(StringBuilder stringBuilder) { stringBuilder.append("a"); stringBuilder.append("b"); } /** * 线程不安全 * 此时StringBuilder被多个线程同期操作 */ public static void method03() { StringBuilder stringBuilder = new StringBuilder(); new Thread(() -> { stringBuilder.append("a"); stringBuilder.append("b"); }, "t1").start(); method02(stringBuilder); } /** * 线程不安全 * 因为此时设施将StringBuilder复返出去了 * 外面的其他线程可以胜利修改StringBuilder这个援用了是以不安全 */ public static StringBuilder method04() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("a"); stringBuilder.append("b"); return stringBuilder; } /** * StringBuilder是线程安全的 * 此时stringBuilder值在刻下栈帧的局部变量表中存在, * 其他线程无法看望到该援用, * 设施扩充完成之后此局势部变量表中的stringBuilder的就就义了 * 复返的stringBuilder.toString()线程不安全 * 临了的复返值将toString复返之后,其他线程可以操作而String自身是线程不安全的。 */ public static String method05() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append("a"); stringBuilder.append("b"); return stringBuilder.toString(); } }
看到这忖度会有点绕,那我就追思一下吧:若是对象是在设施里面产生且在里面毕命,不会复返到外部就不存在线程安全问题;反之若是类自身线程不安全的话就存在线程安全问题。
「口试官:」 可以可以,有理有据,那你再说说你对堆内存的连合吧。
「阿Q:」 唉,今天太累了,说了一天这个了,不想说了。
「口试官:」 那好吧,那咱们今天先到这吧,且归等见告吧。
本文转载自微信公众号「阿Q说代码」,可以通过以下二维码关怀。转载本文请有关阿Q说代码公众号。