谈谈对java的理解

谈谈对java的理解

每当遇到这个问题时,对于我们学java的小伙伴来讲,是一件非常头疼的事,这是因为阐述这件事太宽泛了,可说的点很多,于是就无从下手。因此,本人汇总了如下几点,可以供小伙伴参考:

一.平台无关性:一次编译,到处运行;
谈谈对java的理解_第1张图片
1.那为什么JVM不直接将源码解析成机器码去执行呢?是因为如果这么做了,会出现以下情况
1)准备工作:每次执行都需要各种检查
2)兼容性:也可以将别的语言解析成字节码
2.那JVM如何加载.class文件呢?
谈谈对java的理解_第2张图片
1)谈谈ClassLoader:ClassLoader在java中有着非常重要的作用,它主要工作在Class装载的加载阶段,其主要作用是从系统外部获得Class二进制数据流。它是java的核心组件,所有的Class都是由ClassLoader进行加载的,ClassLoader负责将Class文件里的二进制数据流装载进系统,然后交给java虚拟机进行连接、初始化等操作。ClassLoader的种类
(1)BootStrapClassLoader:C++编写,加载和辛苦java.*
(2)ExtClassLoader:java编写,加载扩展库javax.*
(3)AppClassLoader:java编写,加载程序所在目录
(4)自定义ClassLoader:java编写,定制化加载,如图。
谈谈对java的理解_第3张图片
2)谈谈类加载器的双亲委派机制,为什么要使用双亲委派机制去加载类。
谈谈对java的理解_第4张图片
避免多份同样字节码的加载。类的加载方式有:
(1)隐式加载:new
(2)显式加载:loadClass,forName等,这两者有什么区别:Class.forName得到的class是已经初始化完成的,Classlo.loadClass得到的class是还没有链接的

3.java的内存模型
1)如图,按照线程划分
(1)线程私有:程序计数器、虚拟机栈、本地方法栈
(2)线程共享:MetaSpace、java堆
谈谈对java的理解_第5张图片
2)java内存模型中堆和栈的区别与联系
谈谈对java的理解_第6张图片
3)区别
(1)管理方式:栈自动释放,堆需要GC
(2)空间大小:栈比堆小
(3)碎片相关:栈产生的碎片远小于堆
(4)分配方式:栈支持静态和动态分配,而堆仅支持动态分配
(5)效率:栈的效率比堆高

二.GC:垃圾回收机制,不用向c++那样,手动去释放堆内存
1)通过判断对象的引用链是否可达来决定对象是否可以被回收
谈谈对java的理解_第7张图片
2)可以作为GC Root的对象
(1)虚拟机栈中的引用的对象(栈帧中的本地变量表)
(2)方法区中的常量引用的对象
(3)方法区中的类静态属性引用的对象
(4)本地方法栈中JNI(Native方法)的引用对象
(5)活跃线程的引用对象
3)垃圾回收算法
(1)标记-清除算法:
①标记:从根集合进行扫描,对存活的对象进行标记
②清除:对堆内存从头到尾进行线性遍历,回收不可达对象内存。
谈谈对java的理解_第8张图片
不足之处是容易造成碎片化。
(2)复制算法:
①分为对象面和空闲面
②对象在对象面上创建
③存活的对象被对象面复制到空闲面
④将对象面所有对象内存清除
谈谈对java的理解_第9张图片
(3)标记-整理算法:
①标记:从根集合进行扫描,对存活的对象进行标记
②清除:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收
谈谈对java的理解_第10张图片
(4)分代收集算法:
①垃圾回收算法的组合拳
②按照对象生命周期的不同划分区域以采用不同的垃圾回收算法
③目的:提高JVM的回收效率
谈谈对java的理解_第11张图片
④分代收集算法中GC的分类:Minor GC(年轻代)和Full GC(老年代)
谈谈对java的理解_第12张图片
谈谈对java的理解_第13张图片
(5)分代收集算法中年轻代常见问题
①经历一定Minor次数依然存活的对象,默认15次,可以根据上图参数设置;
②Survivor区中存放不下的对象,会直接进入老年代;
③新生成的大对象(-XX:+PretenuerSizeThreshold)会直接进入老年代
(6)老年代的GC触发:
①Full GC 和Major GC
②Full GC 比Minor GC慢,但执行频率低
③触发Full GC的条件
~老年代空间不足,为避免此情况,最好不要创建太大的对象
~永久代空间不足
~CMS GC时出现promotion failed,concurrent mode failure
~Minor GC晋升到老年代的平均大小大于老年代的剩余空间
~调用System.gc()
~使用RMI来进行RPC或管理的JDK应用,每小时执行1次Full GC。
(7)垃圾收集器
三.语言特性:包括泛型,反射,lambda表达式等
四.面向对象:封装,继承,多态
五.本身自带的一些集合,并发库,网络库,io/nio之类
六.异常处理

你可能感兴趣的:(每天一个面试题,java,面试)