java底层面试题

Hashmap的成环

在扩容的时候,由于链表e.next=table[i],此时table[i]已经是e,则会形成环

Java中有哪些线程池

newCachedThreadPool

创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

这种类型的线程池特点是:

  • 工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。
  • 如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。
  • 在使用CachedThreadPool时,一定要注意控制任务的数量,否则,由于大量线程同时运行,很有会造成系统瘫

newFixedThreadPool

创建一个指定工作线程数量的线程池。每当提交一个任务就创建一个工作线程,如果工作线程数量达到线程池初始的最大数,则将提交的任务存入到池队列中。

FixedThreadPool是一个典型且优秀的线程池,它具有线程池提高程序效率和节省创建线程时所耗的开销的优点。但是,在线程池空闲时,即线程池中没有可运行任务时,它不会释放工作线程,还会占用一定的系统资源。

newSingleThreadExecutor

创建一个单线程化的Executor,即只创建唯一的工作者线程来执行任务,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。如果这个线程异常结束,会有另一个取代它,保证顺序执行。单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。

newScheduleThreadPool

创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。

延迟3秒执行,延迟执行

Jvm的内存模型

堆,栈,PC计数器,常量池,方法区,本地方法栈

JVM回收算法

标记清除 标记复制 标记整理

垃圾回收器

serial

Parnew

ParC

 

SerialOld

Parshell

CMS

通常用什么方法调试

断点调试,碰到线程问题的时候查看jconsole

如何修改堆栈大小

-xms初始内存 -xmx 最大内存 -xss栈内存 

NIO总结,

volilate原理

变量也会像普通变量那样从主存拷贝到各个线程中去操作,只是需要每一次use之前一定要read和load

select 和 epoll 的区别及分析

select是主动轮询fd,epoll是被动轮询

如果hashmap的大小超过负载因子定义容量,怎么办?

在HashMap超过0.75负载因子的时候,HashMap会进行重新哈希,重新排列

知不知道锁的可重用是一个什么样的概念?

拥有当前锁的线程,可用进入同样锁的其他方法

Synchonized和reteenlock的区别

Synchonized是使用

reteenlock底层是怎么实现的,怎么实现的超时获取锁。

reteenlock是包含了两个AQS对象,一个公平,一个非公平,判断当前的state若为0或当前线程是持有reteenlock的线程则允许获得锁,否则则拒绝。

tryLock是自旋判断是否获取,失败则返回false

抽象类和接口的对比

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有publicprotecteddefault这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

 

死锁的条件

互斥条件

不可抢占

占有且申请

循环等待

GCroot的源对象可以是

虚拟机栈中的对象

静态对象

常量对象

Native方法对象

java类加载的实现

java底层面试题_第1张图片

什么是双亲委派机制?

  • 是JDK类加载的一个模型。JDK有三个类加载器:用来加载核心类库的引导类加载器、用来加载扩展类库的扩展类加载器、用来加载自定义类的应用程序类加载器。双亲委派机制就是当JVM收到一个类加载请求时,不会直接让当前类的类加载器加载该类,而是将请求委派给其上层类加载器,直到请求到达最顶端的引导类加载器,然后逐层向下递归加载该类,某一层找到了该类则直接加载并返回,否则如果到了当前类的类加载器还找不到,就会抛出没有该类的异常。

你可能感兴趣的:(java底层面试题)