java面试(十四)--(1)JVM常用命令(2)前后台线程(3)中间件(4)DBMS事务(5)OOP基本原则(6)GC内存回收(7)反射

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/JAVA_I_want/article/details/102750220

1.JVM常用命令

1、jps:查看本机java进程信息。
2、jstack:打印线程的栈信息,制作线程dump文件。
3、jmap:打印内存映射,制作堆dump文件
4、jstat:性能监控工具
5、jhat:内存分析工具
6、jconsole:简易的可视化控制台
7、jvisualvm:功能强大的控制台
8、jinfo: 获取JVM的内存映像

2.前台线程和后台线程的区别和联系

1、后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
2、可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
3、不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
4、托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
说明:
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。
一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。
而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序

补充:
Jre 判断程序是否执行结束的标准是所有的前台线程执行完毕

3.什么是中间件

中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
(简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)

4.说说DBMS事务

DBMS中事务有四个特性:持久性,一致性,原子性,隔离性

原子性:事务是一组不可分割的操作单元,这组单元要么同时成功要么同时失败(由DBMS的事务管理子系统来实现)
一致性:事务前后的数据完整性要保持一致(由DBMS的完整性子系统执行测试任务)
隔离性:多个用户的事务之间不要相互影响,要相互隔离(由DBMS的并发控制子系统实现)
持久性:一个事务一旦提交,那么它对数据库产生的影响就是永久的不可逆的,如果后面再回滚或者出异常,都不会影响已提交的事务(由DBMS的恢复管理子系统实现的)

5.面向对象有哪些基本原则

面向对象的五大基本原则:
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov(里氏)替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口

6.谈谈GC对哪些内存进行了回收

gc是对不可用的对象进行回收,判断一个对象是否不可用采用的是可达性分析算法,具体的做法就是:从“GC Roots”开始,向下搜索,如果从GC Roots到某个对象不可达,那么这个对象就是不可用的,会被判定为是可回收的对象.
不过这些对象也不是立即就会被回收,真正宣告一个对象死亡需要至少经历两次标记过程:
在通过可达性分析后发现某个对象没有和GC Roots相连接的引用链,那么这个对象会被第一次标记并且进行一次筛选.
筛选的条件是:该对象是否需要执行finalize()方法.
如果该对象没有覆盖finalize()方法 or finalize()方法已被虚拟机调用过,则无需执行finalize()方法, 否则,需要执行finalize()方法.
在执行finalize()方法中该对象可以进行自救,即尝试将自己与引用链上任何一个对象建立关联(比如将自己赋值给某个类变量 or 对象的成员变量). 如果自救成功,在第二次标记时,该对象将从“即将回收”的集合中被移出。如果自救失败,那么基本上这个对象就会真的被回收。

7.谈谈反射

反射指的是在运行时能够分析类的能力的程序。
反射机制可以用来:
1.在运行时分析类的能力–检查类的结构–所用到的就是java.lang.reflect包中的Field、Method、Constructor,分别用于描述类的与、方法和构造器。
2.在运行时查看对象。
3.实现通用的数组操作代码。
反射机制的功能:
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射机制常见作用:
动态加载类、动态获取类的信息(属性、方法、构造器);动态构造对象;动态调用类和对象的任意方法、构造器;动态调用和处理属性;获取泛型信息(新增类型:ParameterizedType,GenericArrayType等);处理注解(反射API:getAnnotationsdeng等)。
反射机制性能问题:
反射会降低效率。
void setAccessible(boolean flag):是否启用访问安全检查的开关,true屏蔽Java语言的访问检查,使得对象的私有属性也可以被查询和设置。禁止安全检查,可以提高反射的运行速度。
可以考虑使用:cglib/javaassist操作。

最后补充一个小的知识点:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/JAVA_I_want/article/details/102750220