自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

u010502101的博客

成长中的菜鸟程序员

  • 博客(348)
  • 资源 (4)
  • 收藏
  • 关注

原创 4.二级缓存解析

二级缓存也称作是应用级缓存,与一级缓存不同的,是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改较少的数据。在流程上是先访问二级缓存,在访问一级缓存。

2023-01-16 19:06:56 2657 1

原创 3. 一级缓存解析

在上一篇基础上,我们继续看下一级缓存相关内容本节内容主要分析一级缓存,首先看一下一级缓存命中的条件有哪些。

2022-11-27 23:51:27 1496

原创 2. Executor与SqlSession解析

基本功能:改、查,没有增删的原因是,所有的增删操作都可以归结到改;缓存维护:这里的缓存主要是为一级缓存服务,功能包括创建缓存Key、清理缓存、判断缓存是否存在;事物管理:提交、回滚、关闭、批处理刷新。下面看下执行器的上下继承关系共包括3中Executor执行器,分别为SimpleExecutor、ReuseExecutor、BatchExecutor,其中BaseExecutor是封装了获取链接、维护事物、以及一级缓存相关的通用操作,三种执行器都是继承BaseExecutor而来。

2022-11-14 19:10:46 1693

原创 1. Springboot集成Mybatis

在深入理解mybatis源码之前,首先搭建mybatis的测试环境用于跟踪代码测试用。下面介绍两种springboot集成mybatis运行环境的案例。一种是通过springboot包装mybatis的构建过程,一种是自行构建Mybatis的执行环境。以查询user表为例,数据如下。

2022-11-02 23:12:02 2559

原创 10. RabbitMq 集群搭建

在本系列中介绍了搭建RabbitMq环境的过程,现在要搭建含有3台RabbitMq服务器的集群环境。,如下所示,修改成喜欢的IP即可只需修改文件中的IPADDR即可。3台服务器的hostname分别设置为node1、node2、node3比如以第一台为例,通过直接编辑hostname文件内容为node1即可,另外2台同样设置。修改方式,分别在各个节点执行,在hosts文件中追加下面内容在node1上执行下面2条命令,把node1节点上的cookie文件复制到node2和node3上。

2022-09-28 00:51:58 4087

原创 9. RabbitMq之优先级队列与惰性队列

默认情况下,生产者发布消息到RabbitMQ队列时,队列中的消息都是存储到内存中的,因此消费者消费消息时才可以快速的进行消费。即使对于持久化的消息,消息在持久化到磁盘中的同时也会在内存中保留一份,消费者消费消息时才可以进行快速的修复,但对于持久化的消息,RabbitMq需要释放内存的时候,会将内存中的消息换页至磁盘中,该操作耗时较长,会阻塞队列的操作,从而无法接收生产者的消息,虽然RabbitMq开发者们一直在研究相关算法,但效果不太理想,尤其是当消息量非常大的时候。创建优先级队列时,需要指定。...

2022-08-26 00:20:57 635

原创 8. springboot + rabbitmq 消息发布确认机制

在章节已经介绍了rabbitmq生产者是如何对消息进行发布确认保证消息不丢失的。本章节继续看下springboot整合rabbitmq后是如何保证消息不丢失的。

2022-08-05 10:05:29 2943

原创 7. RabbitMQ之延时队列

延迟队列是通过TTL实现的,TTL指Time To Live,消息存活时间,TTL是RabbitMQ中消息或者队列的属性,表明可以设置一条消息或者队列中所有消息的存活时间。可以对一条消息设置TTL,表示这条消息的存活时间;也可以对队列设置TTL,表示队列中所有消息的存活时间都是一致的。如果某条消息被设置了TTL,或者队列被设置了TTL属性,那么在TTL时间内这些消息没有被消费的话就会变成死信消息,被投递到死信队列中。在上一篇文章中已经介绍了2种设置TTL的方式:一种就是为队列设置参数,使队列中所有消息有相同

2022-07-21 01:27:48 966

原创 6 RabbitMQ之死信队列

造成消息死信的原因主要有以下3点:下面通过代码演示三种原因下死信队列的处理,如下图所示,首先生产者生产消息投递到normal_exchange交换机,然后路由到normal_queue中,队列中消息可以被Consumer1正常消费的消息会从队列中删除掉,但由于上述三种原因导致消息不能正常被消费的消息就会被重新投递到dead_exchange死信交换机,然后被路由到dead_queue死信队列中,最后死信消息被Consumer2处理。首先创建一个Consumer1消费者类,Consumer1类中创建了一个n

2022-07-01 01:27:17 875

原创 5. RabbitMQ之交换机

交换机其实是一种routingKey,或者叫路由key,生产者生产的消息根据指定的key路由到指定的队列中。无名交换机其实也是一种direct交换机,在之前几篇文章中发布消息时一直采用下面的形式,第一个参数就表示无名交换机,也就是如果不送交换机默认采用的交换机。从RabbitMQ管理端可以看无名交换机如下所示就是说凡是生产者生产的消息没有指定交换机时,都会通过默认的交换机把消息投递到QUEUE_NAME队列中。Binding其实就是绑定exchange交换机与队列的关系,用来指明交换机绑定了哪个或哪些

2022-06-17 00:44:46 635 1

原创 4. RabbitMQ之生产者发布确认原理

文章目录1. 队列持久化2. 消息持久化3. 发布确认3.1 发布确认原理3.2 消息单个确认发布3.3 消息批量确认发布3.4 消息异步确认发布在进行生产者发布确认之前先看下队列和消息持久化问题。1. 队列持久化队列持久化指将创建的队列持久化到磁盘中。如果创建的队列是非持久化的,当RabbitMQ服务重启后,非持久化的队列将会被删除掉,导致消息丢失。设置队列为持久化方式很简单,只需在调queueDeclare方法声明一个队列时指定durable参数为持久化即可,下面会具体用到。如果之前已经创建的

2022-06-03 23:32:57 460

原创 3. RabbitMQ之消息应答机制

文章目录1. 自动应答2. 手动应答消息应答机制为RabbitMQ服务器向消费者传递了一个消息后,消费者给服务器的一个回复,服务器接到答复后决定是否删除这个已经消费的消息。RabbitMQ的消息应答机制分为自动应答和手动应答两种形式。1. 自动应答RabbitMQ服务器一旦把消息传输给消费者后,服务器就默认为消息已经传送成功,服务器队列中便自动删除该消息。自动应答机制虽然传输方面的吞吐量比较高,但是这种机制存在严重的弊端。一方面如果消费者程序出现bug,或者消费者端链接或者channel已关闭导致消

2022-05-25 01:21:38 915 2

原创 2. RabbitMQ之Work Queues

文章目录1. Work Quesues概述2. Work Queues案例1. Work Quesues概述work queues是工作队列,又叫任务队列,是为了解决多个消费者有序执行密集型的资源任务。比如以下图为例,生产者产生大量消息发给了消息队列中,但是消息消费时比较耗时,这种情况下可以创建多个消费者同时进行消费,但一定要保证一个消息只能被一个消费者进行消费,假如一个消息被Consumer1消费了就不能再被Consumer2或者Consumer3再消费,所以queue队列中消息就像有序的被消费,qu

2022-05-21 16:59:35 737

原创 1. RabbitMQ之Hello World

文章目录1. 消息队列作用2. 消息队列分类3. RabbitMQ工作原理4. RabbitMQ服务器安装5. HelloWorld程序RabbitMQ消息队列本质上是一个先进先出的队列。1. 消息队列作用1. 流量消峰举个例子,如果订单系统最多能处理一万次订单,这个处理能力应付正常时段的下单时绰绰有余,正常时段我们下单一秒后就能返回结果。但是在高峰期,如果有两万次下单操作系统是处理不了的,只能限制订单超过一万后不允许用户下单。使用消息队列做缓冲,我们可以取消这个限制,把一秒内下的订单分散成一段时

2022-05-20 19:44:52 476

原创 1.2 类的加载器

文章目录1. 双亲委派机制原理2 双亲委派的优势与弊端3 违反双亲委派机制的行为3.1 第一种违反双亲委派机制行为3.2 第二种违反双亲委派机制行为4. 沙箱机制5. 自定义类加载器在上篇文章中介绍了类的加载器以及加载过程,下面继续进一步理解类的加载器。1. 双亲委派机制原理双亲委派机制原理:如果一个类加载器收到了类加载的请求,该类加载器并不会立即去加载,而是把加载任务先委托给父加载器加载;如果父加载器还有父加载器,则会继续向上委托,一直委托到启动类加载器;如果父加载器可以完成加载Class字节码的任

2022-03-02 23:58:58 415

原创 8.7 JVM命令行监控之——jcmd

文章目录1. 描述2. 用法2.1 查看java进程2.2 查看jcmd有哪些command命令2.3 查看虚拟机启动了多长时间2.4 打印栈信息2.5 查看类的统计信息2.6 导出堆dump文件2.7 获取系统的properties属性2.8 获取JVM的启动参数1. 描述jcmd即jvm command,该命令行工具的功能几乎涵盖了前面几节介绍的所有命令行工具的功能,它可以用来导出堆、查看堆栈使用情况、查看java进程、导出线程信息、查看GC运行情况。2. 用法命令:jcmd pid help

2021-11-13 00:37:10 669

原创 8.6 JVM监控之——jstack

文章目录1. 描述1. 描述jstack全名为jvm stack trace,java堆栈跟踪工具,该工具用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因。线程出现停顿时通过jstack来查看各个线程的调用堆栈,就可以获知没有相应的线程到底在后台做些什么事情,或者等待什么资源。public class JstackDe

2021-11-10 14:11:08 693

原创 8.5 JVM命令行监控——jmap

文章目录1. jmap描述2. jmap用法2.1 导出dump文件2.2 输出堆内存信息2.2.1 输出堆空间使用信息2.2.2 输出对象统计信息1. jmap描述jmap全称jvm memory map,该命令有两个作用:第一个是可以获取堆dump文件,dump文件是堆转储快照的二进制文件文件;第二还可以获取堆的使用情况、堆中对象统计信息以及类加载信息等。2. jmap用法2.1 导出dump文件命令:jmap -dump:format=b, file=文件名 pid 或者 jmap -dum

2021-11-09 00:29:29 649

原创 8.4 查看JVM所有系统参数

文章目录1. 查看所有JVM参数启动的初始值2. 查看所有被用户或者JVM修改过的参数的值3. 查看所有JVM参数的最终值1. 查看所有JVM参数启动的初始值命令:java -XX:+PrintFlagsInitial此地应有截图。。。2. 查看所有被用户或者JVM修改过的参数的值命令:java -XX:+PrintCommandLineFlags此地应有截图。。。3. 查看所有JVM参数的最终值如果JVM的参数的初始值被修改过就显示修改过的值,如果没被修改过就显示初始的值,命令:java

2021-11-08 15:54:29 444

原创 8.3 JVM命令行监控——jinfo

文章目录1. jinfo描述1. jinfo描述jinfo(Configuration Info for Java) 的作用是实时查看和调整虚拟机各项参数。jinfo与jps -v的区别:使用jps命令的-v参数可以查看虚拟机启动时显式指定的参数列表, 但如果想知道未被显式指定的参数的系统默认值,则需要通过jinfo命令。...

2021-11-08 01:45:27 444

原创 8.2 JVM命令行监控——jstat

文章目录1. jstat介绍2. jstat用法2.1 案例一2.2 案例二2.3 案例三2.4 案例四1. jstat介绍jstat全名JVM statistics monitoring tool,用于监视虚拟机各种运行状态信息的命令工具,它可以显示本地或者远程虚拟机进程中类的装载、内存、垃圾收集、JIT编译运行等运行时数据。2. jstat用法命令:jstat -<option> [-t] [-h<lines>] <vmid> [<interval&gt

2021-11-05 00:47:07 380

原创 8.1 JVM命令行监控——jps

文章目录1. jps介绍2. jps用法2.1 jps -q2.2 jps -l2.3 jps -m2.4 jps -v1. jps介绍jps全称java process status,用于查看Hotspot虚拟机中正在执行的进程。2. jps用法jps [-q][-mlvV] [hostid]2.1 jps -qjps -q之显示进程id。2.2 jps -ljps -l输出执行进程程序的全类名或者如果执行的是jar包,输出jar的完成路径。2.3 jps -mjps -m输出虚拟机

2021-10-27 00:30:26 719

原创 7. 字节码指令详解

文章目录1 加载与存储指令1.1 加载1.2 存储字节码指令一般包括两种形式:一种是只有一个操作符1 加载与存储指令加载指的是从栈帧中的局部变量表中加载数据到栈帧中的操作数栈中,存储与加载正好反过来,指的是把操作数栈中的数据存储到局部变量表中。关于局部变量表和操作数栈的理解可以参考JVM的运行时数据区。1.1 加载加载又包括两种加载,第一:从局部变量表中加载数据到操作数栈中;第二种:直接把常量加载到操作数栈中。1. 从局部变量表中加载数据到操作数栈中从局部变量表中加载数据到操作数栈中主要包括

2021-10-15 10:12:59 1516

原创 5. JVM垃圾回收

文章目录1. 什么是垃圾对象2. 引用计数算法3. 可达性分析算法1. 什么是垃圾对象垃圾对象(Garbage Object)指程序运行中没有任何指针指向的对象,这种对象就是要被回收的对象。如果不及时对这些垃圾对象回收,这些对象占据内存空间,容易导致内存溢出。对于内存中的对象,首先在标记阶段被标记为了垃圾对象,在清除阶段才会被清除。区分内存中哪些是存活对象,哪些是垃圾对象的阶段即为垃圾标记阶段。垃圾标记阶段判断兑现是否存活有两种方式:引用计数算法和可达性分析算法。2. 引用计数算法引用计数算法(R

2021-09-22 23:54:43 412 1

原创 java中对象引用

文章目录1. 强引用2. 软引用(SoftReference)3. 弱引用(WeakReference)4. 虚引用(PhantomReference)5. 总结java中对象引用分为强、软、若、虚4中引用,其中强引用就是普通的new一个对象,软引用、弱引用、虚引用都是继承自抽象类Reference。1. 强引用程序代码中最常见的引用,比如Persion persion = new Persion(),无论任何情况下,只要强引用关系还在,强引用的对象是可触及的,垃圾回收器就不会回收掉被引用的对象。如

2021-09-06 01:52:31 642

原创 垃圾回收中的安全点与安全区域

文章目录1. 垃圾回收中的安全点2. 垃圾回收中的安全区域1. 垃圾回收中的安全点安全点:程序执行过程中需要进行垃圾回收时,只有在特定的位置停顿下来开始进行GC,这些特定位置称之为安全点(Safepoint)。Safepoint的选择很重要,如果太少可能导致GC等待用户线程执行的时间太长;如果太多,就是太频繁的执行GC,影响性能。大部分指令执行时间都非常短,通常会根据是否具有让程序长时间执行的特征为标准,比如选择一些执行时间较长的指令作为saftpoint,如方法调用、循环跳转和异常跳转等。当多个

2021-09-02 00:38:16 1482 2

原创 并发与并行

文章目录1. 操作系统中的并发与并行2. 垃圾回收的并发与并行并发还是并行在不同的场景下是不同的,下面分别就操作系统中和JVM垃圾回收器中的差别介绍如下1. 操作系统中的并发与并行并发:操作系统中并发并行与应用程序中的并发并行是一个意思。并发指在一个时间段内,一个处理器中有多个程序同时在运行。并发并不是真正意义上的同时进行,只是CPU把一个时间段划分成几个时间片段,然后CPU在这几个时间片段之间来回切换,由于CPU处理时间非常快,只要时间间隔处理得当,可以让用户感觉多个应用程序同时在运行。这里CP

2021-09-01 00:54:12 146

原创 JVM之内存溢出与内存泄漏

文章目录1 内存溢出2 内存泄漏(Memory Leak)1 内存溢出内存溢出(OutOfMemoryError)就是JVM中没有空闲内存,垃圾回收器回收垃圾之后也无法提供足够的内存,导致内存溢出。内存溢出一般由两方面导致:虚拟机的堆内存设置太小;内存中创建了很多大对象,垃圾回收器之后也不能回收足够的内存空间。在发生OOM之前一般都会进行垃圾回收,如果能回收足够的内存空间就不会出现OOM异常;如果垃圾回收之后也不能回收足够空间,此时就会发生OOM。但是不是任何情况下,OOM之前都会触发垃圾回收,比如

2021-08-31 00:35:22 1199

原创 System.gc()

文章目录System.gc()等同于Runtime.getRuntime().gc(),因为System.gc()底层就是调用Runtime.getRuntime().gc()实现的。通过显示的调用System.gc(),表示显示的触发FULL GC,同时对新生代和老年代进行垃圾回收,但是调用System.gc()无法保证JVM立即进行垃圾回收。JVM的垃圾回收是自动进行的,无须手动触发。System.gc()与System.runFinalization()区别:前面已经介绍,System.gc

2021-08-30 00:38:34 1940

原创 java之finalization

文章目录finalization原理java提供的对象终止(finalization)机制主要用来处理对象被回收前的处理逻辑,主要是通过调用对象的finalize()方法来处理对象终止逻辑。finalize()方法允许被重写,一般在该方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。不要主动调用finalize()方法,交给垃圾回收器回收垃圾时进行调用。原因如下:finalize()方法会导致对象复活;fizalize()执行时间是无法保障的,它完全由GC线程决定,极端情

2021-08-25 01:08:14 908 1

原创 StringPool详解

文章目录1. String的不可变性2. StringPool结构3. 字符串拼接操作4. 拼接操作与append操作效率对比5. intern详解5.1 intern基本知识5.2 new String创建了几个对象5.3 案例1. String的不可变性在JDK7之后,String的内容是存放在堆中的字符串常量池(StringPool,也可叫StringTable)中的,字符串常量池中相同的字符串只会创建一份,所以定义相同的字符串变量时,多个字符串变量都是指向了同一份地址中的字符串。示例一pub

2021-08-15 20:02:55 1860

原创 4、执行引擎

文章目录1. 执行引擎介绍2. 指令理解3. Hotspot虚拟机中解释器为什么与JIT编译器并存4. JIT热点代码探测方式5. HotSpot中解释器、编译器设置方式6. AOT编译器1. 执行引擎介绍执行引擎是java虚拟机和核心组件之一。JVM的主要任务是负责装载字节码到内部,但字节码不能直接运行在操作系统上,因为字节码不等同于机器指令,它内部包含的仅仅只是一些能被JVM识别的字节码指令、符号集,以及其他辅助信息。执行引擎(Execution Engine)的任务就是将字节码指令解释/编译

2021-08-05 01:22:57 252

原创 3、直接内存

文章目录直接内存(Direct Memory)并不是虚拟机运行时数据一部分,也不是《Java 虚拟机规范》中定义的内存区域。如果这部分内存被频繁使用,也会导致OOM。在JDK4中新引入的NIO(New Input/Output)类,其引入了一种基于通道(Channel)与缓冲区(Buffer)的方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。这在一些场景中可以显著提高性能,避免了java堆和Nativ

2021-07-28 00:47:15 268

原创 java对象实例化内存布局与访问定位

文章目录1. 对象实例化方式2. 对象创建的步骤3. 对象的内存布局4. 对象的访问定位1. 对象实例化方式通过new的方式,例如Persion p = new Persion()通过Class的newInstance()该方式已经被标记过时,这种创建对象的方式有一定局限性:只能创建构造函数为无参的对象;只能创建构造函数为pulic类型的。通过Constructor的newInstance这种方式正好弥补了Class.instance的两种局限性,可以实例化非public、带有参构

2021-07-25 15:06:22 299

原创 2、JVM运行时数据区

文章目录运行时数据区介绍1、程序计数器2、虚拟机栈2.1、虚拟机栈介绍2.2、虚拟机栈异常运行时数据区介绍上节讲解了JVM的类加载机制,class字节码文件经类加载子系统加载后存放到运行时数据区的方法区中。而运行时数据区就是Java虚拟机在执行Java程序的过程中会把它管理的内存分为若干个不同的数据区域。这些区域有着各自的用途,一级创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。根据《Java虚拟机规范》中规定,jvm所管理的内存大致包括以下几个运行

2021-07-05 01:22:44 620 1

原创 JVM方法介绍

文章目录1、静态引用与动态引用2、虚方法与非虚方法1、静态引用与动态引用在JVM中,将符号的引用转换为调用方法的直接引用与方法的绑定机制有关静态引用(静态链接)当字节码文件被装入JVM内部时,如果被调用的方法在编译期确定,且运行期保持不变,这种情况下将调用方法的符号引用转换为直接引用的过程称为静态引用,或静态链接;动态引用(动态链接)如果被调用的方法在编译期不确定,在运行期将调用方法的符号引用转换为直接引用的工程称为动态引用,或动态链接。如下代码所示,有一个基类Persion,子类

2021-06-13 11:49:25 249

原创 1、JVM类的加载

文章目录1、加载2、链接2.1 验证2.2 准备2.3 解析3、初始化如下图所示,JVM类的加载系统负责从文件系统、网络中或者压缩包中加载Class字节码文件。整个类加载子系统主要由三大步骤完成:加载 -> 链接 -> 初始化。经过类加载系统加载后,Class文件被加载到内存中并对类进行初始化(注意只是初始化了类的静态变量或者静态代码块,并不是执行对象的初始化方法,可以参考后续介绍)。1、加载类加载子系统的加载阶段主要由三类加载器进行加载Class文件:引导类加载器、扩展类加载器、系统类

2021-05-08 22:49:02 198 1

原创 3.6 控制器之Service

文章目录二、Service类型1. ClusterIP类型2、NodePort类型3. ExternalName类型服务二、Service类型1. ClusterIP类型如上图所示,ClusterIP把客户端的请求通过负载均衡路由到集群后端的pod中,ClusterIP类型的service主要在每个node节点上使用ipvs,将发到ClusterIP service端口的数据,转发到后端pod的kube-proxy中,然后kube-proxy内部实现负载均衡方法,查询到ClusterIP servi

2021-03-21 13:26:24 196

原创 并发读源码——并发读源码Striped64/LongAdder/DoubleAdder/LongAccumulator/DoubleAccumulator

文章目录1、LongAdder原理介绍2、LongAdder源码介绍3、LongAdder并发时应用4、DoubleAdder分析1、LongAdder原理介绍LongAdder是JDK8中新增加的一个并发类,LongAdder主要用于对long型变量进行CAS(CAS可以参考前面系列文章)操作,但AtomicLong也是对long型变量进行CAS操作,两者什么区别呢?AtomicLong内部维护了一个volatile long类型的变量,多个线程并发CAS操作该变量,而LongAdder把一个lon

2021-03-16 00:08:23 205

原创 并发读源码——AtomicIntegerArray/AtomicLongArray/AtomicReferenceArray

文章目录1、AtomicIntegerArray介绍2、AtomicIntegerArray原理3、AtomicIntegerArray源码详解4、AtomicIntegerArray多线程用法5、AtomicLongArray/AtomicReferenceArray介绍6、保证数组元素另一用法1、AtomicIntegerArray介绍AtomicIntegerArray提供了数组元素的原子操作,前面章节介绍的AtomicInteger,是对其中的一个int类型的值保证原子性,而AtomicInte

2021-02-27 18:11:10 222

helm-tiller.tar

由于谷歌被强,无法下载谷歌镜像,特此提供Helm的服务器端Tiller的镜像,该镜像可以在k8s中用于创建pod

2020-11-19

kubeadm-basic.images.tar.gz

安装kubeadm时,需要登录到google才能下载google镜像,由于国内不能登录google,所以上传google的镜像

2020-06-10

android入门教程

对于没了解过android开发的同学非常适合。

2015-10-04

STC的详细介绍

该文档400多页,全面细致的介绍了STC单片机,是新手学习的好资料,也是技术人员备用查阅的好资料。档

2013-10-07

空空如也

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

TA关注的人

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