首页 文章 精选 留言 我的

精选列表

搜索[智能解析],共10000篇文章
优秀的个人博客,低调大师

深入解析阿里 PouchContainer 如何实现容器原地升级

作者:仔仁 PouchContainer 是阿里巴巴集团开源的高效、轻量级企业级富容器引擎技术,拥有隔离性强、可移植性高、资源占用少等特性。可以帮助企业快速实现存量业务容器化,同时提高超大规模下数据中心的物理资源利用率。已助力阿里巴巴集团实现在线业务 100% 容器化,双 11 容器规模达到百万级。 背景 阿里巴巴集团内部,容器使用方式有很大一部分是富容器模式,像这种基于传统虚拟机运维模式下的富容器,其中也有一定数量容器仍然是有状态的。有状态服务的更新和升级是企业内部频率很高的一个日常操作,对于以镜像为交付的容器技术来说,服务的更新和升级,对应的容器操作实际上是两步:旧镜像容器的删除,以及新镜像容器的创建。而有状态服务的升级,则要求保证新容器必须继承旧容器所有的资源,比如网络、存储等信息。下面给出两个实际的业务案例来直观阐述富容器业务发

优秀的个人博客,低调大师

C# 内存分配&&垃圾回收解析

在学习C#的过程中,大家一定会听说过一些CLR、JIT、LR、什么堆栈分配、内存释放的东西,谈到大家对这些元素的理解,多数都是这些是操作系统里面的东西,值类型、引用类型会和堆栈相关,但是在问到这些提到的名称具体是做什么的,或者扮演什么样的角色的时候,大家好像也能讲出点什么,但是也讲得模模糊糊,虽然这些都是一些理论知识,而且在开发的过程中可能也用不到,但还是能尽量多了解一下比较好,今天,笔者就谈一谈自己对这些元素的理解 有说的不准确或者不正确的地方欢迎留言指正 在日常生活中,如果要和其他语种的人交流,而且自己还不懂得情况下我们会怎么办?首先会想到找翻译软件,首先把自己说的话输入到翻译软件中,软件会根据输入文字的语法转到另一种歪果仁说的语言,其中主要步骤会经过检测-----校验-----输出。 其实在计算机的世界中,代码编译成0101这种形式的机器码也是大概如此,首先我们会在编译器中(例如:visual studio 2017)根据逻辑的需求编写C#代码,这个可以理解为我们说的母语,然后经过计算机的翻译编译成机器能听懂的语言(机器码),而下图中显示的 【metadata】【IL】【CLR】【JIT】就是在上面举例中提到翻译,翻译过程中【检测】----【校验】----【输出】需要这些元素的参与 缩写的全称: CTS是通用类型系统(Common Type System) CLR是公共语言运行时(Common language runtime) CLS是公共语言定义(Common Language Specification) 参考链接:https://blog.csdn.net/huang_xw/article/details/8578162 参考链接:https://docs.microsoft.com/zh-cn/dotnet/standard/common-type-system 代码编译后会形成DLL或者EXE文件,在这些文件中含有【metadata】与【IL】两种元素,下面我们逐一说明这两个元素的用途 metadata 通俗的讲:metadata就是一个档案库,一份清单,一个说明里面含有什么东西的列表。他里面详细的说明这个DLL或者EXE文件中都有什么类、函数、属性、字段、版本号等等,而且经常用到的特性(Attribute)的信息也在里面,不熟悉【特性】的小伙伴请看Unity C#基础之 特性,一个灵活的小工具。(也就是举例中需要翻译的是什么语言,多少个字,含有什么标点符号,在什么位置等等这些信息) IL(中间语言) IL又称:中间语言,他在翻译过程中是起到牵线搭桥的作用,类似于我能听懂(编译器),歪果仁也能听懂(计算机)的语言。如果想查看IL可以使用ILSpy反编译工具查看 上面提到的【metadata】【IL】仅仅是翻译前的准备工作,下面才是开始正式的【检测】----【校验】----【输出】 首先说下CLR 说道CLR他就厉害了,正是因为有了CLR这种运行环境,才能让不同语言编译的IL得以在不同的操作系统中运行,例如32位、64位的操作系统,而且不同的操作系统里面额CLR也是不一样的。 然后是JIT 基于上面提到的CLR环境,JIT根据不同的CLR将相同的IL依据清单(metadata)和dll或exe,开始正式的【检测】----【校验】----【输出】生成0101这种的机器码,JIT编译的时候会检测是否编译过机器码。如果编译过拿过来复用 上面说到的整体流程可以看一下托管执行过程 接下来说一下.NET 中的内存管理和垃圾回收 因为下面所提到的都是总结性结论,参考地址MSDN官方文档 .NET 中的内存管理和垃圾回收 什么是“托管代码”? 自动内存管理 线程栈:栈-stack 先进后出的数据结构 随着线程而分配的 默认执行方法分配1MB内存 对象堆:内存,进程中独立画出来的一块儿内存,有一些对象长期使用不释放的,例如static,方便对象重用(多个对象指向一个内存地址) 我们结合代码来说一下堆栈的分配 public struct ValuePoint// : System.ValueType 结构不能有父类,因为隐式继承了ValueType(通过反编译工具可查看) { public int x; public ValuePoint(int x) { this.x = x; } } public void Test() { //内存分配:线程栈 {//值类型分配在线程栈,变量和值都是在线程栈 ValuePoint valuePoint;//先声明变量,没有初始化 但是我可以正常赋值 跟类不同 valuePoint.x = 123; ValuePoint point = new ValuePoint(); Console.WriteLine(valuePoint.x); } } 声明的valuePoint和他对应的x都是在栈上面的 public class ReferencePoint { public int x; public ReferencePoint(int x) { this.x = x; } } public void Test() { ReferencePoint referencePoint = new ReferencePoint(123); } 引用类型分布在堆上面 变量是在栈上的(保存的地址),值是在堆上面 new的时候去堆开辟内存,分配一个地址 调用构造函数(因为在构造函数里可以使用this),才执行构造函数把引用传给变量 /// <summary> /// class 引用类型 /// </summary> public class ReferenceTypeClass { private int _valueTypeField;//堆:因为对象都在堆里,对象里面的属性也在堆里 public ReferenceTypeClass() { _valueTypeField = 0; } public void Method() { int valueTypeLocalVariable = 0;//栈:全新的局部变量,线程栈来调用方法,然后分配内存 } } public void Test() { ReferenceTypeClass referenceTypeClassInstance = new ReferenceTypeClass(); referenceTypeClassInstance.Method(); } _valueTypeField是在堆上面,因为对象都在堆里,对象里面的属性也在堆里 valueTypeLocalVariable是在栈上面,因为全新的局部变量,线程栈来调用方法,然后分配内存 /// <summary> /// 值类型 /// </summary> public struct ValueTypeStruct { private object _referenceTypeField;// 这个对象的变量在栈上,值在堆上 public ValueTypeStruct(int x) { _referenceTypeField = new object(); } public void Method() { object referenceTypeLocalVariable = new object();//这个对象的变量在栈上,值在堆上 } } public void Test() { ValueTypeStruct valueTypeStructInstance = new ValueTypeStruct(); valueTypeStructInstance.Method(); } _referenceTypeField这个对象的变量在栈上(保存地址),值在堆上 referenceTypeLocalVariable这个对象的变量在栈上(保存地址),值在堆上 综上所述: 方法的局部变量:根据变量自身决定,跟所在的环境没关系 对象是引用类型,其属性/字段,都是在堆里面 对象是值类型,其属性/字段,值类型就在栈里 引用类型就在堆里 引用类型任何时候都在堆里;值类型都在栈里, 除非值类型所在对象是在堆里(ReferencePoint这个例子就是) 装箱和拆箱(C# 编程指南) { int i = 0; object oValue = i; i = (int)oValue; } 装箱拆箱(仅仅是说内存的拷贝动作):内存copy 也会浪费性能 通常都是因为object 装箱拆箱只能发生在父子类里面, 否则无法转换 string字符串内存分配 string student = "菜鸟海澜";//开辟一块儿内存 放入“菜鸟海澜“ 返还一个引用(student变量) string student2 = student;//把student的引用copy一份儿给student2 Console.WriteLine(student);//打印结果 菜鸟海澜 Console.WriteLine(student2);//打印结果 菜鸟海澜 student2 = "菜鸟"; Console.WriteLine(student);//打印结果 :菜鸟海澜 Console.WriteLine(student2);//打印结果:菜鸟 改了student2的值 但是不是修改内存;因为string字符串的内存是不可变的 赋值其实是new string(APP),重新开辟内存,返回引用 不可变是因为享元,可能有多个变量指向同一个字符串,字符串变化了,多个变量都会受到影响。(例如多个类中的不同字符串变量都声明 "菜鸟海澜",本质上都是指向一个地址) 还因为堆里面的内存是连续分配的,如果变长度,会导致大量数据的移动 string student = "菜鸟海澜"; string student2 = "菜鸟";//共享 student2 = "菜鸟海澜"; Console.WriteLine(object.ReferenceEquals(student, student2));//打印结果为 True 就是同一个 享元模式 CLR内存分配字符串的时候,会查找相同值,有就重用了 使用享元的主要原因: 因为在堆中每个对象的内存都是紧密连接的,使用享元且不可改变,这样可以提高内存的使用率。 避免导致大量数据的移动,降低内存的重新分配、摆放(有不同的线程栈,但共用一个堆)。 垃圾回收 参考自 垃圾回收 与 清理非托管资源 网上一位开发者的文章:https://kb.cnblogs.com/page/106720/ 首先简述一下线程栈和托管堆的概念 值类型出现在线程栈:每次调用都有线程栈,,用完自己就结束,变量-值类型 都会释放的(不用我们维护) 引用类型出现在堆里:全局就一个堆,空间有限,所以才需要垃圾回收 操作系统里面,内存是链式分配的,可能有碎片的 CLR的堆:连续分配(数组),空间有限,节约空间 大对象策略:如果该对象占用内存大于85000字节,属于大对象,单独管理,用的是链表(碎片),避免频繁的内存移动造成性能消耗 下面要说的垃圾回收主要是以堆中的操作为主要内容 GC(Garbage Collector 的缩写) 1问:什么是垃圾? 垃圾是完全访问不到的东西了。例如临时变量,或者已经赋值为null的引用类型的变量 2问:什么时候会发生GC? gc发生在new的时候 new一个对象时,会开辟内存,看看空间够不够,不够的话就要GC了 gc程序退出的时候也会gc 手动GC。例如定时程序,很久执行一次,而且使用的时长很短,这时候就可以手动GC了 3问:怎么回收? new的时候发现内存不够,然后就去遍历所有堆的对象,标记有引用的对象,然后启动一个线程来清理内存 清除没有标记的对象,挪动其他剩余对象,然后整齐摆放,所以这个时候全部线程停止(开多线程时这个时候是停止的),不允许操作内存 内存不够的是指一级对象的内存,有个临界值,也不是全部的堆的大小 但是类中含有 析构函数【~类名称()】 ,内存的释放就需要单独的处理,把这些对象放入一个队列单独处理,具体哪一时刻调用析构函数不确定 注意:静态的对象是不会被回收的,且持有的引用也是不会被回收的 关于垃圾回收第几代的问题官方文档是这么说明的 在下面的例子中,声明一个静态变量staticStudent ,调用Test方法后主动调用GC,最终 变量【student】【@class】会被回收,但他们对应在堆中的内容不会被回收,因为有staticStudent 持有,变量 【i】会在弹栈之后直接被回收,变量【gCTest】以及它对应在堆中的内容都会被回收 private static Student staticStudent = new Student()//静态的不可能被回收 静态持有的引用也不会被回收 { Id = 123, Name = "菜鸟海澜" }; public void Test() { Student student = staticStudent; Class @class = new Class() { classId = 1, classdata = "数据" }; student.tempdata = @class; int i = 0;//都会被GC GCTest gCTest = new GCTest();//都会被GC } 在下面的示例中,很多开发者会把一个非静态变量设置成null,其实编译器会无视这句话,不是改成null这个对象没有了,其实内存还占用着,把对象赋值成null 意义不大,垃圾回收主要的原因是因为访问不到。但是静态可以把变量设置成null,促进垃圾回收,这样可以让变量不再被引用 Student student = new Student() { Id = 1, Name = "su9257", tempdata = new Class() { classId = 1, classdata = "数据1" } }; student = null; GC.Collect(); 非托管资源的释放 关于释放非托管资源必须要谈到的两个东西:【析构函数】和【Disposable】 析构函数 析构函数 主要是用来释放非托管资源(函数中调用具体释放资源的API或方法),等着GC的时候去把非托管资源释放掉 系统自动执行 GC回收的时候,CLR一定调用的,但是可能有延迟,具体是哪个时刻不确定 Dispose Dispose() 也是释放非托管资源的,主动释放(或手动调用),方法本身是没有意义的,我们需要在方法里面实现对资源的释放 GC不会调用,而是用对象时,使用者主动调用这个方法,去释放非托管资源 不过Dispose有一个自动调用的方法,就是使用【using】关键字,在using语句块运行完时自动调用Dispose方法(前提有的情况下)。且在Dispose方法中调用GC.SuppressFinalize(this);就是告诉CLR这个类我要释放的东西已经释放完了,你就不用调用析构函数了 using (Student student = new Student()) { Console.WriteLine("菜鸟海澜"); } public class People : IDisposable { public string Remark { get; set; } public virtual void Dispose() { Console.WriteLine($"执行{this.GetType().Name}Dispose"); } } public class Student : People, IDisposable { public int Id { get; set; } public string Name { get; set; } public Class tempdata { get; set; } public override void Dispose()//提供主动释放方式 { base.Dispose();//把我引用的其他东西给清理掉 if (this.tempdata != null) { this.tempdata.Dispose(); } //通知垃圾回收机制不再调用终结器(析构器) GC.SuppressFinalize(this); } 本质上是调用try finally try { } finally { //调用的dispose() }

优秀的个人博客,低调大师

Groovy PermGen Full GC 问题解析以及解决

线上环境 使用Groovy脚本为业务提供自定义配置 结果 没几天就fullGC 并且持续很长时间,才降下来, groovy 常见的三种引入方式都会有对应的问题,:核心的问题是Groovy会缓存掉曾经执行的代码片段成为META-class ,如果每次执行的代码都不一样。那么缓存的类会越来越多。 相应的解决办法: <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.4.7</version> </dependency> //清除groovy 里面的缓存, 防止fullGC,也可以定时来做 GroovyClassLoader groovyClassLoader = engine.getClassLoader(); Class[] classes = engine.getClassLoader().getLoadedClasses(); for (Class clazz : classes) { GroovySystem.getMetaClassRegistry().removeMetaClass(clazz); groovyClassLoader.clearCache(); try { Field globalClassValue = ClassInfo.class.getDeclaredField("globalClassValue"); globalClassValue.setAccessible(true); GroovyClassValue classValueBean = (GroovyClassValue) globalClassValue.get(null); classValueBean.remove(clazz); } catch (Throwable e) { } } groovyClassLoader.clearCache(); ClassInfo.clearModifiedExpandos(); /** * Using java beans (e.g. Groovy does it) results in all referenced class infos being cached in ThreadGroupContext. A valid fix * would be to hold BeanInfo objects on soft references, but that should be done in JDK. So let's clear this cache manually for now, * in clients that are known to create bean infos. */ Introspector.flushCaches();

优秀的个人博客,低调大师

解析百度Apollo自动驾驶平台

最近对百度的自动驾驶平台Apollo项目做了一些了解。下面将我所了解到的一些信息分享给大家。 Apollo项目介绍 阿波罗(Apollo)是百度发布的面向汽车行业及自动驾驶领域的合作伙伴提供的软件平台。发布时间是2017年4月19日,旨在向汽车行业及自动驾驶领域的合作伙伴提供一个开放、完整、安全的软件平台,帮助他们结合车辆和硬件系统,快速搭建一套属于自己的完整的自动驾驶系统。而将这个计划命名为“Apollo”计划,就是借用了阿波罗登月计划的含义。 可以在这里感受一下Apollo的实车驾车体验:CES 2018 百度Apollo 2.0无人车美国桑尼维尔试乘。 SAE Level 对于自动驾驶,SAE(Society of Automotive Engineers,美国汽车工程师学会) International于2014年发布了从全手动系统

优秀的个人博客,低调大师

【阿里云 MVP Tech Show】全面解析 IoT 平台

2018年3月在深圳开幕的2018云栖大会·深圳峰会上,阿里巴巴集团资深副总裁、阿里云总裁胡晓明宣布阿里巴巴将全面进军物联网领域,IoT是阿里巴巴集团继电商、金融、物流、云计算之后一条新的主赛道。 而对于无锡来讲鸿山物联网小镇并不陌生,支持物联网创新的飞凤平台已经收获了不小的成果。 飞凤平台是集阿里云多年在物联网领域研发和积累,建设全球领先的按照开放标准、打通物联网云架构基础层、平台层、应用层,包容NB-IOT、LORA等异构网络、主流物联网通讯协议和技术标准的物联网基础平台。 飞凤平台作为物联网基础设施,主要解决物联网技术“统一规则”的问题,如何将成千上万个传感器和上百种传输协议,有机形成一个可结构化复用、同时能打通互联网的云架构,并为物联网产业应用场景实现指数级腾飞提供基础服务。 本期阿里云 MVP tech show邀请到在物联网深

优秀的个人博客,低调大师

深度学习之 TensorFlow(三):TensorFlow 源代码解析

分析一下 TensorFlow 的文件结构。这里的源代码版本是 TensorFlow1.7.0 。 目录结构如下: 其中的核心目录是 tensorflow 目录,最重要的源代码保存在这里,目录结构如下: 1.contrib 目录中保存的是将常用的功能封装成的高级 API,但是这个目录并不是官方支持的,很有可能在高级 API 完善后被官方迁移到核心的 TensorFlow 目录中或去掉。 2.core 目录中保存的都是 C 语言文件,是 TensorFlow 的原始实现。 3.examples 目录中给出了深度学习的一些例子,包括 MNIST、Word2vec、Deepdream、Iris、HDF5等例子。 4.g3doc 目录可以认为是 TensorFlow 的离线手册,用Markdown 维护。 5.python 目录中包含很多函数的实现,包括激活函数、卷积函数、池化函数、损失函数、优化方法等。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册