自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 资源 (1)
  • 问答 (2)
  • 收藏
  • 关注

原创 我的第一篇博客

我的第一篇博客我写博客的目的:平时学习总是有输入无输出,对于学到的知识没有进行笔记记录,导致本来学的很清楚到头来没几个月自己忘干净了,再次看和全新的一样,我想要脱离这种模式,做出改变故决定写博客,让自己在学习到知识后能够有输出,有总结,对知识点理解更加深刻。有人问怎么评定你完全理解某个技术或者知识点,不是你觉得你懂了,当你感觉你自己对某个技术很熟悉的时候你可以尝试给其他人讲解或者分析,你.........

2019-12-01 17:28:58 269

原创 特权级那些事儿-实模式下分段机制首次出现的原因

操作系统的特权级模块在整个操作系统的学习中应该算的上是最难啃的了,提到特权级就要绕不开保护模式下的分段机制;如果想要彻底弄明白就要对比实模式下的分段机制有什么缺陷。这就衍生出很多问题如:什么是实模式?采用分段机制进行寻址的意义?什么是保护模式?为什么要设计保护模式?如果只是针对性的单独回答某个问题一直在罗列八股文要点,只讲“是什么”而忽略“为什么”,初学者看完之后会感觉始终没学透彻,更适合与有基础的人复习。任何事物发展到今天,都有段“合理”的过程,了解这个过程是怎么来的,有助于理解它今天的形态。

2023-03-08 19:48:56 427 1

原创 CPU扫盲-CPU如何执行指令以及流水线技术

计算机基本硬件由控制器、储存器、运算器、输入设备、输出设备五大部件组成,其中运算器、控制器、部分储存器被集成在一起统称为中央处理单元。CPU在电路设计上实现了多个独立电路,支持每个步骤独立执行,CPU 可以一边执行指令,一边取指令,一边译码。虽然CPU在同一时刻只能执行一条指令,由于cs:ip的值在取码完成后就会被更新为下一条指令的地址,所以在执行这条指令的同时可以去翻译下一条指令,同时去获取下下条指令。这样的流水线模式大大提升CPU的执行效率。

2023-03-03 19:27:06 1419 1

原创 CPU扫盲-自创指令集难吗?

这篇文章则是针对指令集的专场,指令集顾名思义就是一套指令的集合。创造指令集并不难,难的是如何将指令集推广,那这篇文章我们就从创作者的角度去理解它,我们尝试创造一个只包含几个指令的指令集。当然这篇文章的目的不是摒弃全部现有指令集概念完全闭门造车,而是站在现有指令集概念的肩膀上从创造者的角度去更深入的理解它。

2023-02-24 13:14:17 2157

原创 CPU扫盲-CPU与指令集

很多非开发的同学指令集名称与CPU名称分不清。这是因为一种 CPU 只能识别一种指令集,所以很多情况下 CPU 都以其支持的指令集名称来称呼,比如当我们要下载软件时通常关注的就是指令集的名称x86、ARM等,但是我们在买电脑时厂商备注的却是酷睿12代、龙芯3C5000、飞腾2000等,所以导致有的同学会把龙芯、飞腾、酷睿与x86、ARM搞混。这里的龙芯、飞腾、酷睿指的是CPU的名称,名字可以有CPU的厂商来取。而x86、ARM则是指令集的名称,基本都是由国外最早的几家处理器厂商创造并命名的

2023-02-18 16:12:52 6105 4

原创 IPv6-ICMPv6协议

ICMPv6是IPv6的基础协议,也是最重要的协议。ICMPv6有多种消息类型,IPv6中的很多功能都是利用ICMPv6中的一种或多种消息类型组合完成的。ICMPv6在IPv6中的协议号为58,该协议号在IPv6报头的“nextheader”字段中。ICMP报文有两种差错消息及信息消息​PMTU就是路径上的最小接口MTU。PMTUD的主要目的是发现路径上的MTU,当数据包被从源转发到目的地的过程中避免分段。​无状态配置,和节点启动时的一个NDP机制。......

2022-07-17 21:27:42 1100

原创 IPv6-基础

128bits的地址方案,解决了ipv4地址池耗尽的问题,为为了数10年提供了巨大的ip地址空间无需NAT技术了,有助于在公网上也能实现IP实名制不在有广播、不再有ARP,降低广播造成的网络资源消耗自动配置过程允许ipv6网络中的节点更加便捷接入ipv6局域网重新编址机制使得ipv6提供商之间的转换对最终用户是平滑的、无感的v4v6过渡方式丰富。............

2022-07-17 21:20:24 1469

原创 JVM角度看方法调用-MethodHandle篇

JVM角度看方法调用系列文章:1.JVM角度看方法调用-开篇2.JVM角度看方法调用-反射篇3.JVM角度看方法调用-MethodHandle篇4.JVM角度看方法调用-性能压测篇(码字…)5.JVM角度看方法调用-Lambda篇(码字…)​ 在我们平时开发中常用的方法调用有三种:直接调用、反射调用、MethodHandle调用,这一系列文章就围绕着三种调用方式进行原理剖析和性能分析,本文JDK的版本是1.8。在上篇文章中我们最后总结由于反射调用的种种缺陷严重影响性能,所以当我们热点代码需要用到反射调用时不

2022-06-05 20:53:24 938 1

原创 JVM角度看方法调用-反射篇

文章目录一、反射调用的原理1.1获取MethodAccessor1.2 native版本MethodAccessor的实现1.3 java版本的MethodAccessor的实现二、反射调用优2.1、为什么反射调用性能低2.2、反射调用性能测试和优化(一)、直接调用(二)、反射调用(三)、反射调用优化版本1(四)、反射调用优化版本2(五)、反射调用优化版本3(六)、MethodHandle的黑魔法(七)、java版本超多态虚方法无法内联问题(八)、总结JVM角度看方法调用系列文章:1.JVM角度看方法

2022-05-26 07:00:00 463

原创 JVM角度看方法调用-开篇

文章目录一、虚方法和非虚方法1.1、Interpreter下执行比较1.2、JIT下比较1.2.1、内联缓存1.2.2、去虚化和方法内联1)非虚方法内联2)完全去虚化内联3)”陷阱“导致去优化4)条件去虚化内联二、Interpreter、JIT、AOT 分析三、JVM中可以内联和不能内联的场景JVM角度看方法调用系列文章:1.JVM角度看方法调用-开篇2.JVM角度看方法调用-反射篇 (码字...)3.JVM角度看方法调用-MethodHandle篇(码字...)4.JVM角度看方法调用-

2022-05-18 17:18:34 492

原创 @Async错误使用导致Spring循环依赖报错

注:首先如果程序中出现了循环依赖本身就是程序设计存在问题,尽量在设计上避免出现循环依赖。在springboot框架中已经默认不支持循环依赖的存在了,除非设置spring.main.allow-circular-references=true问题概述This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching -

2022-04-17 00:17:37 6602 2

原创 服务第一次访问卡顿

一、问题分析前段时间有同事和我说我们自测环境新增了几个小服务第一此访问的时候总是卡卡的,后面就好了,想让我排查一下。心里想了几种可能Apache代理服务器与后台服务器首次握手慢,后续请求复用长链接无卡顿现象。我们自测环境前端服务器用的是apache,配置了反向代理到后端小服务。如果客户端请求超过了代理服务器设置的最大链接数,当前请求时不会被转发到后台服务器的。一个服务第一次被调用时会触发很多类的加载和初始化,但这个往往是第一次访问卡,后续访问就不卡了。因为类的卸载是比较苛刻的所以大多数类加载到jvm

2022-04-10 22:45:57 2893

原创 SpringDataJPA+Hibernate框架源码剖析(五)框架整合 之 SpringBoot整合JPA剖析

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)

2022-02-23 21:40:11 829

原创 SpringDataJPA+Hibernate框架源码剖析(六)@PersistenceContext和@Autowired注入EntityManager的区别

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)

2022-02-21 22:08:50 1286

原创 SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建(包括spring的事务机制)

2022-02-21 21:35:48 546

原创 SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H

2022-02-21 21:10:36 511

原创 SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H

2022-02-21 20:45:53 1587

原创 SpringDataJPA+Hibernate框架源码剖析(一)框架介绍

SpringDataJPA+Hibernate框架源码剖析系列文章:SpringDataJPA+Hibernate框架源码剖析(一)框架介绍SpringDataJPA+Hibernate框架源码剖析(二)框架整合 之 EntityManagerFactory的构建SpringDataJPA+Hibernate框架源码剖析(三)框架整合 之 Repository接口实现的生成SpringDataJPA+Hibernate框架源码剖析(四)框架整合 之 事务管理器的构建SpringDataJPA+H

2022-02-21 20:26:34 1179

原创 从网线到IO模型(网络基础整合)

文章目录网络基础1.什么是协议,常见协议2.网络应用设计模式 BS/CS优缺点什么是C/S模式什么是B/S模式优缺点3.分层模型(物数网传会表应)4.以太网帧协议(为什么需要+报文分析+演示)1)为什么需要以太网帧协议?2)ARP协议的作用?3)RARP协议作用6.IP协议(为什么需要+报文分析+演示)1)为什么需要IP协议?2)IP协议怎么区分广播域?3)IP协议段分析4)路由表,路由规则1. TCP/IP使用需要通信的目的IP地址和路由表中每一个路由项的网络掩码进行相与计算,如果相与后的结果匹配对应路由

2022-02-15 15:29:25 1772

原创 JVM的Reference机制

1.finalizer生产大于消费导致内存溢出测试User重写了finalize方法的类在创建User对象的同时会创建一个Finalizer对象并加入到Finalizer中以unfinalized为头节点的链表中,当触发GC时如果垃圾收集器判断User对象没有与GCRoot的强引用时则会将Finalizer放到Reference.pending属性上,由线程ReferenceHandler负责处理将Finalizer添加到Finalizer.queue中,然后由线程FinalizerThread负责处理,

2022-01-10 11:04:42 476

原创 进程地址空间和虚拟内存

一下内容基于80x86的linux虚拟机:虚拟内存优点虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元(MMU)之间,虚拟内存的优点有:应用程序所需内存大于可用物理内存时也可以运行当物理内存不足是,虚拟内存也可以映射磁盘空间,但是对程序来说还以为自己在使用内存。程序只有部分代码装入内存时进程也可以执行当物理内存不足时可以将部分需要执行的代码放入物理内存,暂时不需要执行的代码放入磁盘。程序员可以编写与机器无关的代码,不用关心物理内存的组织结构当程序需要申请一块连续内存空间时,

2021-09-11 03:29:06 651

原创 CompletableFuture:让你的代码免受阻塞之苦

文章目录前言场景说明CompletableFuture使用CompletableFuture的创建:结果的获取:异常处理:同步方法Pick异步方法查询所有店铺某个商品价格为什么仍需要CompletableFuture其他API介绍whenComplete计算结果的处理提供了三个方法说明示例thenApply转换提供了三个方法说明示例thenAccept结果处理提供了三个方法说明示例thenCompose异步结果流水化提供了三个方法说明示例执行流程图thenCombine组合结果提供了三个方法说明示例执行..

2021-08-11 12:49:36 783

原创 update select 总是忘...烦死了

update table1 t1 set name=t2.name from table2 t2 where t1.BH=t2.BM

2021-08-06 11:41:46 90

原创 JVM本地方法栈

Java虚拟机栈用于关联java方法的调用,而本地方法栈用于管理本地方法的调用本地方法栈也是线程私有的本地方法就是java中常见的native方法,使用C语言实现的它的具体做法是在本地方法栈中等级native方法,在执行引擎执行时加载本地方法库并不是所有虚拟机都支持native因为在jvm规范中没有明确要求在HotspotJVM中,直接将本地方法栈和虚拟机栈合二为一了。想要了解什么是本地方法以及如何实现本地方法的可以看JNI与本地方法...

2021-08-03 23:15:37 638

原创 虚拟机栈面试题

一、调整虚拟机栈的大小能保证栈不溢出嘛?为什么溢出前不进行垃圾回收?答:不能保证,如果代码本身就有问题,一直无限进行方法调用,增加栈的大小只能推迟栈的溢出并不能避免。至于为什么不进行垃圾回收,由于栈不像堆中的对象一样引用关系复杂,栈桢中的垃圾无非是指执行完毕的方法栈桢,栈桢在出栈后即没有存在意义了直接销毁掉即可,所以栈中是不存在GC的。二、局部变量表中的数据是线程安全的嘛?或方法中定义的局部变量是否线程安全?答:这个不一定,要看这个局部变量有没有发生逃逸如果发生逃逸则不一定线程安全,如果未发生逃逸则

2021-08-03 23:14:10 76

原创 java虚拟机栈(亦篇足以,吴懈可击)

文章目录前言※局部变量表1.局部变量表概况2. 变量槽Slot3.局部变量和成员变量变量的分类※操作数栈1.操作数栈概述2.栈顶缓存技术先看n-TOS caching再看n-state TOS caching3.i++和++i问题※动态链接※方法返回地址三、方法的调用1.早起绑定和晚期绑定⭕️早期绑定⭕️晚期绑定2.虚方法和非虚方法⭕️非虚方法&虚方法定义⭕️方法调用字节码指令3.虚方法表⭕️为什么要有虚方法表⭕️虚方法表举例前言**[语雀地址:https://www.yuque.com..

2021-08-03 01:54:03 695

原创 JVM操作数栈之栈顶缓存(看不懂捶我)

前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/mggrlr基于栈式的架构的虚拟机所使用的零地址指令更加紧凑,单完成一项操作的时候必然需要使用更多的入栈和出栈指令,虚拟机栈也是存在于内存中,这就意味着将需要更多的指令分派次数和内存读/写次数,频繁的执行内存读/写操作必然会影响执行速度,为了解决这一问题HotSpot JVM的设计者们提出了栈顶缓存(Top-of-Stack-Caching)技术,将栈顶元素(或栈顶周边)元素缓存到物理CUP的

2021-08-01 03:30:58 1687 2

转载 内存分页机制完全攻略

http://cache.baiducontent.com/c?m=vIH_0Ke8bO6DzLXJDeAYAlAnILItfAkEwKncIazGo–bpmJxaXwhBEvkpJnpViOIl4O_atnm8QxGRqSggYIzhWtZURBheDgUlkkOYA3rHN7b5lJ0nWjbs8Vy7ZBXbWPXo-nOj28aDQjHxivBGThc3_g3xX69fmksoCfy3DSWA37&p=882a925993904ead07b48f3461&newp=8f39de15d

2021-07-23 11:37:58 292

转载 (翻译)JVM——Java物理内存模型(JMM)及运行时内存模型

转载

2021-07-23 11:36:07 103

原创 程序计数器

程序计数器是jvm运行时数据区里最小的一块内存区域,几乎可以忽略不计,也是运行速度最快的一块区域程序计数器是在jvm规范中唯一一块不会出现OutOfMemoryError的区域程序计数器用来记录下一条要执行指令的地址,如果当前方法时native方法则程序计数器记录为null。由执行引擎修改程序计数器每个线程一个问:为什么程序计数器线程独立,每个线程都有一个?答:java是支持多线程的语言,程序计数器存在的很重要的一个原因是当线程上下文切换时记录当前线程将要执行的指令地址,防止线程切换回来时不.

2021-07-22 00:17:30 217

原创 java的SPI机制(jdk1.8)

SPI全名Service Provider Interface(服务提供者接口),SPI的主要目的是实现服务的热插拔效果,主要应对的场景是设计者提供一个接口,这个接口的具体实现由不同厂商提供,设计者只要引入厂商提供的实现jar包就可以自动装配,无需改动代码。例如:JDBC的驱动加载。SPI机制满足:不需要改动源码就可以实现扩展,解耦。实现扩展对原来的代码几乎没有侵入性。只需要添加配置就可以实现扩展,符合开闭原则。其实很多知名框架的自动装配都是借鉴了JDK的SPI机制如SpringBoot的star

2021-07-19 01:27:18 490 2

原创 类加载器一篇足以

文章目录前言一、类加载器相关概念1.Classloader的作用2.类加载的分类3.类加载器的必要性4.命名空间①.何为类的唯一性②.命名空间③.有关命名空间的例子例子1:不同类加载器加载的同一个class文件会产生两个Class对象例子2:打破双亲委派的情况下,MyClassloader可以加载系统类加载器已经加载过的类例子3:即便打破双亲委派机制,同一个类加载器也不能加载同一个类两次5.类加载机制的基本特征二、类加载器分类(java8)1.引导类加载器2.扩展类加载器3.系统类加载器4.数组的类加载..

2021-07-19 01:22:14 478 3

原创 java类加载子系统之类的卸载

文章目录前言一、描述二、图例三、方法区的垃圾回收前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd一、描述当Sample类被加载、链接和初始化后,他的生命周期就开始了。当代表Sample类的Class对象不再被引用,即不可触及时,堆上的Class对象就会被回收结束生命周期,Sample类在方法区内的数据也会被卸载,从而结束Sample类的生命周期。一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期。..

2021-07-12 23:15:19 132

原创 jvm类加载子系统之类的初始化

文章目录前言一、具体描述二、的线程安全问题主动使用前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd一、具体描述类的初始化是类装载的最后一个阶段。如果前面的步骤都没有问题说明类可以被顺利装载到系统中,此时jvm才会执行类中的字节码(即到了初始化阶段才真正开始执行类中定义的java程序代码)。初始化阶段就是执行类初始化方法()的过程此方法不需要程序员定义,是javac编译器自动收集类中所有类变量的赋值动作和静态代码..

2021-07-11 22:55:59 221 1

原创 java的常量池

文章目录前言为甚要有常量池字节码中的常量池什么是符号引用运行时常量池什么是直接引用字符串常量池字符串常量池为什么要移动到堆中前言java中有字节码中的常量池、运行时常量池、字符串常量池三张常量池,语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd为甚要有常量池public class Demo1 { public static void main(String[] args) { System.ou..

2021-07-10 02:12:29 177

原创 jvm类加载子系统之链接阶段

文章目录前言准备(Prepare)解析(Resolve)前言语雀地址:https://www.yuque.com/yangxiaofei-vquku/wmp1zm/dmz2gd## 验证(Verify)**目的**:验证的目的是保证.class文件的字节流中信息符合当前虚拟机的要求,保证加载类的正起行,不会危害虚拟机的自身安全。验证大体分为四步格式检查、语义检查、字节码验证、符号引用验证,**验证阶段并不是单独存在的模块,验证阶段穿插在加载和解析阶段之中完成。**![在这里插入图片描..

2021-07-10 02:08:09 207

原创 类加载时JVM在搞什么?JVM源码分析+OOP-KLASS模型分析

OOP-Klass模型在撸源码之前首先科普下JVM的OOP-Klass模型:JVM内部基于oop-klass模型描述一个java类,将一个java类分为两个部分进行描述,其中第一个模型是oop,第二个模型是klass,其中oop用来表示堆中的java对象实例,储存着对象实例的非静态成员变量属性,不包含任何方法;Klass用来表示java类的元数据,包含了java类中声明的方法存在于方法区;oop有klass的引用,如此多个oop实例就不用都保存一份相同的方法信息了。Klass分类OOP分类类加

2021-07-04 23:51:48 699 2

原创 JNI动态注册、静态注册实例及其实现原理分析

想要彻底学好JVM需要一定C语言基础,要理解头文件、指针、结构体、结构体指针、函数指针、类型别名等概念,本文尽量通俗易懂的介绍JNI一、什么是JNIJNI全名Java Native Interface中文名java本地开发接口。通过JNI可以让java代码调用C或C++等底层语言,也可以用C或C++调用java语言,是java与其他语言交互的协议和桥梁,可以保证java代码的可移植性。二、为什么要用JNI当你无法用纯Java来实现需求的时候,就需要使用JNI来用底层语言编写的本地方法来满足这些该需求

2021-06-24 15:02:02 1105

原创 JVM体系结构篇之JVM的指令集架构模型

常见的指令集架构有两种一种是基于寄存器的指令集架构,一种是基于栈的指令集架构。JVM采用的是后者。通过一段代码来分别介绍一下基于栈的指令集合基于寄存器的指令集的区别public static void method(){ int a=1; int b=2; int c=a+b; return;}基于栈的指令集架构执行的指令不算方法返回return一共8行代码,每个指令都是相对于栈顶栈帧和栈顶栈帧操作数栈的操作,无需关心操作数(进行加减乘除的变量,上图中的1、2)

2021-05-25 17:22:12 227

原创 JVM体系结构篇之java代码执行流程

首先Java源码经过前端编译器编译生成.class文件然后经过类加载器加载、字节码校验器校验进入JVM运行时数据区,当有方法被调用时,程序计数器中的字节码指令会被执行引擎的翻译器转换为机器指令执行;当出现热点代码时会被执行引擎的JIT及时编译器预先编译为机器指令并缓存到方法区,待到热点代码被调用时直接执行缓存中的机器指令。...

2021-05-25 17:16:27 197

论坛管理系统(很简单适合学生党大作业哦)

学生党过来的,懂你们哦,下载看一下不懂可以联系我!

2018-10-08

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除