首页 文章 精选 留言 我的

精选列表

搜索[基础模型],共10000篇文章
优秀的个人博客,低调大师

Android内存基础——内存泄漏

个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 背景介绍 内存泄漏一种情况是一块内存没有引用指向它,却没被回收,这种情况已经由Java虚拟机的GC帮助我们处理好了,见Java内存管理机制;另一种属于逻辑内存泄漏,即一个对象已经不再被使用了,但它仍然被另一个被使用中的对象所持有,导致该对象所占用的内存块不能被回收。 少部分内存泄漏看不出有什么影响,但如果大量发生,将会明显减少可用内存,导致频繁GC,运行缓慢,严重时将容易引发OutOfMemoryError。 Android中常见的内存泄漏 集合引发的泄漏 一些对象缓存到集合中,当它不在被使用时,没有从集合中移除,就造成了泄漏。 Activity中的泄漏 一个Activity中的Context通常会被很多地方引用,如果在Activity执行了onDestory()后这些引用没有被置空,将会导致Activity无法被回收。而Activity中依赖了很对对象,这些对象将都不能被回收,所以一定要十分小心Activity的泄漏。以下几种常见的情况需要注意: 当创建一个对象,该对象需要Context作为参数时。当该对象在Activity执行了onDestory()后仍然可到达,那么它持有的Activity就无法被回收。 使用匿名内部类Handler时。Handler会间接的持有外部Activity的引用,当Activity执行了onDestory()后,若Handler中仍然有消息在MessageQueue中,那么该Handler就不能被释放,也就意味着Activity也不会被释放。解决方法: 需要在onDestory()完成前确保Handler没有执行yan shi延时任务,没有被其他地方引用。同时清理Handler中所有任务,调用removeCallbacksAndMessages(null);,该方法参数为空时会移除所以的CallBack和Message。 另一种方法是自定义一个静态内部Handler,让它持有的Activity为弱引用。 static class MyHandler extends Handler { private final WeakReference<Activity> mActivity; public MyHandler(Activity activity) { mActivity = new WeakReference<Activity>(activity); } @Override public void handleMessage(Message msg) { System.out.println(msg); if (mActivity.get() == null) { return; } mActivity.get().todo(); } } 在异步任务中引用Activity或Context,而没有在Activity销毁前停止线程,就会导致Activity的泄漏。 内部类、匿名内部类会持有外部类的实例,所以在Activity中使用内部类或匿名内部类,并且将该类创建的对象传递给其他对象,若该对象在Activity之外被引用,或是在仍在进行的异步任务中,那么Activity将不能释放。 Bitmap引发的内存泄漏 Bitmap是引用中占用内存的大户,在使用时一定要十分注意。当Bitmap不用时,应该及时调用recycle()释放其申请的内存。 异步任务引发的泄漏 异步任务如果在它应该停止的时候没有停止,那它本身及它所依赖的对象将都不能被正确的释放。比如上面提到的Activity中的异步任务。 比如在Activity中这样来开启一个异步任务: new Thread(()->{ // doSomething with long-time }).start(); 那么,在Activity已经finish()了,但异步任务中的Runnable还被持有,并且由于是属于Activity的匿名内部类,所以会导致Activity的内存不能及时回收。 总结 由于系统内存资源有限,所以我们需要尽量避免内存泄漏,以保证程序能够流畅运行。 由于Activity泄漏将会连带大量的对象一起泄漏,所以在Activity中写代码应该特别注意Handler、内部类及匿名内部类,还有Context不能随便传递。 使用异步任务时一定要明确其作用范围,在应该停止的时候记得停止。 Bitmap占用内存通常较大,所以在使用完后及时释放十分重要。 此外,在传递参数到单例中时,也需要谨慎。 CoorChice的公众号

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

Android内存基础——内存抖动

个人博客CoorChice,https://chenbingx.github.io/ ,最新文章将会首发CoorChice的博客,欢迎探索哦 ! 同时,搜索微信公众号CoorChice,或扫描文章末尾二维码,可以关注我的微信公众号。同期文章也将会优先推送到微信公众号中,以提醒您有新鲜文章出炉。 参考资料 Google官方讲解视屏 背景介绍 在Java内存管理机制中我提到过内存抖动会引起频繁的GC,从而使UI线程被频繁阻塞,导致画面卡顿。这次我们就聊聊内存抖动。 需要避免内存抖动 内存抖动是由于短时间内有大量对象进出Young Generiation区导致的,它伴随着频繁的GC。通常存在内存抖动时,我们可以在Android Studio的Monitors中看到如下场景: 内存抖动图 下面是避免发生 内存抖动的几点建议: 尽量避免在循环体内创建对象,应该把对象创建移到循环体外。 注意自定义View的onDraw()方法会被频繁调用,所以在这里面不应该频繁的创建对象。 当需要大量使用Bitmap的时候,试着把它们缓存在数组中实现复用。 对于能够复用的对象,同理可以使用对象池将它们缓存起来。 总结 总之,因为内存抖动是由于大量对象在短时间内被配置而引起的,所以我们要做的就是谨慎对待那些可能会大量创建对象的情况。 CoorChice的公众号

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

docker基础入门之一

一、概述 1、传统虚拟化技术: 纯软件的虚拟化是通过对于硬件层的模拟从而实现允许运行多个操作系统; 硬件辅助虚拟化需要硬件层面对于虚拟化的支持,类似Intel-VT技术等,具有更高的运行效率; 解决方案: 商业版解决方案:VMware vSphere、 VMware Fusion 开源解决方案:KVM、Xen 2、system-level虚拟化(container虚拟机技术): 不需要模拟硬件层; 共享同一个HOST OS的Kernal user space instance = Container 解决方案: LXC: OpenVZ: Docker: Imctfy:google开源的容器虚拟实现 3、容器虚拟化和传统虚拟化的区别: 传统虚拟化 容器虚拟化 创建速度 很慢 非常快 性能影响 通过对于硬件层的模拟,增加了系统调用链路 的环节,有性能损耗 共享Kernel,几乎没有性能损耗 资源消耗 很大 很小,一台机器可以轻松创建多个 Container 操作系统覆盖 支持Linux、windows、Mac等 仅仅支持Kernal所支持的OS 4、container核心技术cgroups,namespace,chroot: CGroups 限制容器的资源使用; Linux内核提供的限制,记录和隔离进程组所使用的资源,由Google工程师提出,后来整合进kernel; 通过不同的子系统(blkio、cpu、cpuacct等)来实现对不听资源使用的控制和记录; Namespace机制,实现容器间的隔离; pid,容器有自己独立的进程表和1号进程 net,容器有自己独立的network info ipc,在ipc通信时候,需要加入额外信息来标识进程;(进程间通信) mnt,每个容器有自己唯一的目录挂载; utc,每个容器有独立的hostname和domain chroot,隔离根文件系统: 将host os的某个目录隔离成container的根目录; 二、进入Docker的世界: dotCloud是docker公司的前身,专注于PaaS的云计算平台;可能是支持最广泛的PaaS平台; 使用container的概念来解决应用stack部署的难题; 定义:什么是docker 开源的应用容器引擎,方便打包发布应用到容器中; Go语音领域比较大型的应用; docker实现: docker是container技术的实现,最早使用LXC作为container的引擎,最新版本的docker使用libcontainer替换了lxc; 采用aufs文件系统来管理Image和container 基于C/S架构的实现,Server端使用UnixSocket,也可以切换到TcpProtocol; aufs文件系统: 1、advanced multi layer unification filesystem //先进的多层的联合文件系统 2、可以实现把多个不同目录的内容合并在一起; 3、允许read-only和read-write目录并存; docker中的aufs: docker使用aufs来实现分层的文件系统的管理; 只读部分定义为Image,可写部分是container Image类似一个单链表系统,每个Image包含一个指向parent image的指针; 没有parent Image的image是base Image docker hub: 类似于Github服务,用来分发Image 大量标准的Image,例如Tutum/Ubuntu, Tutum/Mysql docker的优点: 构建标准化的应用运行的环境; 良好的RestAPI的实现; Container的实现,更少的资源的使用,创建速度快; docker的局限性: 基于Linux64的,不能在32bit的环境下运行; GuestOS只能是Linux Base 隔离性相对于KVM等虚拟化技术有所欠缺; 采用cgroup的resource control对于cpu的度量很困难; container随用户进程的停止而销毁; docker和LXC的区别: docker更专注于部署,而LXC专注于进程的隔离; docker有更好的api的方便对于docker容器的管理; dockerfile让image的创建变得容易; 通过docker hub方便image的分享; docker的未来: 网络 安全性 容器引擎

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

Go 语言读写 Excel 基础库

Excelize 是 Go 语言编写的一个用来操作 Office Excel 文档类库,基于 ECMA-376 Office OpenXML 标准。可以使用它来读取、写入 XLSX 文件。相比较其他的开源类库,Excelize 支持写入原本带有图片(表)的文档,还支持向 Excel 中插入图片,并且在保存后不会丢失图表样式。 安装 go get github.com/xuri/excelize/v2 创建 XLSX package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f := excelize.NewFile() // Create a new sheet. index := f.NewSheet("Sheet2") // Set value of a cell. f.SetCellValue("Sheet2", "A2", "Hello world.") f.SetCellValue("Sheet1", "B2", 100) // Set active sheet of the workbook. f.SetActiveSheet(index) // Save xlsx file by the given path. err := f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } 读取已有文档 package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { f, err := excelize.OpenFile("./Book1.xlsx") if err != nil { fmt.Println(err) return } // Get value from cell by given worksheet name and axis. cell, err := f.GetCellValue("Sheet1", "B2") if err != nil { fmt.Println(err) return } fmt.Println(cell) // Get all the rows in the Sheet1. rows, err := f.GetRows("Sheet1") for _, row := range rows { for _, colCell := range row { fmt.Print(colCell, "\t") } fmt.Println() } } 向 Excel 中插入图表 package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"} values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8} f := excelize.NewFile() for k, v := range categories { f.SetCellValue("Sheet1", k, v) } for k, v := range values { f.SetCellValue("Sheet1", k, v) } err := f.AddChart("Sheet1", "E1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`) if err != nil { fmt.Println(err) return } // Save xlsx file by the given path. err = f.SaveAs("./Book1.xlsx") if err != nil { fmt.Println(err) } } 向 Excel 中插入图片 package main import ( "fmt" _ "image/gif" _ "image/jpeg" _ "image/png" "github.com/xuri/excelize/v2" ) func main() { f, err := excelize.OpenFile("./Book1.xlsx") if err != nil { fmt.Println(err) return } // Insert a picture. err = f.AddPicture("Sheet1", "A2", "./image1.png", "") if err != nil { fmt.Println(err) } // Insert a picture to worksheet with scaling. err = f.AddPicture("Sheet1", "D2", "./image2.jpg", `{"x_scale": 0.5, "y_scale": 0.5}`) if err != nil { fmt.Println(err) } // Insert a picture offset in the cell with printing support. err = f.AddPicture("Sheet1", "H2", "./image3.gif", `{"x_offset": 15, "y_offset": 10, "print_obj": true, "lock_aspect_ratio": false, "locked": false}`) if err != nil { fmt.Println(err) } // Save the xlsx file with the origin path. err = f.Save() if err != nil { fmt.Println(err) } } 还有其他一些功能,在这里就不一一列举了,详细使用文档以及获取后期的维护更新可以从项目的主页获取 github.com/xuri/excelize

资源下载

更多资源
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等操作系统。

用户登录
用户注册