Skip to content

Commit b102ea2

Browse files
committed
Update Java Notes
1 parent 0f35e8b commit b102ea2

3 files changed

Lines changed: 158 additions & 11 deletions

File tree

Frame.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8331,18 +8331,26 @@ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.
83318331
* 将所有的后置处理器拿出来,并且把名字叫beanName的类中的变量都封装到InjectionMetadata的injectedElements集合里面,目的是以后从中获取,创建实例,通过反射注入到相应类
83328332
* `AutowiredAnnotationBeanPostProcessor.postProcessMergedBeanDefinition`
83338333
* 添加工厂:`DefaultSingletonBeanRegistry.addSingletonFactory()`
8334+
83348335
* 允许提前引用才执行,用来解决**循环依赖**
83358336
* **填充属性 (依赖注入)**:`populateBean(beanName, RootBeanDefinition, BeanWrapper)`
8337+
83368338
* 填充准备:通过awareBeanPostProcessor拦截,判断控制程序是否继续进行属性填充
83378339
* 获取依赖:根据autowire类型 (Type/Name)提取依赖,存入 PropertyValues,并给bean注册依赖
83388340
* 后置处理:判断是否需要进行 BeanPostProcessor 和 依赖检查
8339-
* `postProcessPropertyValues`:转入AutowiredAnnotationBeanPostProcessor(**注解**)
8340-
* 执行`postProcessPropertyValues()`方法
8341-
* 执行私有内部类`AutowiredFieldElement().inject()`方法注入元数据
8342-
* inject()方法内`resolveDependency()`方法,用来解决循环依赖,调用beanFactory.getBean()获取bean
8343-
* `ReflectionUtils.makeAccessible(field)`:利用反射为此对象赋值
8344-
* 填充属性:将所有解析到的 PropertyValues 中的属性填充至 BeanWrapper 中
8341+
8342+
* `postProcessProperties`:转入**AutowiredAnnotationBeanPostProcessor**(**注解**)
8343+
8344+
* `findAutowiringMetadata()`:找到需要注入的元数据
8345+
* `InjectionMetadata.InjectedElement.inject()`:注入数据(底层重写了方法)
8346+
* `DefaultListableBeanFactory.resolveDependency()`:解决依赖
8347+
* `doResolveDependency().resolveCandidate()`:通过工厂获取Bean对象
8348+
* `registerDependentBeans()`:将Bean注册为Autowired自动装配的Bean
8349+
* `ReflectionUtils.makeAccessible()`:修改访问权限,true代表暴力破解
8350+
* `method.invoke`:利用反射为此对象赋值
8351+
* 填充属性:`applyPropertyValues()`,将所有解析的PropertyValues的属性填充至BeanWrapper
83458352
* **初始化**:`initializeBean(String, Object, RootBeanDefinition)`
8353+
83468354
* 填充Aware接口属性:`invokeAwareMethods(beanName,bean)`
83478355
* BeanName、ClassLoader对象实例、Spring工厂、Spring上下文ApplicationContext
83488356
* 前置处理:`applyBeanPostProcessorsBeforeInitialization()`
@@ -8353,6 +8361,7 @@ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.
83538361
* 后置处理:`applyBeanPostProcessorsAfterInitialization()`,**AOP在此完成,跳转注解**
83548362
* 循环依赖检查:bean 创建后,它所依赖的bean一定是初始化完成,如果没有就报错
83558363
* **注册销毁**:`AbstractBeanFactory.registerDisposableBeanIfNecessary`,
8364+
83568365
* 根据不同的scope进行disposableBean的注册,在销毁对象时调用destory()
83578366
83588367

JavaSE.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3715,8 +3715,6 @@ public class Demo01{
37153715
}
37163716
```
37173717

3718-
3719-
37203718
```java
37213719
public class Demo02 {
37223720
public static void main(String[] args) {

Linux.md

Lines changed: 143 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ id会显示用户以及所属群组的实际与有效ID。若两个ID相同,
417417

418418
### sudo命令
419419

420-
sudo:控制用户对系统命令的使用权限,root允许的操作。通过sudo可以提高普通用户的操作权限
420+
sudo控制用户对系统命令的使用权限,root允许的操作。通过sudo可以提高普通用户的操作权限
421421

422422
- -V 显示版本编号
423423
- -h 会显示版本编号及指令的使用方式说明
@@ -436,12 +436,14 @@ sudo:控制用户对系统命令的使用权限,root允许的操作。通过sudo
436436

437437
### top命令
438438

439-
top:用于实时显示 process 的动态
439+
top:用于实时显示 process 的动态
440440

441441
top -c:command属性进行了命令补全
442442

443443
top -p 进程号:显示指定pid的进程信息
444444

445+
top -d 秒数:表示进程界面更新时间(每几秒刷新一次)
446+
445447
![](https://gitee.com/seazean/images/raw/master/Linux/top命令.png)
446448

447449
**各进程(任务)的状态监控属性解释说明:**
@@ -1602,6 +1604,143 @@ vim 中提供有一个 被复制文本的缓冲区
16021604
16031605
16041606
1607+
***
1608+
1609+
1610+
1611+
### 链接
1612+
1613+
```sh
1614+
ln [-sf] source_filename dist_filename
1615+
```
1616+
1617+
* -s:默认是实体链接,加 -s 为符号链接
1618+
* -f:如果目标文件存在时,先删除目标文件
1619+
1620+
<img src="https://gitee.com/seazean/images/raw/master/Linux/文件链接.png" style="zoom: 80%;" />
1621+
1622+
**实体链接**
1623+
1624+
* 在目录下创建一个条目,记录着文件名与 inode 编号,这个 inode 就是源文件的 inode
1625+
* 删除任意一个条目,文件还是存在,只要引用数量不为 0
1626+
* 不能跨越文件系统、不能对目录进行链接
1627+
1628+
```sh
1629+
ln /etc/crontab .
1630+
ll
1631+
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab
1632+
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
1633+
```
1634+
1635+
**符号链接**
1636+
1637+
* 符号链接文件保存着源文件所在的绝对路径,在读取时会定位到源文件上,可以理解为 Windows 的快捷方式
1638+
1639+
* 当源文件被删除了,链接文件就打不开了
1640+
1641+
* 记录的是路径,所以可以为目录建立符号链接
1642+
1643+
```sh
1644+
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
1645+
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
1646+
```
1647+
1648+
1649+
1650+
1651+
1652+
***
1653+
1654+
1655+
1656+
## 进程管理
1657+
1658+
### 查看进程
1659+
1660+
ps 指令:查看某个时间点的进程信息
1661+
1662+
top指令:实时显示进程信息
1663+
1664+
pstree:查看进程树
1665+
1666+
```sh
1667+
pstree -A #查看所有进程树
1668+
```
1669+
1670+
1671+
1672+
1673+
1674+
### 进程状态
1675+
1676+
| 状态 | 说明 |
1677+
| ---- | ------------------------------------------------------------ |
1678+
| R | running or runnable (on run queue) 正在执行或者可执行,此时进程位于执行队列中 |
1679+
| D | uninterruptible sleep (usually I/O) 不可中断阻塞,通常为 IO 阻塞 |
1680+
| S | interruptible sleep (waiting for an event to complete) 可中断阻塞,此时进程正在等待某个事件完成 |
1681+
| Z | zombie (terminated but not reaped by its parent) 僵死,进程已经终止但是尚未被其父进程获取信息 |
1682+
| T | stopped (either by a job control signal or because it is being traced) 结束,进程既可以被作业控制信号结束,也可能是正在被追踪 |
1683+
1684+
孤儿进程:
1685+
1686+
* 一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程
1687+
1688+
* 孤儿进程将被 init 进程(进程号为 1)所收养,并由 init 进程对它们完成状态收集工作
1689+
* 孤儿进程会被 init 进程收养,所以孤儿进程不会对系统造成危害
1690+
1691+
僵尸进程:
1692+
1693+
* 一个子进程的进程描述符在子进程退出时不会释放,只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出,而父进程并没有调用 wait() 或 waitpid(),那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程
1694+
* 僵尸进程通过 ps 命令显示出来的状态为 Z(zombie)
1695+
* 系统所能使用的进程号是有限的,产生大量僵尸进程,会导致系统没有可用的进程号而不能产生新的进程
1696+
1697+
* 要消灭系统中大量的僵尸进程,只需要将其父进程杀死,此时僵尸进程就会变成孤儿进程,从而被 init 进程所收养,这样 init 进程就会释放所有的僵尸进程所占有的资源,从而结束僵尸进程
1698+
1699+
1700+
1701+
***
1702+
1703+
1704+
1705+
### 状态改变
1706+
1707+
#### SIGCHLD
1708+
1709+
当一个子进程改变了它的状态时(停止运行,继续运行或者退出),有两件事会发生在父进程中:
1710+
1711+
- 得到 SIGCHLD 信号
1712+
- waitpid() 或者 wait() 调用会返回
1713+
1714+
子进程发送的 SIGCHLD 信号包含了子进程的信息,比如进程 ID、进程状态、进程使用 CPU 的时间等;在子进程退出时,它的进程描述符不会立即释放,这是为了让父进程得到子进程信息,父进程通过 wait() 和 waitpid() 来获得一个已经退出的子进程的信息
1715+
1716+
1717+
1718+
#### wait
1719+
1720+
```c
1721+
pid_t wait(int *status)
1722+
```
1723+
1724+
参数:status 用来保存被收集的子进程退出时的状态,如果不关心子进程**如何**销毁,可以设置这个参数为 NULL
1725+
1726+
父进程调用 wait() 会一直阻塞,直到收到一个子进程退出的 SIGCHLD 信号,wait() 函数就会销毁子进程并返回
1727+
1728+
* 成功,返回被收集的子进程的进程 ID
1729+
* 失败,返回 -1,同时 errno 被置为 ECHILD(如果调用进程没有子进程,调用就会失败)
1730+
1731+
1732+
1733+
#### waitpid
1734+
1735+
```c
1736+
pid_t waitpid(pid_t pid, int *status, int options)
1737+
```
1738+
1739+
作用和 wait() 完全相同,只是多了两个可控制的参数 pid 和 options
1740+
1741+
* pid:指示一个子进程的 ID,表示只关心这个子进程退出的 SIGCHLD 信号;如果 pid=-1 时,那么和 wait() 作用相同,都是关注所有子进程退出的 SIGCHLD 信号
1742+
* options:主要有 WNOHANG 和 WUNTRACED 两个,WNOHANG 可以使 waitpid() 调用变成非阻塞的,就是会立即返回,父进程可以继续执行其它任务
1743+
16051744
16061745
16071746
@@ -1687,7 +1826,8 @@ netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
16871826
16881827
补充:
16891828
1690-
* lsof -i:端口号:查看指定端口号
1829+
* netstat -apn | grep port:查看指定端口号
1830+
* lsof -i:port :查看指定端口号
16911831
16921832
16931833

0 commit comments

Comments
 (0)