java面试篇
2022-07-21 09:16:40 8 举报
AI智能生成
阿萨德
作者其他创作
大纲/内容
针对方法
针对代码块
synchronized得原理
原子性
有序性
可见性
Synchronized保证原子性、有序性、可见性原理
synchronized无法判断锁得状态lock锁可以判断锁得状态
Synchronized和Lock的区别
synchronized 是JVM层面的锁,是Java关键字,通过monitor(妈辣der)对象来完成(monitorenter与monitorexit),对象只有在同步块或同步方法中才能调用wait/notify方法synchronized 的实现涉及到锁的升级,具体为无锁、偏向锁、自旋锁、向OS申请重量级锁,ReentrantLock 实现则是通过利用CAS 自旋机制保证线程操作的原子性和volatile保证数据可见性以实现锁的功能
synchronized不需要手动释放锁
sychronized和ReenteredLock区别
多个线程同时被阻塞,它们中的⼀个或者全部都在等待某个资源被释放。
破坏不剥夺条件 :占⽤部分资源的线程进⼀步申请其他资源时,如果申请不到,可以主动释放它占有的资源。
死锁是什么?遇到死锁问该怎么解决?
Java锁
-Xms2g:初始化堆大小为 2g;-Xmx2g:堆最大内存为 2g;-XX:NewRatio=4:设置年轻的和老年代的内存比例为 1:4;-XX:SurvivorRatio=8:设置新生代 Eden 和 Survivor 比例为 8:2;–XX:+UseParNewGC:指定使用 ParNew + Serial Old 垃圾回收器组合;-XX:+UseParallelOldGC:指定使用 ParNew + ParNew Old 垃圾回收器组合;-XX:+UseConcMarkSweepGC:指定使用 CMS + Serial Old 垃圾回收器组合;-XX:+PrintGC:开启打印 gc 信息;-XX:+PrintGCDetails:打印 gc 详细信息
常用的JVM调优的参数有哪些?
一个类收到加载请求时,会先委派给父类去加载,父类无法加载再反馈给子类加载。
什么是双亲委派模型
堆 栈物理地址 不连续,性能慢 连续(先进后出)性能快内存分配 大小不固定,在运行期确认 大小固定,在编译器确认存放内容 对象的实例和数组 局部变量、操作数栈、返回结果程序可见度 整个应用可见 线程可见
堆和栈的区别
包含程序计数器、Java虚拟机栈、本地方发栈、Java堆、方法区程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;Java 虚拟机栈(Java Virtual Machine Stacks):用于存储局部变量表、操作数栈、动态链接、方法出口等信息;本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚拟机栈是服务 Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;Java 堆(Java Heap):Java 虚拟机中内存最大的一块,是被所有线程共享的,几乎所有的对象实例都在这里分配内存;方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。Ps:jdk1.7之前常量池在方法区,1.7之后在堆里边。
说一下JVM运行时数据区
两个子系统:类加载子系统、执行引擎两个组件:运行时数据区、本地库接口作用(类执行过程):首先类加载子系统把编译好的.class文件加载到内存中,放到运 行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在 方法区内的数据结构。然后通过执行引擎将字节码翻译成底层系统指令交由CPU 去执行,这个过程中需要调用其他语言版本的本地库接口实现。
JVM的主要组成部分及作用
标记-清除算法:标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。复制算法:按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。标记-整理算法:标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。分代算法:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
JVM有哪些垃圾回收算法
JVM
由于Java是单继承,一个类继承Thread类以后不能继承其他类,扩展性不好
而实现Runnable接口则可以侧面实现了多继承
多线程中继承Thread 类和实现Runnable 接口的区别
继承Thread类
Callable接口支持返回执行结果,此时需要调用FutureTask.get()方法实现,此方法会阻塞主线程直到获取‘将来’结果;当不调用此方法时,主线程不会阻塞!
多线程中实现Runnable和Callable的接口的区别
实现Runnable接口
实现Callable接口
节省了线程池的创建和销毁带来的性能影响
控制线程池的并发数
线程池的好处
corePoolSize核心线程数
queueCapacity任务队列容量
maxPoolSize最大线程数
keepAliveTime线程空闲时间
allowCoreThreadTimeout允许核心线程超时
rejectedExecutionHandler任务拒绝处理器
线程池的参数
1、excutor没有返回值,submit有返回值,并且返回执行结果Future对象
2、excutor不能提交Callable任务,只能提交Runnable任务,submit两者任务都可以提交
3、在submit中提交Runnable任务,会返回执行结果Future对象,但是Future调用get方法将返回null(Runnable没有返回值)
线程池中 submit() 和 execute() 方法有什么区别?
线程池
通过过线程池的方式
创建线程有哪几种方式
当线程进入synchronized代码块中没有拿到相应的锁就会导致阻塞
阻塞
Waiting(等待)
线程执行了设置了时间参数的 Thread.sleep(long millis) 方法;
Timed Waiting(计时等待)
New(新创建)Runnable(可运行)Blocked(被阻塞)Waiting(等待)Timed Waiting(计时等待)Terminated(被终止)
可以通过getState()方法来获取当前线程的状态Thread类中有一个State枚举定义了这些方法
一个线程的生命周期有哪几种状态?它们之间如何流转的?
线程等待wait线程睡眠线程让步线程中断等待其他线程终止线程唤醒
线程的基本方法有哪些?
启动线程方法 start和 run有什么区别?
1、属于Object,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程
2、wait方法释放了锁
3、wait不需要捕获异常
4、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用
wait()方法
1、属于Thread类,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态
2、sleep方法没有释放锁
3、sleep必须捕获异常
4、sleep可以在 任何地方使用
sleep()方法
线程中的 wait和 sleep方法有什么区别?
多线程
查看当前目录的完整路径
pwd
强制杀死进程
kill
: 安装指定的软件
rpm -ivh 软件名称
用来查看当前目录下的所有文件资源。
ll
清屏
clear
esc:wq! 强制保存并退出linux常用命令
unzip 文件名.zip :解压后缀名为zip的压缩文件
ps -ef | grep 进程名 :查看指定进程是否启动。
Linux命令
简答:BIO:Block IO 同步阻塞式IO,就是我们平时使用的传统IO,特点是模式简单使用方便,但是并发处理能力低;NIO:Non IO 同步非阻塞IO,传统IO的升级,客户端与服务端通过Channel(通道)通讯,实现了多路复用;AIO:Asynchronous IO 异步非阻塞IO,异步IO的操作基于事件和回调机制。
子主题
java面试篇
0 条评论
回复 删除
下一页