1、Linux 中的硬链接和软连接是什么,二者有什么区别?
在Linux系统下,有两种链接文件,一种是硬链接(Hard Link),一种是软链接,也称为符号链接(Symbolic Link)。它们的区别如下:
硬链接:
- 硬链接通过文件系统中的inode节点进行链接,因此,硬链接和源文件具有相同的inode节点号。
- 硬链接只能在同一文件系统中的文件之间创建,不能对目录进行创建。
- 可以有多个硬链接指向同一个inode节点,或者说一个文件可以拥有多个路径名,因此一个文件可以对应多个文件名。
- 删除源文件或任何硬链接都不会影响其他链接的可用性,只有当所有链接都被删除后,inode节点才会被释放。
软链接:
- 软链接是一个包含了另一个文件的路径名的文件,它通过一个文件名引用另一个文件。
- 软链接可以链接不同文件系统的文件。
- 在对软链接进行读或写操作的时候,系统会自动把该操作转换为对源文件的操作。
- 删除软链接时,仅仅删除链接文件,不会删除源文件本身。
- 软链接可以指向一个不存在的文件。
二者的区别如下:
- 文件系统中,一个硬链接是指向同一个 inode 的不同文件名,而一个软链接是一个包含目标文件路径的文件(快捷方式)。
- 硬链接只能链接到同一文件系统中的文件,软链接可以链接到不同的文件系统上的文件。
- 删除一个硬链接并不会影响其他硬链接或者真正的文件,而删除一个软链接会使得链接的目标文件或目录成为孤儿文件,除非该目标文件或目录也有其他链接。
2、请你介绍下 JVM 内存模型,分为哪些区域?各区域的作用是什么?
JVM内存区域分为五个部分,分别是堆,方法去、虚拟机栈,本地方法栈,程序计数器
- 堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制,值得一提的是从JDK1.7版本之后,运行时常量池从方法区移到了堆上。
- 方法区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区包括运行时常量池(Runtime Constant Pool),用于存储编译时生成的各种字面量和符号引用。方法区在JDK1.7版本及以前被称为永久代,从JDK1.8永久代被移除。
- 虚拟机栈。虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个线程都有一个独立的虚拟机栈,栈的大小可以通过-Xss参数设置。虚拟机栈分为栈帧(Stack Frame),每个方法执行时都会创建一个栈帧用于存储局部变量和操作数栈等信息。
- 本地方法栈。与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
- 程序计数器。程序计数器是一块较小的内存区域,它用于记录当前线程所执行的字节码指令的地址,指示Java虚拟机下一条需要执行的字节码指令。每个线程都有一个独立的程序计数器,用于保证线程切换后能恢复执行的位置。
以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。
所以Java在通过new创建一个类对象实例的时候,一方面会在虚拟机栈中创建一个该对象的引用,另一方面会在堆上创建类对象的实例,然后将对象引用指向该对象的实例。对象引用存放在每一个方法对应的栈帧中。
3、有哪些注解可以注入 Bean?@Autowired 和 @Resource 的区别?
在 Spring 框架中,常用的注入 Bean 的注解包括:
- @Autowired:自动注入,按照类型自动装配,如果有多个同类型的 Bean,则需要通过 @Qualifier 指定具体的 Bean。
- @Resource:Java 自带的注入方式,按照名称自动装配,默认是按照属性名称进行匹配,如果需要按照 Bean 的名称进行匹配,可以使用 @Resource(name=“beanName”)。
- @Inject:和 @Autowired 类似,也是按照类型进行自动装配,但是 @Inject 注解是 JSR-330 提供的,而 @Autowired 注解是 Spring 框架提供的。
- @Value:用于注入配置文件中的属性值,可以指定默认值。
- @Component:用于声明一个 Bean,作用类似于 XML 中的 标签。
以上注解都可以用于注入 Bean,不同的注解之间的区别主要在于注入方式和实现方式的不同。@Autowired 和 @Resource 最常用,其中 @Autowired 按照类型自动装配更为常用,而 @Resource 按照名称自动装配则比较适合需要明确指定 Bean 名称的情况。
百度的答案:
- @Autowired:Spring 官方推荐使用的注入 Bean 的方式,通过自动装配方式将 Bean 注入到需要使用的类中。
- @Resource:JSR-250 规范中提供的注入 Bean 的方式,可以通过指定 Bean 的名称或类型进行注入。
- @Inject:JSR-330 规范中提供的注入 Bean 的方式,与 @Autowired 类似,但更加灵活。
- @Qualifier:与 @Autowired 搭配使用,通过指定 Bean 的名称进行注入。
- @Value:通过配置文件中的属性值注入 Bean 中的字段或方法参数。
- @Component:用于声明一个 Bean,作用类似于 XML 中的 标签。
@Autowired 和 @Resource 的区别
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
- @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
- @Autowired注解注入的对象需要在IOC容器中存在,否则,需要加上属性 required=false,表示忽略当前要注入的bean,如果有直接注入,没有则跳过,不会报错
在IOC容器中存在,否则,需要加上属性 required=false,表示忽略当前要注入的bean,如果有直接注入,没有则跳过,不会报错