JVM

JVM

1.Java语言的平台无关性是如何实现的?

JVM屏蔽了操作系统和底层硬件的差异;
Java面向JVM编程,先编译生成字节码文件,然后交给JVM解释成机器码执行;
Java的基本数据类型在各个平台上是保持一致的。

2.JVM内存区域的划分。

答:JVM内存区域主要分为
线程私有区域(程序计数器、虚拟机栈、本地方法栈)
线程共享区域(JAVA堆、方法区)
直接内存。
线程私有数据区域生命周期以用户线程的启动/结束而创建/销毁
线程共享区域随虚拟机的启动/关闭而创建/销毁。

3.堆与方法区

堆
堆内存是线程共享的区域,也是垃圾回收的主要场所。在虚拟机启动时创建,用于存放对象的实例。
方法区
线程共享的区域。用于存储已被虚拟机加载的类信息、常量、静态常量、即时编译器编译后的代码等数据,也可以称为“永久代”,

4.可以说一下对象创建过程中的内存分配吗?

答:通过new指令来创建对象,当虚拟机遇到一条new指令的时候,会去检查类是否已经被加载,解析和初始化。如果没有,那么会执行类加载过程。这个时候会为该对象进行内存分配,也就是把一块确定大小的内存从Java堆中划分出来,在分配的内存上完成对象的创建工作。

5.内存的分配如何保证线程安全呢?

对分配内存空间的动作进行同步处理,利用CAS,保证操作的原子性;
给每一个线程都预先分配一小段的内存

6.对象被访问的时候是怎么被找到的?

答:当创建一个对象的时候,在栈内存中会有一个引用变量,指向堆内存中的某个具体的对象实例。

7.JVM内存划分

答:JVM的内存可以分为堆内存和非堆内存。
堆内存分为年轻代和老年代。
年轻代又可以进一步划分为一个Eden(伊甸)区和两个to/from Survivor(幸存)区组成。

7.5JVM对象分配

答:我们创建的对象会优先在Eden分配,如果是大对象则直接进入老年代。长期存活的对象将进入老年代,每一次MinorGC(年轻代GC),对象年龄就大一岁,默认15岁晋升到老年代

8.简述MinorGC的过程

答:当Eden区内存不够的时候就会触发Minor GC,对新生代区进行一次垃圾回收,MinorGC采用复制算法。

9.堆内存上的对象回收也叫做垃圾回收,那么垃圾回收什么时候开始呢?

答:垃圾回收分为年轻代区域发生的Minor GC和老年代区域发生的Full GC,分别介绍如下。
Minor GC(年轻代GC):
对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,
Full GC(老年代GC):
Full GC是指发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。

10.JVM如何判定一个对象是否应该被回收?

答:判断一个对象是否应该被回收,主要是看其是否还有引用。
判断对象是否存在引用关系的方法包括引用计数法以及root根搜索方法。
引用计数法:
是一种比较古老的回收算法。原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,收集计数为0的对象。此算法最致命的是无法处理循环引用的问题。
root根搜索方法:
root搜索方法的基本思路是,当一个对象到root节点没有任何引用链接时,则证明此对象是可以被回收的。

11.JVM垃圾回收算法有哪些?

答:年轻代垃圾回收一般采用复制算法
老年代垃圾回收一般采用标记-清除和标记-整理算法。

11.5什么是对象的引用?

JDK1.2以后将引用分为强引用,软引用,弱引用和虚引用四种。
强引用:普通存在,P p = new P(),只要强引用存在,垃圾收集器永远不会回收掉被引用的对象。
软引用:通过SoftReference类来实现软引用,在内存不足的时候会将这些软引用回收掉。
弱引用:通过WeakReference类来实现弱引用,每次垃圾回收的时候肯定会回收掉弱引用。
虚引用:也称为幽灵引用或者幻影引用

12.JDK8中在内存管理上的变化

答:JDK8中出现了元空间代替了永久代。元空间和永久代类似,都是对JVM规范中方法区的实现。区别在于元空间并不在虚拟机中,而是使用本地内存
为什么要使用元空间代替永久代?
答:在永久代中,类和方法的信息等比较难确定大小,因此对于永久代的大小指定比较困难,容易出现性能问题和内存溢出的问题。使用元空间则使用了本地内存。

13.Java中的类加载机制有了解吗?

答:Java中的类加载机制指虚拟机把描述类的数据从 Class 文件加载到内存,它的整个生命周期包括了:加载、验证、准备、解析、初始化

加载:加载是指将类的.class文件中的二进制数据读入到内存中,在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
验证: 验证的作用是确保被加载的类的正确性

准备: 准备阶段为类的静态变量分配内存,并将其初始化为默认值。假设一个类变量的定义为public static int val = 3;那么val在准备阶段过后的初始值不是3而是0。

解析: 解析阶段将类中符号引用转换为直接引用。

初始化: 初始化阶段为类的静态变量赋予正确的初始值,JVM负责对类进行初始化,主要对类变量进行初始化。

类加载器的分类:
启动类(根类)加载器:
扩展类加载器:
系统类加载器:

14.在Java中,什么是Garbage Collection?()

当对象的所有引用都消失后,对象使用的内存将自动回收

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值