JVM基础面试题及原理讲解

  • 时间:
  • 浏览:1
  • 来源:彩神大发APP_神彩大发APP官方

7

1

2

System.out.println(s2);

i1=i2+i3   true

1

i4=i5   false

2

5

System.out.println(i11 == i22);

3

11

String str4 = str1 + str2;

System.out.println(str3 == str4);

4

2

5

System.out.println("i1=i2+i3   " + (i1 == i2 + i3));

最好的方法区与 Java 堆一样,是各个守护多多线程 共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。真是Java虚拟机规范把最好的方法区描述为堆的一一二个多逻辑每种,已经 它却一一二个多多别叫安做 Non-Heap(非堆),目的应该是与 Java 堆区分开来。

守护多多线程 计数器是一块较小的内存空间,都不可不都还可不能能看作是当前守护多多线程 所执行的字节码的行号指示器。字节码解释器工作时通过改变累似 计数器的值来挑选下四根前要执行的字节码指令,分支、循环、跳转、异常补救、守护多多线程 恢复等功能都前要依赖累似 计数器来完。

在创建对象的已经 一一二个多多很糙要的什么的什么的问题 ,假使 守护多多线程 安全,可能在实际开发过程中,创建对象是很频繁的事情,作为虚拟机来说,前要要保证守护多多线程 是安全的,通常来讲,虚拟机采用并算不算最好的方法来保证守护多多线程 安全:

5

内存分配的并算不算最好的方法:(补充内容,前要掌握)

建立对象假使 为了使用对象,我们都的Java守护多多线程 通过栈上的 reference 数据来操作堆上的具体对象。对象的访问最好的方法有虚拟机实现而定,目前主流的访问最好的方法有使用句柄和直接指针并算不算:

9

4

3

7

内存分配并发什么的什么的问题 (补充内容,前要掌握)

4

1. 句柄: 可能使用句柄得话,没人 Java 堆中可能划分出一块内存来作为句柄池,reference 中存储的假使 对象的句柄地址,而句柄含晒 高了对象实例数据与类型数据个人的具体地址信息。

String s2 = s1.intern();

 *此最好的方法将始终缓存-128到127(包括端点)范围内的值,并都不可不都还可不能能缓存此范围之外的什么都有有值。

String str2 = new String("abcd");

        return IntegerCache.cache[i + (-IntegerCache.low)];

注意:守护多多线程 计数器是唯不用突然出现 OutOfMemoryError 的内存区域,它的生命周期随着守护多多线程 的创建而创建,随着守护多多线程 的之前 开使了而死亡。

8

推荐阅读:Java8内存模型——永久代(PermGen)和元空间(Metaspace)

本地最好的方法被执行的已经 ,在本地最好的方法栈也会创建一一二个多栈帧,用于存放该本地最好的方法的局部变量表、操作数栈、动态链接、出口信息。

Java 虚拟机栈也是守护多多线程 私有的,每个守护多多线程 后会个人的Java虚拟机栈,已经 随着守护多多线程 的创建而创建,随着守护多多线程 的死亡而死亡。

String s1 = new String("abc");

1

2

String str3 = "str" + "ing";

10

System.out.println("i4=i5+i6   " + (i4 == i5 + i6));  

通过上端的介绍我们都共要知道了虚拟机的内存情形,下面我们都来完整篇 的了解一下 HotSpot 虚拟机在 Java 堆中对象分配、布局和访问的全过程。

Integer i6 = new Integer(0);

结果:

Java 堆是垃圾分派器管理的主要区域,已经 也被称作GC堆(Garbage Collected Heap).从垃圾回收的带宽,可能现在分派器基本都采用分代垃圾分派算法,什么都有Java堆还都不可不都还可不能能细分为:新生代和老年代:再细致什么都有有有:Eden空间、From Survivor、To Survivor空间等。进一步划分的目的是更好地回收内存,可能调快地分配内存。

Java创建对象过程

本机直接内存的分配不用收到 Java 堆的限制,已经 ,既然是内存就会受到本机总内存大小以及补救器寻址空间的限制。

Integer i11 = 333;

System.out.println("i1=i2   " + (i1 == i2));

System.out.println(s1.equals(s2));

通过直接指针访问对象

运行时常量池是最好的方法区的一每种。Class 文件中除了有类的版本、字段、最好的方法、接口等描述信息外,还有常量池信息(用于存放编译期生成的各种字面量和符号引用)

System.out.println(s1 == s2);

Integer i3 = 0;

6

String s1 = new String("abc");

2

本文从 JVM 形态入手,介绍了 Java 内存管理、对象创建、常量池等基础知识,对面试中 JVM 相关的基础题目进行了讲解。

12

6

3

System.out.println(i1 == i2);

Integer i1 = 40;

System.out.println(s3 == s2);

挑选以上并算不算最好的方法中的哪并算不算,取决于 Java 堆内存算不算规整。而 Java 堆内存算不算规整,取决于 GC 分派器的算法是”标记-清除”,还是”标记-分派”(也称作”标记-压缩”),值得注意的是,基因重组算法内存也是规整的。

Java 虚拟机栈会突然出现 并算不算异常:StackOverFlowError 和 OutOfMemoryError。

7

    return new Integer(i);

2. 分配内存: 在类加载检查通已经 ,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可挑选,为对象分配空间的任务等同于把一块挑选大小的内存从 Java 堆中划分出来。分配最好的方法有 “指针碰撞” 和 “空闲列表” 并算不算,挑选那种分配最好的方法由 Java 堆算不算规整决定,而Java堆算不算规整又由所采用的垃圾分派器算不算含晒 压缩分派功能决定。

Java 虚拟机所管理的内存中最大的一块,Java 堆是所有守护多多线程 共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的假使 存放对象实例,几乎所有的对象实例以及数组后会这里分配内存。

得话 i4 == i5 + i6,可能 + 累似 操作符不适用于 Integer 对象,首先 i5 和 i6 进行自动拆箱操作,进行数值相加,即 i4 == 40。已经 Integer对象无法与数值进行直接比较,什么都有i4自动拆箱转为int值40,最终这条得话转为40 == 40进行数值比较。

4

1

String str5 = "string";

这并算不算不同的创建最好的方法是有差别的,第并算不算最好的方法是在常量池中拿对象,第二种最好的方法是直接在堆内存空间创建一一二个多新的对象。

Integer i1 = 40;

另外,为了守护多多线程 切换都不可不都还可不能能恢复到正确的执行位置,每条守护多多线程 都前要一一二个多多独立的守护多多线程 计数器,各守护多多线程 之间计数器互不影响,独立存储,我们都称累似 内存区域为“守护多多线程 私有”的内存。

解释:

9

6

解释:

System.out.println(str1==str2);

i1=i2   true

1

Integer i4 = new Integer(40);

System.out.println(i3 == i4);

Integer i2 = 33;

40=i5+i6   true

5. 执行 init 最好的方法: 在上端工作都完成已经 ,从虚拟机的视角来看,一一二个多新的对象可能产生了,但从 Java 守护多多线程 的视角来看,对象创建才之前 刚开使了了,<init> 最好的方法还没人 执行,所有的字段都还为零。什么都有一般来说,执行 new 指令之前 会接着执行 <init> 最好的方法,把对象按照守护多多线程 员的意愿进行初始化,原本 一一二个多真正可用的对象才算完整篇 产生出来。

System.out.println(i1==i2);

2

2

Double i3 = 1.2;

/**

Integer i2 = new Integer(40);

1

2

4

1 String 对象的并算不算创建最好的方法

对于 Java 守护多多线程 员来说,在虚拟机自动内存管理机制下,不再前要像C/C++守护多多线程 开发守护多多线程 员原本 为内一一二个多 new 操作去写对应的 delete/free 操作,不容易突然出现 内存泄漏和内存溢出什么的什么的问题 。正是可能 Java 守护多多线程 员把内存控制权利交给 Java 虚拟机,一旦突然出现 内存泄漏和溢出方面的什么的什么的问题 ,可能不了解虚拟机是怎样才能使用内存的,没人 排查错误可能是一一二个多非常艰巨的任务。

哪些组成每种什么都有有是守护多多线程 私有的,什么都有有的则是守护多多线程 共享的。

4

i1=i4   false

4

3

6

String s2 = "abc";

8

从上端的介绍中我们都知道守护多多线程 计数器主要有一一二个多作用:

1. 类加载检查: 虚拟机遇到四根 new 指令时,首先将去检查累似 指令的参数算不算能在常量池中定位到累似 类的符号引用,已经 检查累似 符号引用代表的类算不算已被加载过、解析和初始化过。可能没人 ,那前要先执行相应的类加载过程。

String s3 = "计算机";

13

推荐阅读:Java 中几种常量池的区分

String s1 = new String("计算机");

String str1 = "abcd";

2. 直接指针: 可能使用直接指针访问,没人 Java 堆对象的布局中就前要考虑怎样才能放置访问类型数据的相关信息,而 reference 中存储的直接假使 对象的地址。

i4=i5+i6   true

1

5

String str1 = "str";

JDK1.4中新加入的 NIO(New Input/Output) 类,引入了并算不算基于通道(Channel) 与缓存区(Buffer) 的 I/O 最好的方法,它都不可不都还可不能能直接使用Native函数库直接分配堆外内存,已经 通过一一二个多存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。原本 就能在什么都有有场景中显著提高性能,可能补救了在 Java 堆和 Native 堆之间来回基因重组数据。

1

先有字符串 “abc” 放到 常量池,已经 new 了一份字符串 “abc” 放到 Java 堆(字符串常量 “abc” 在编译期就可能挑选放到 常量池,而 Java 堆上的 “abc” 是在运行期初始化阶段才挑选),已经 Java 栈的 str1 指向 Java 堆上的 “abc”。

9

4. 设置对象头: 初始化零值完成已经 ,虚拟机要对对象进行必要的设置,累似 累似 对象是那个类的实例、怎样才能不可不都还可不能能找到类的元数据信息、对象的哈希吗、对象的 GC 分代年龄等信息。 哪些信息存放到 对象头中。 另外,根据虚拟机当前运行情形的不同,如算不算启用偏向锁等,对象头会有不同的设置最好的方法。

结果:

8

System.out.println("i1=i4   " + (i1 == i4));

6

3 String 字符串拼接

Java 虚拟机在执行 Java 守护多多线程 的过程中会把它管理的内存划分成若干个不同的数据区域。

和虚拟机栈所发挥的作用非常累似 ,区别是: 虚拟机栈为虚拟机执行 Java 最好的方法 (也假使 字节码)服务,而本地最好的方法栈则为虚拟机使用到的 Native 最好的方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。

3

守护多多线程 共享的:

下图便是 Java 对象的创建过程,我建议最好是能默写出来,已经 要掌握每一步在做哪些。

应用场景:

 */

String str2 = "ing";

既然运行时常量池时最好的方法区的一每种,自然受到最好的方法区内存的限制,当常量池无法再申请到内存后会抛出 OutOfMemoryError 异常。

与守护多多线程 计数器一样,Java虚拟机栈也是守护多多线程 私有的,它的生命周期和守护多多线程 相同,描述的是 Java 最好的方法执行的内存模型。

5

通过句柄访问对象

5

3

3

尽量补救多个字符串拼接,可能原本 会重新创建对象。可能前要改变字符串得话,都不可不都还可不能能使用 StringBuilder 可能 StringBuffer。

HotSpot 虚拟机中最好的方法区也常被称为 “永久代”,本质上两者无须等价。仅仅是可能 HotSpot 虚拟机设计团队用永久代来实现最好的方法区而已,原本 HotSpot 虚拟机的垃圾分派器就都不可不都还可不能能像管理 Java 堆一样管理这每种内存了。已经 这并后会一一二个多好主意,可能原本 更容易遇到内存溢出什么的什么的问题 。

3

2

8

Double i4 = 1.2;

守护多多线程 私有的:

实例数据每种是对象真正存储的有效信息,也是在守护多多线程 中所定义的各种类型的字段内容。

}

Integer 比较(==)更充裕的一一二个多例子:

Java 内存都不可不都还可不能能粗糙的区分为堆内存(Heap)和栈内存(Stack)其中栈假使 现在说的虚拟机栈,可能说是虚拟机栈中局部变量表每种。 (实际上,Java虚拟机栈是由一一二个多个栈帧组成,而每个栈帧中都拥有局部变量表、操作数栈、动态链接、最好的方法出口信息)

记住:假使 使用 new 最好的方法,便前要创建新的对象。

Integer i22 = 333;

创建了一一二个多对象。

7

    if (i >= IntegerCache.low && i <= IntegerCache.high)

Integer i5 = new Integer(40);

2 String 类型的常量池比较特殊。它的主要使用最好的方法有并算不算:

验证:

JDK1.7及已经 版本的 JVM 可能将运行时常量池从最好的方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。

System.out.println(str4 == str5);

1

public static Integer valueOf(int i) {

在 Hotspot 虚拟机中,对象在内存中的布局都不可不都还可不能能分为3块区域:对象头、实例数据和对齐填充。

Integer i1 = 33;

这并算不算对象访问最好的方法各有优势。使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 并算不算不前要修改。使用直接指针访问最好的方法最大的好处假使 带宽快,它节省了一次指针定位的时间开销。

相对而言,垃圾分派行为在累似 区域是比较少突然出现 的,但无须数据进入最好的方法区后就“永久趋于稳定”了。

直接内存并后会虚拟机运行时数据区的一每种,也后会虚拟机规范中定义的内存区域,已经 这每种内存也被频繁地使用。已经 也可能导致 OutOfMemoryError异常突然出现 。

Hotspot虚拟机的对象头包括两每种信息,第一每种用于存储对象自身的自身运行时数据(哈希码、GC分代年龄、锁情形标志等等),另一每种是类型指针,即对象指向它的类元数据的指针,虚拟机通过累似 指针来挑选累似 对象是那个类的实例。

在 JDK 1.8中移除整个永久代,取而代之的是一一二个多叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)。

Integer 缓存源代码:

Integer i2 = 40;

对齐填充每种后会必然趋于稳定的,也没哪些很糙的含义,仅仅起占位作用。 可能 Hotspot 虚拟机的自动内存管理系统要求对象起始地址前就说 8字节的整数倍,换句话说假使 对象的大小前就说 8字节的整数倍。而对象头每种正好是8字节的倍数(1倍或2倍),已经 ,当对象实例数据每种没人 对齐时,就前要通过对齐填充来补全。

最好的方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会突然出现 StackOverFlowError 和 OutOfMemoryError 并算不算异常。

1

System.out.println("40=i5+i6   " + (40 == i5 + i6));

System.out.println(s1 == s2);

局部变量表主要存放了编译器可知的各种数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference类型,它不同于对象并算不算,可能是一一二个多指向对象起始地址的引用指针,也可能是指向一一二个多代表对象的句柄或什么都有有与此对象相关的位置)。

3. 初始化零值: 内存分配完成后,虚拟机前要将分配到的内存空间都初始化为零值(不包括对象头),累似 步操作保证了对象的实例字段在 Java 代码中都不可不都还可不能能不赋初始值就直接使用,守护多多线程 能访问到哪些字段的数据类型所对应的零值。

System.out.println(str3 == str5);

6

3

System.out.println("i4=i5   " + (i4 == i5));

猜你喜欢

哇靠,阿里云什么情况,服务器爆款仅2折

6、活动中涉及“打折”、“折扣”、“×折”或“省××元”,是指将本活动期间的某款产品的活动价格,与无任何活动期间的相同产品/的日常最小单位售价(类事:月价),按相同购买时长进行

2020-01-29

一个男生和我表白了后。我拒绝了,我和他说了一句我不想谈恋爱,然后他就没有回复我了,觉得他是不是挺小

你找他继续聊他后要照样回复你的,他就怕你不理他,让人拒绝了别人,你说歌词 他还有那些要讲的呢,当你找他聊的过后他高兴都来不及,为何会生你气,我因此原先。展开完正那你想为何样呢

2020-01-29

您觉得在大学里谈恋爱与婚姻的关系挂钩吗?*

步入社会后,社交面会明显变窄,选取的余地相对缩小全都,共要当时人的就更难遇到了。我我觉得大学时,顺其自然有共要当时人的何必 回避。现在我觉得大学时代不谈恋爱真的是一个 多很

2020-01-28

各位有问题可以直接提,紫泷老师结束后会给各位解答

登录后可回答问题,请2019-04-0919:02:30各位有问题后能 直接提,紫泷老师刚刚开始总要给各位解答或来源:[直播]顶端件小哥0人评论314人浏览0收藏

2020-01-28

是不是两个人在一起时间久了比如半年,什么时候都在一起,就会产生依赖,而舍不得分开呢

暗恋是五种自毁,是五种伟大的牺牲。暗恋,甚至不前要对象,朋友不过站在河边,看着被委托人的倒影自怜,却以为被委托人正爱着别人。感情的句子是哪些 和情歌一样,最高境界是余音袅袅。

2020-01-28