读《周志明的软件架构课》--学习笔记和感想随笔

YOLOv13改进策略【Neck篇】| GSConv 轻量卷积,Slim-Neck 减参数还不掉点 Neck 篇的第二篇继续"替换式"改进,这次的对象是 Neck 里的下采样卷积。GSConv 出自《Slim-neck by GSConv: a better design of lightweight detector》(2022),它的出发点:DWSConv(深度可分离)轻但"信息混不进通道",标准卷积重但表达好——GSConv 用GConv(分组卷积)混通道 + DWConv 补空间 + Channel Shuffle 打散,两全其美。 阅读详情

主要记录对周老师的《周志明的软件架构课》的学习笔记,本篇章是对课程不可变基础设施部分的学习,从虚拟化的技术理解容器技术的产生和发展,从部署运维角度理解应用的封装,从网络虚拟化理解容器网络,从扩展的角度理解K8s的存储设计,从解耦的角度理解服务网格。从周老师的课程中可以以一种由浅入深的方式来探寻云原生技术的渊源、发展及使用。

另外对架构部分和分布式部分的学习及总结在之前博客中:
架构设计方法论-思维导图梳理
分布式系统方法论–思维导图梳理

45 | 模块导学:从微服务到云原生

不可变基础设施
云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。
这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使工程师能够轻松地对系统作出频繁和可预测的重大变更。
虚拟化的目标与类型
容器是云计算、微服务等诸多软件业界核心技术的共同基石。容器的首要目标是让软件分发部署的过程,从传统的发布安装包、靠人工部署,转变为直接发布已经部署好的、包含整套运行环境的虚拟化镜像。
三方面的兼容性
- ISA 兼容:目标机器指令集兼容性,比如 ARM 架构的计算机无法直接运行面向 x86 架构编译的程序。
-指令集架构(Instruction Set Architecture,ISA)是计算机体系结构中与程序设计有关的部分,包含了基本数据类型、指令集、寄存器、寻址模式、存储体系、中断、异常处理以及外部 I/O。指令集架构包含一系列的 Opcode 操作码(即通常所说的机器语言),以及由特定处理器执行的基本命令。
- ABI 兼容:目标系统或者依赖库的二进制兼容性,比如 Windows 系统环境中无法直接运行 Linux 的程序,又比如 DirectX 12 的游戏无法运行在 DirectX 9 之上。
- 应用二进制接口(Application Binary Interface,ABI)是应用程序与操作系统之间或其他依赖库之间的低级接口。ABI 涵盖了各种底层细节,如数据类型的宽度大小、对象的布局、接口调用约定等等。ABI 不同于应用程序接口(Application Programming Interface,API),API 定义的是源代码和库之间的接口,因此同样的代码可以在支持这个 API 的任何系统中编译,而 ABI 允许编译好的目标代码在使用兼容 ABI 的系统中无需改动就能直接运行。
- 环境兼容:目标环境的兼容性,比如没有正确设置的配置文件、环境变量、注册中心、数据库地址、文件系统的权限等等,当任何一个环境因素出现错误,都会让你的程序无法正常运行。
五类虚拟化技术
- 指令集虚拟化
- 即通过软件来模拟不同 ISA 架构的处理器工作过程,它会把虚拟机发出的指令转换为符合本机 ISA 的指令,代表为QEMU和Bochs。
- 指令集虚拟化就是仿真,它提供了几乎完全不受局限的兼容性,甚至能做到直接在 Web 浏览器上运行完整操作系统这种令人惊讶的效果。但是,由于每条指令都要由软件来转换和模拟,它也是性能损失最大的虚拟化技术。
- 硬件抽象层虚拟化
- 即以软件或者直接通过硬件来模拟处理器、芯片组、内存、磁盘控制器、显卡等设备的工作过程。
- 操作系统层虚拟化
- 操作系统层虚拟化则不会提供真实的操作系统,而是会采用隔离手段,使得不同进程拥有独立的系统资源和资源配额,这样看起来它好像是独享了整个操作系统一般,但其实系统的内核仍然是被不同进程所共享的。
- 操作系统层虚拟化的另一个名字 就是 容器化 ,容器化牺牲了一定的隔离性与兼容性,换来的是比前两种虚拟化更高的启动速度、运行性能和更低的执行负担
- 运行库虚拟化
- 与操作系统虚拟化采用隔离手段来模拟系统不同,运行库虚拟化选择使用软件翻译的方法来模拟系统,它是以一个独立进程来代替操作系统内核,来提供目标软件运行所需的全部能力。
- 语言层虚拟化
由虚拟机将高级语言生成的中间代码,转换为目标机器可以直接执行的指令,代表为Java的JVM和.NET 的CLR 。

46 | 容器的崛起(上):文件、访问、资源的隔离

隔离文件:chroot
chroot \ jailbreak \ pivot_root
隔离访问:namespaces
Linux的名称空间是一种有内核直接提供的全局资源封装,它是内核针对进程设计的访问隔离机制。
Mount \ UTS \ IPC \ PID \ Network | User | Cgroup | Time
隔离资源:cgroups
如果要让一台物理计算机中的各个进程看起来像独享整台虚拟计算机的话,不仅要隔离各自进程的访问操作,还必须能独立控制分配给各个进程的资源使用配额。不然的话,一个进程发生了内存溢出或者占满了处理器,其他进程就莫名其妙地被牵连挂起,这样肯定算不上是完美的隔离。
直接由内核提供的功能,用于隔离或者说分配并限制某个进程组能够使用的资源配额
biko | cpu | cpuaact | cpuset | devices | freezer | memory | net_cls | net_prio | hugetlb | perf_event

47 | 容器的崛起(下):系统、应用、集群的封装

封装系统: LXC
一种封装系统的轻量级虚拟机
封装应用:Docker
源于LXC 、AUFS , 简单模拟Bocker ;
跨机器的绿色部署
以应用为中心的封装
自动构建
多版本支持
组件重用
共享
工具生态

子系统:
Docker Client \ Docker Daemon \ Docker Registry \ Docker Container | 
Graph \Driver \ libcontainer 
OCI : 运行时标准runtime-spec 容器镜像标准image-spec 镜像分发标准distribution-spec
	libcontainer -> runC 项目  、 Docker Daemon -> containerd 项目

封装集群:Kubernetes
如果说以 Docker 为代表的容器引擎,是把软件的发布流程从分发二进制安装包,转变为了直接分发虚拟化后的整个运行环境,让应用得以实现跨机器的绿色部署;
那以 Kubernetes 为代表的容器编排框架,就是把大型软件系统运行所依赖的集群环境也进行了虚拟化,让集群得以实现跨数据中心的绿色部署,并能够根据实际情况自动扩缩。
k8s与容器引擎的调用关系
Kubernetes Master → kubelet → DockerManager → Docker Engine → containerd → runC
1.5变化后:
Kubernetes Master → kubelet → KubeGenericRuntimeManager → DockerShim → Docker Engine → containerd → runC
1.10 版本后
Kubernetes Master → kubelet → KubeGenericRuntimeManager → containerd → runC

48 | 以容器构建系统(上):隔离与协作

一个容器封装一个单进程应用 
分布式系统里应用需要多个进程共同协作,通过集群的形式对外提供服务,那么以虚拟化方法实现这个目标的过程,就称为容器编排

构建容器编排系统时都会遇到什么问题?
- 场景一 : 假设你现在有两个应用,其中一个是Nginx ,另一个是为该Nginx 收集日志的Filebeat , 你希望将他们封装为容器镜像,以便日后分发。
- 场景二: 假设你现在有两个Docker 镜像,其中一个封装了HTTP服务,为便于称呼,叫它NGINX容器,另一个封装了日志收集服务,叫它Filebeat容器。现在你要求Filebeat容器能收集Nginx容器产生的日志信息。 confd 共享IPC名称空间 --net 共享网络名称空间
- 如果容器与进程在概念上对应起来,那容器编排的第一个扩展点,就是要找到容器领域中与进程组想对应的概念,这是实现容器从隔离到协作的第一步。在K8s 的设计里,这个对应物叫做Pod 。
Pod的含义与指责
扮演容器组的角色,满足容器共享名称空间的需求,是Pod两大最基本的职责之一。
UTS名称空间 主机名和域名 , 网络名称空间 、 IPC名称空间 、 时间名称空间
- 场景三:假设你现在有Filebeat \ Nginx 两个Docker镜像 ,在一个具有多个节点的集群环境下,要求每次调度都必须让Filebeat和Nginx 容器运行在同一个节点上。
实现原子性调度
Pod是隔离与调度的基本单位
计算资源:
容器 Container
生产任务 Pod
节点 Node
集群 Cluster
集群联邦 Federation

49 | 以容器构建系统(下):韧性与弹性

控制器设计模式
编排系统如何快速调整出错的服务?
- 场景四: 假设有个由数十个Node、数百个Pod、近千个Container所组成的分布式系统,作为管理员,你想要避免该系统因为外部流量压力、代码缺陷、软件更新、硬件升级、资源分配等各种原因而出现中断的状况,那么你希望编排系统能为你提供何种支持?
控制回路:
声明式API
额外知识:Kubernates 的资源对象与控制器目前,Kubernetes 已内置支持相当多的资源对象,并且还可以使用CRD(Custom Resource Definition)来自定义扩充,你可以使用 kubectl api-resources 来查看它们。下面我根据用途分类,给你列举了一些常见的资源:
- 用于描述如何创建、销毁、更新、扩缩 Pod,包括:Autoscaling(HPA)、CronJob、DaemonSet、Deployment、Job、Pod、ReplicaSet、StatefulSet
- 用于配置信息的设置与更新,包括:ConfigMap、Secret
- 用于持久性地存储文件或者 Pod 之间的文件共享,包括:Volume、LocalVolume、PersistentVolume、PersistentVolumeClaim、StorageClass
- 用于维护网络通信和服务访问的安全,包括:SecurityContext、ServiceAccount、Endpoint、NetworkPolicy
- 用于定义服务与访问,包括:Ingress、Service、EndpointSlice
- 用于划分虚拟集群、节点和资源配额,包括:Namespace、Node、ResourceQuota
这些资源在控制器管理框架中,一般都会有相应的控制器来管理,这里我也列举了一些常见的控制器,按照它们的启动情况进行了分类,如下:
- 必须启用的控制器:EndpointController、ReplicationController、PodGCController、ResourceQuotaController、NamespaceController、ServiceAccountController、GarbageCollectorController、DaemonSetController、JobController、DeploymentController、ReplicaSetController、HPAController、DisruptionController、StatefulSetController、CronJobController、CSRSigningController、CSRApprovingController、TTLController
- 默认启用的可选控制器,可通过选项禁止:TokenController、NodeController、ServiceController、RouteController、PVBinderController、AttachDetachController
- 默认禁止的可选控制器,可通过选项启用:BootstrapSignerController、TokenCleanerController
实际状态有可能发生变化的资源对象,通常会由对应的控制器进行追踪,每个控制器至少会追踪一种类型的资源。 统一的控制器管理框架 kube-controller-manager、 统一的指标监视器 kube-apiserver
Kubernetes 控制器模式的工作原理
- 场景五 : 通过服务编排,我们让任何分布式系统自动实现以下三种通用的能力,
Pod出现故障时,能够自动恢复,不中断服务;
Pod更新程序时,能够滚动更新,不中断服务;
Pod遇到压力时,能够水平扩展,不中断服务。

50 | 应用为中心的封装(上):Kustomize与Helm

Kustomize :
用配置文件来配置文件 基于YAML的模版
根据环境来生成不同的部署配置
Helm与Chart
如果说Kubernetes 是云原生操作系统的话,那Helm就要成为这个操作系统上面的应用商店与包管理工具。
Chart格式 、 Repository 应用仓库 、 多版本-Release

WordPress
 ├── templates
 │     ├── NOTES.txt
 │     ├── deployment.yaml
 │     ├── externaldb-secrets.yaml
 │     └── 版面原因省略其他资源文件
 │     └── ingress.yaml
 └── Chart.yaml
 └── requirements.yaml
 └── values.yaml
 
Chart.yaml 给出了应用自身的详细信息(名称、版本、许可证、自述、说明、图标,等等),requirements.yaml 给出了应用的依赖关系,依赖项指向的是另一个应用的坐标(名称、版本、Repository 地址),values.yaml 给出了所有可配置项目的预定义值。
由于 Chart 封装了足够丰富的信息,所以 Helm 除了支持命令行操作外,也能很容易地根据这些信息自动生成图形化的应用安装、参数设置界面。
Repository 仓库。它主要是用于实现 Chart 的搜索与下载服务,Helm 社区维护了公开的 Stable 和 Incubator 的中央仓库(界面如下图所示),也支持其他人或组织搭建私有仓库和公共仓库,并能够通过 Hub 服务,把不同个人或组织搭建的公共仓库聚合起来,形成更大型的分布式应用仓库,这也有利于 Chart 的查找与共享。

整体来说,Helm 提供了应用全生命周期、版本、依赖项的管理能力,同时,Helm 还支持额外的扩展插件,能够加入 CI/CD 或者其他方面的辅助功能
Helm 对于有状态服务,无法很好的管理有状态的额依赖关系

51 | 应用为中心的封装(下):Operator与OAM

Operator
与 Kustomize 和 Helm 不同的是,Operator不应当被称作是一种工具或者系统,它应该算是一种封装、部署和管理 Kubernetes 应用的方法,尤其是针对最复杂的有状态应用去封装运维能力的解决方案 ,
Operator 是通过 Kubernetes 1.7 开始支持的自定义资源(Custom Resource Definitions,CRD,此前曾经以 TPR,即 Third Party Resource 的形式提供过类似的能力),把应用封装为另一种更高层次的资源,再把 Kubernetes 的控制器模式从面向内置资源,扩展到了面向所有自定义资源,以此来完成对复杂应用的管理。
有状态应用会对某些外部资源有绑定性的直接依赖
StatefulSet 管理Pod具备的额外特性:
Pod会按顺序创建和按顺序销毁
Pod具有稳定的网络名称
Pod具有稳定的持久存储
Operator 则是要求开发者自己实现一个专门针对该自定义资源的控制器,在控制器中维护自定义资源的期望状态。
OAM
Components
Workload : 六种类型
Traits : 运维特征
Application Scopes : 应用边界
Application Configuration : 应用配置

解耦开发运维
- 开发人员负责管理 Component;
- 运维人员将 Component 组合并绑定 Trait,把它变成 Application Configuration;
- 平台人员或基础设施提供方负责提供 OAM 的解释能力,将这些自定义资源映射到实际的基础设施。

52 | Linux网络虚拟化(上):信息是如何通过网络传输被另一个程序接收到的?

Linux系统下的网络通信模型
Socket 、 TCP/UDP 、 IP 、 Device 、 Driver
层层封包 加入协议头 , 层层解包 ,提取协议体
干预网络通信的Netfilter 框架
PREROUTING 、INPUT 、FORWORD 、OUTPUT、POSTROUTING
Iptables :
raw mangle nat(source) \ nat(destination) \ filter \ security

53 | Linux网络虚拟化(下):Docker所提供的容器通讯方案有哪些?

虚拟化网络设备
网卡 tun/tap 、veth
交换机 Linux Bridge
网络 VxLan
副本网卡 MACVLAN
容器间通信
桥接模式
主机模式
空置模式
内容需要再细读

54 | 容器网络与生态:与CNM竞争过后的CNI下的网络插件生态

CNM 与CNI
管理网络创建与删除
管理IP地址分配与回收
要符合IPv4的网段规则
必须考虑到回收的问题
还必须要关注时效性
CNM到CNI
在 CNM 和 CNI 提出以前的早期版本里,Kubernetes 会使用 Docker 的空置网络模式(–network=none)来创建 Pause 容器,然后通过内部的 kubenet 来创建网络设施,再让 Pod 中的其他容器加入到 Pause 容器的名称空间中,共享这些网络设施。
kubenet是 kubelet 内置的一个非常简单的网络,它是采用网桥来解决 Pod 间通信。
网络插件生态
overlay 模式 : Flannel-UDP Flannel-VXLAN
路由模式
underlay 模式 MACVLAN

55 | 谈谈Kubernetes的存储设计理念

Kubernetes的存储设计考量
Mount 和 Volume
Static Provisioning
Dynamic Provisioning

56 | Kubernetes存储扩展架构:一个真实的存储系统如何接入或移除新存储设备?

Kubernetes存储架构
决定应准备何种存储 Provision
将准备好的存储附加到系统中 Attach
将附加好的存储挂载到系统中 Mount
PV控制器 (PersistentVolume Controller )
AD控制器 ( Attach \ Detach Controller )
Volume 管理器 ( Volume Manager )
FlexVolume 与 CSI

57 | Kubernetes存储生态系统:几种有代表性的CSI存储插件的实现

块存储 readwriteonce
文件存储 posix
对象存储 分布式 大数据量 kv
选择合适的存储

58 | Kubernetes的资源模型与调度器设计

资源模型
服务质量与优先级
服务质量等级
优先级
驱逐机制
默认调度器

59 | 透明通讯的涅槃(上):通讯的成本

通信的成本
1、将通信的非功能性需求视作业务需求的一部分,由程序员来保障通信的可靠性
2、将代码中的通信功能抽离重构成公共组件库,通信的可靠性由专业的平台程序员来保障
3、将负责通信的公共组件库分离到进程之外,程序间通过网络代理来交互,通信的可靠性由专门的网络代理提供商来保障
4、将网络代理以边车的形式注入到应用容器,自动劫持应用的网络流量,让通信的可靠性由专门的通信基础设施来保障。
对流量的劫持是强制的, 对应用是透明的
5、将边车代理统一管控起来实现安全、可控、可观测的通信,将数据平面与控制平面分离开来,实现通用、透明的通信,这项工作就由专门的服务网格框架来保障。

60 | 透明通讯的涅槃(下):控制平面与数据平面

数据平面
代理注入
流量劫持
可靠通信
控制平面

61 | 服务网格与生态:聊聊服务网格的两项标准规范

服务网络接口 ( Service Mesh Interface, SMI )
流量规范
流量拆分
流量度量
流量访问控制
通用数据平面 API ( Universal Data Plane API , UDPA )
服务网格生态

参考资料:

1、《周志明的软件架构课》

特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置 通过Solidworks导出机械臂的URDF模型文件,建立机械臂的各个关节坐标系的规则以及注意点,详细步骤 阅读详情

相关推荐

SDU CS 期末考回忆版合集

删除原有分散的版本,合订起来画个。包括:机器学习、算法、图形学、操作系统、编译原理、软件工程、大数据分析管理、计算机体系结构等。

https://github.com/ZhaoyungZhang 6648

周志明论架构之道:从SOA时代到微服务时代

SOA 架构(Service-Oriented Architecture)面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式。为了对大型的单体系统进行拆分,让每一个子...

u013527895的博客 1838

OpenPose 论文理解

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation paper: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields link: OpenPose paper...

JustForYou的博客 2万+

周志明架构课--02.单体系统时代

应用最广泛的架构风格 错误的认知: 架构无好坏,只能是根据场景来选择。 典型的思维误区: 单体架构是落后的系统架构风格,最终会被微服务所替代。 观念的转变: 不追求尽量不出错,而是应当正视出错是必然的,其实,这才是导致微服务开始逐步代替单体架构根本的驱动力。 1.大型单体系统 也被称为巨石系统,把单体看作成是一种架构,确切的说是在微服务流行之后,才被追加的。 对于一个小型的系统来说,使用单体架构,易于开发,易于测试,易于部署,而且是进程内方法调用。 *** 所以要想讨论单体系统的缺陷,必须要有一个前

Exception的专栏 1137

台达伺服B3驱动器参数的设定和CN1的接法

3. B2的电子齿轮比是直接设定P1-44(分子)和P1-45(分母)就就可以的,但是B3的有个隐藏的细节,就是P1-44的默认值77216不用去更改,这是官方客服说的,需要改的是P1-45这个参数,比如说,我使用的丝杆螺距是5mm的,那么就是以5000脉冲走完5mm为一圈,则就把P1-45设定为5000即可;我的是三菱FX3S系列的PLC,是NPN型的,输出点是24V-作为信号的,所以接41、37,具体可参考B3的。,跟着客服的讲解操作才解决的,以下就是解决方法,希望能够帮到需要的各位。

qq_38681017的博客 1万+

SQL Server 内存占用高分析及解决办法(超详细)

如果想让 Sql Server 主动释放 占用并空闲的内存空间,可以设置Sql Server占用内存的上限,就会让Sql server在。如执行存储过程,自定函数时,SQL Server 需要先二进制编译再运行,编译后的结果也会缓存起来,再次调用时就无需再次编译。才会释放一点占用的内存,所以很多时候,我们会发现运行SQL Server的系统内存往往居高不下这些内存一般都。缓存,以便于再次请求此页的数据的时候,直接从内存返回,就无需读取磁盘了,大大提高了速度。最后文章有啥不对,欢迎大佬在评论区指点!

2301_79080944的博客 3952

周志明架构课--07.远程服务调用

架构师视角 说实话,可能是因为我的理解能力有点小问题,这篇文章读了好几遍才大概明白了点其中的道道。为了防止大家跟我一样学习的时候会晕菜。所以我决定先把作者的行文思路给大家画出来。 介绍了下架构师的职责 RPC在众眼里是什么样的呢?为什么一直这么火呢 借用本地调用过程的例子来引入,同时做出假设调用者和被调用者不在同一个进程之内 解决上面步骤2问题的方法,有六种。尤其是最后一种本地套接字接口,它的设计理念简直直RPC最初的目的不谋而合 但在那个时候对于透明的分布式系统而言,别说存在着大量的问题需要解决的,就

Exception的专栏 619

图像去雨:超详细手把手写 pytorch 实现代码(带注释)

占个坑,过几天来写

书山有路,学海无涯! 1万+

周志明:终于薅住了这位 “社恐”作者的小辫子

嘉宾:周志明、杨福川 采访、撰文:Satoh_AI 这次采访起源来自于我和豆瓣的一位读者有同样的好奇心,为什么网上搜不到周志明老师的更多信息?为什么”80后玩家”可以把本本书都维持在9.0分左右?他的“社恐”到底有多严重? 所以利用工作之便,有幸采访到2位大佬,《深入理解Java虚拟机》系列作者周志明与资深出版人杨福川,真是萌新的一大福利,我与豆瓣、知乎的读者“吃瓜群众”同在一片瓜田。 全文以三方文字会谈的形式展开,希望大家吃瓜尽兴。 官方资料介绍: 周志明 资深Java技术..

优快云 官方博客 1万+

用Python+OpenCV搞定线激光相机标定:从棋盘格到3D点云的保姆级实战

本文详细介绍了使用Python和OpenCV进行线激光相机标定的全流程实战,从硬件准备到3D点云重建。涵盖相机内参标定、激光平面方程拟合、三维重建等关键技术,提供完整的代码实现和工程优化建议,帮助开发者实现毫米级精度的工业检测和三维测量系统。

weixin_29227425的博客 282

Vue2+OpenLayers动态绘制两个经纬度并计算距离(提供Gitee源码)

动态绘制两个经纬度并计算它们之间的距离。

黄团团的个人博客 365

【第64期】豆瓣9.8分,周志明的《凤凰架构》

导读:周志明老师的《深入理解Java虚拟机》想必大家都不陌生,这本书凭借着生动易懂的文风、系统实用的知识点、成为原创计算机图书经典中的经典。周老师凭借一己之力拉高了 Java 开发者内功水...

华章IT官方博客 1491

瑞芯微RK3588平台YOLOv8Pose模型RKNN部署与C++优化实战:从模型转换到高效推理的全流程指南-附源码

错误码 | 原因 | 解决方案 || -1001 | ONNX算子不支持 | 升级RKNN SDK至最新版 || -2003 | 量化校准数据不足 | 增加校准图片至500张 || -3005 | 输入尺寸不匹配 | 固定模型输入尺寸为640x640 || 资源消耗 | CPU 35% | NPU 90% |

m0_64661770的博客 989

对架构演变的思考

架构演变的过程中,合与拆在不断的演变,服务在不断的“生与死”,这就和城市的发展一样,

weixin_42246822的博客 2443

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深入理解Java虚拟机(第2版)--JVM高级特性与最佳实践

ISBN: 9787111421900 作者:周志明 页数:433页 阅读时间:2020-06-14 推荐指数:★★★★★ Java程序员必读书目之一, 不用介绍在Java程序员心中的地位就知道了吧。 虽然囫囵吞枣式地读完了, 但是还是很多不懂的地方。 稍微是有点印象了。 里面讲了很多调试的方法以及实战, 尽可能详细而又通俗的讲解理论知识, 可是如我脑得还是少之又少。 人生啊,说难吧,到底有多难呢? 做个普普通通的平凡人不就好咯, 为啥拼这个拼那个, 努力的人生是一个样, 不努力的人生又是一个样, 你.

Jack魏 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

作为程序员的你,一年看几本技术相关的书

阅读本文大概需要 3.9 分钟。 这几天想起之前的一次面试,对方问我一年看几本书。 我一年看的书大概在3到10本之间,不过绝大部分都跟计算机技术无关(小说偏多)。很不好意思地回答说:“跟技术有关的,很少”。 之所以不怎么看这方面的专业书,有两个主要的原因:一是因为当时还没有这个学习意识,...

chouliuji7065的博客 1341

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

2019 年终总结和一个三十岁程序员的感悟

前言 年中的时候,在博客上写过一篇半年总结,地址在这里: 我的 2019 年中总结 ,因为前几天一直在忙家里的事情,所以也没有抽空出来在 2019 年前把总结写完,算是一点小小的遗憾吧,就在这里把总结补上,除了给自己一个交代之外,也想要 check 下自己 list 的完成进度,当初立的 flag 是不是都实现啦,是不是又偷懒了这样的。另外 2019 年对我而言也算蛮有意义的一年,因为今年自己正...

肖斌 的专栏 1777

Java的激荡发展史。一部激情昂扬的血泪史。技术的发展离不开商业的追逐,商业利益的追逐诞生更多的技术

本文介绍了Java的激荡发展史,主要摘自于周志明先生的《深入理解Java虚拟机》第三版。Java的发展史是一部激情昂扬的血泪史。技术的发展离不开商业的追逐,商业利益的追逐诞生更多的技术

ZhaoSimonone的博客 1531

秋招总结|五非选手转Java 0 offer 结束秋招之旅

作者:shgang97 链接:秋招总结|五非选手转Java 0 offer 结束秋招之旅_技术交流_牛客网 来源:牛客网 秋招总结|五非选手转Java 0 offer 结束秋招之旅 背景:五非(非985,非211,非一流院校,非一流学科,非科班)硕,接触Java一年半以上半,认认真真也学了有一段时间(挺久的),没做过完整的练手项目,主要是学习写的一些demo。掌握的主要技术:Java基础、JVM、并发编程和线程池;开发框架(Spring、Mybatis、SpringBoot);数据库(MySQL、R.

a1472750149的博客 554

周志明是谁?

周志明-个人简介 远光软件 高层经理珠海 Java技术、机器学习和企业级开发技术专家,现任远光软件研究院院长,机器学习方向博士, 开源技术的积极倡导者和推动者,对计算机科学和相关的多个领域都有深刻的见解,尤其是人工智能、Java技术和敏捷开发等领域。曾受邀在InfoQ和IBMDeveloperWorks等网站撰写技术专栏。 著有畅销书多本。著有《智慧的疆界》、《深入理解Java虚拟机》、《深入理解OSGi》,翻译了《Java虚拟机规范》等著作。其中《深入理解Java虚拟机》第1版出版于2011年,.

qq_25275061的博客 1万+

深入理解java虚拟机 (周志明)JVM个人总结

Jvm java虚拟机规范 周志明 JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java...

有趣的难受 7397
上一篇: 读《后端技术面试38讲》--学习笔记和读后感 (三)
下一篇: 读《从0开始学大数据》-- 学习笔记和感想随笔(一)
 汪超
博客等级 码龄17年 65粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值