Java面试-基础第一部分

Java面试-基础第一部分

 

JAVA基础第一部分

  1. JVM结构原理、GC工作机制详解

 

JVM分为四个部分:

类加载器(ClassLoader):在JVM启动或者类运行时将需要的class加载到JVM中;

执行引擎:负责执行class文件中包含的字节码指令

本地方法接口:主要是调用C或C++实现的本地方法及返回结果;

内存区:JVM运行时操作分配的内存区。分为5个区域:

方法区(Method Area):JDK1.8之后称为--元空间,存储类结构信息,包括常量池、静态变量、构造函数等,是线程共享的区域,为与Java堆分区,方法区还有一个别名Non-Heap(非堆);

Java堆(Heap):存储Java实例或对象的地方,是GC主要区域,是线程共享的区域;

Java栈(Stack):每创建一个线程,JVM就会创建对应的Java栈。Java栈中包含多个栈帧,每运行一个方法就创建一个栈帧,用于存储局部变量表、操作栈、方法返回值,一个方法的调用与完成即一个栈帧的入栈与出栈过程。线程私有区域;

程序计数器(PC Register):保存当前线程执行的内存地址。JVM多线程机制,保证切换回到原先状态。线程私有区域;

本地方法栈(Native Method Stack):类似于Java栈,主要为JVM使用的native方法服务。线程私有区域。

Java与C/C++内存分配区别:C/C++每次申请内存需要malloc进行系统调用,需要内存切换,增加开销;Java虚拟机一次分配大区域,new在该区域分配和释放,减少系统调用次数。线程私有区域(Java栈、程序计数器、本地方法区)的内存随线程生灭自动回收,因此Java垃圾回收(GC)主要针对于线程共享区域(Java堆与方法区)。

GC工作机制中对象判活方式:

引用计数:给一个对象添加引用计数器,每当有个地方引用它,计数器++,引用失效就--,为零则为垃圾;

可达性分析:以根集对象为起始点进行搜索,如果有对象不可达的话,即是垃圾对象。

三种垃圾回收:Minor GC(年轻代)、Major GC(永久代)/Full GC(年轻代和永久代)

垃圾回收算法:

标记-清除算法:分为“标记”与“清除”两个阶段,容易产生大量内存碎片。

复制算法:将内存按容量平分两个区域,每次使用其中一块,内存使用缩小为原来的一半。

标记-整理算法:标记垃圾对象,然后清除对象,将存活空间移动为连续区域。

分代收集:把Java堆分为新生代和年老代,按特性选择回收算法

年轻代(生存周期短,大量对象是垃圾对象)  复制

年老代(生存周期长,少量对象是垃圾对象)  标记整理  标记清除

     2.Java对象的生命周期

共分为七个阶段:创建阶段(Creation)、应用阶段(Using)、不可视阶段(Invsible)、不可到达阶段(Unreachable)、收集阶段(Collected)、终结阶段(Finalized)与释放阶段(Free)。

与“不可达阶段”相比,“不可见阶段”是指程序不再持有该对象的任何强引用,这种情况下,该对象仍可能被JVM等系统下的某些已装载的静态变量或线程等强引用持有着。

    3.Map或者HashMap的存储原理

Map/HashMap底层以数组将Key-Value对作为元素进行存储,其中将key值进行Hash之后进行存储,每个Hash值对应一个数组下标,当出现Hash值相同,再采用链表进行存储。HashMap在JDK1.8及以后的版本中引入了红黑树结构,若桶中链表元素个数大于等于8时,链表转换成树结构;若桶中链表元素个数小于等于6时,树结构还原成链表。

     4.当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗

看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%(以某字段开头),那么有索引效果,如果使用双%号匹配(包含某字段),那么则无索引效果。

     5.数据库存储日期格式时,如何考虑时区转换问题?

使用TimeStamp(时间戳),getTime()方法获取时间无时区概念,Date()方式获取存在时区概念,由本机系统时区决定。

     6.Java Object类中有哪些方法?

getClass():返回此Object的运行时类。

hashcode():返回该对象的哈希值。

equals():指示某个其他对象是否与此对象“相等”。

toString():返回该对象的字符串表示。

clone():创建并返回此对象的一个副本。

wait():在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。

notify():唤醒在此对象监视器上等待的单个线程。

notifyAll():唤醒在此对象监视器上等待的所有线程。

finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

     7.&和&&的区别

&为位与运算,&&为逻辑与操作

     8.HashMap冲突很厉害,最差性能,你会怎么解决?

HashMap冲突即Hash函数计算的哈希值容易重复。首先考虑调整Hash函数解决冲突,常用解决Hash冲突的方法如:开放地址法、再哈希法、链地址法(HashMap采用);其次考虑将HashMap转化为平衡数实现的TreeMap形式。

     9.hashCode()与equals()生成算法、方法怎么重写

hashCode()用于获取对象的哈希值,而equals()通过两个对象的哈希值判断两个对象是否相等。重写原则是:

a)在java应用程序运行时,无论何时多次调用同一个对象时的hsahCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值

b)如果两个对象equals()返回值为true,则他们的hashCode()也必须返回相同的int值

c)如果两个对象equals()返回值为false,则他们的hashCode()返回值也必须不同

     10、UTF-8与GBK区别

UTF-8是用以解决国际上字符的一种多字节编码,英文使用8位(1Byte),中文用24位(3Byte);

GBK是专门用来解决中文编码的,不论中英文都是双字节。

     11、Java中 == 与 equals() 区别

== 表示判断2个变量或对象实例是否指向同一个内存空间,equals()表示 判断2个变量或对象实例所指向的内存空间的值是否相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章