首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共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的公众号

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

【原创】HBase 基础知识

特点 1. 在 HDFS 之上开发的; 2. 面向列(实际是面向列族)的存储器 3. 实时读写 4. 随机读写 5. 针对超大规模数据集 6. 不支持 SQL 基本概念 单元格(cell) 由行和列的坐标交叉决定,有版本号; 版本号默认为自动分配,为 HBase 向单元格插入数据时的时间戳; 单元格中的内容为未解释的字节数组 行的键 表中行的键为字节数组; 表中的行根据行的键值(即表的主键)进行排序; 排序依据为字节序; 所有对表的访问都要通过表的主键(二级索引问题); 列族(column family) 行中的列会被划分成不同的列族; 同一列族中成员具有相同的前缀; 列族的前缀必须是可打印字符构成的; 列族修饰符,即结尾字符,可以为任意字符; 在 HBase 中,规定使用冒号来分隔列族和列族修饰符; 一个表的列族必须作为表模式定义的一部分预先给出,但是心的列族成员可以随后按需要加入; 物理上,所有的列族成员都一起存放在文件系统中; HBase 的调优和存储都在列族这个层次上进行的,所以最好使所有列族成员都有相同的访问模式(access pattern)和大小特征。 区域(region) HBase 自动把表水平划分成区域; 每个区域由表中行的子集构成; 一开始,一个表只有一个区域,随着表变大,区域的个数也会增加; 区域是在 HBase 中分布数据的最小单位; 在线的所有区域按次序排列就构成了表的所有内容; 锁 无论对行进行访问的事务牵涉多少列,对行的更新都是原子的; 构成 HBase 模型为一个 Master 节点负责协调管理一个或多个 Regionserver 从属机; Master 负责:启动(bootstrap)、全新的安装、将区域分配给注册的 Regionserver 、恢复 Regionserver 的故障。 Regionserver 负责:零个或多个区域的管理,响应客户端的读写请求,区域的划分,通知 Master 有新子区域(daughter region)产生; HBase 依赖于 Zookeeper ,默认情况下,HBase 管理一个 Zookeeper 实例,用于作为集群的权威(authority); HBase 负责管理根目录表(root catalog table)的位置、当前集群 Master 地址等重要信息; 相关文件 conf/regionservers -- 可以查看 Regionserver 节点信息 conf/hbase-site.xml 和 conf/hbase-env.sh -- 集群站点配置 持久化接口 本地文件系统接口(默认) KFS 文件系统接口 Amazon S3 接口 HDFS 接口 若要使用 HBase 集群,则通常要把 HBase 的存储配置为指向 HDFS 集群; 特殊表(涉及数据定位过程问题) -ROOT- 表包含 .META. 表的区域列表; .META. 表包含所有用户空间区域(user-space region)的列表; 在 Regionserver 上进行读写操作 写操作 追加方式写入提交日志(commit log),提交日志存放在 HDFS 中(保证高可用); 写入内存中的 memstore ; 若 memstore 满,则刷入(flush)文件系统; 读操作 查看区域(region)的 memstore ; 若在 memstore 中找到需要的版本则直接返回,否则按照次序从新到旧检查 flush file ; Regionserver 上存在一个后台进程负责在 flush file 数量达到阈值后,对其进行压缩处理(将多个文件的内容处理后写入一个文件中) HBase 提供的对外接口 Avro REST Thrift 通过上述接口和 HBase 集群进行双向交互时,需要 HBase 客户端实例进行代理,故比直接 JAVA 客户端交互更慢。 服务的启动和停止 hbase-daemon.sh <start|stop> <rest|thrift|avro> 对比 HDFS 和 MapReduce 适用于对大数据集进行批处理,但对于读或写单独的记录,效率很低;而 HBase 可以高效完成; HDFS 和 MapReduce 不擅长在有更新到达时维护索引(虽然 MapReduce 作业可以用于建立索引以支持随机访问),所以不符合低延时查询需求,而 HBase 可以; 大数据集需求 -> 排除 RDBMS 的使用(可能有点绝对) 低查询延时 -> 排除直接使用 HDFS ;

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

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的未来: 网络 安全性 容器引擎

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

基于minikube快速搭建单节点环境

一、说明 本文主要介绍在 Centos7 环境下基于 Minikube 来快速部署 Kubernetes 单节点集群环境,并在外部访问部署在 k8s 上的 dashboard 服务。 二、Minikube 介绍 Minikube 是一个基于go语言开发,易于在本地运行 Kubernetes 的工具,可在你的笔记本电脑上的虚拟机内轻松创建单机版 Kubernetes 集群,对硬件资源没有太高的要求,非常适合 测试 和 本地开发。 官方文档:https://minikube.sigs.k8s.io/docs/ 架构图: 运作原理: 从 Minikube 的架构中可以看出 master 节点与其它节点合为一体,而整体则通过宿主机上的 kubectl 进行管理,这样可以更加 节省资源。 简单来说就是,用户使用 Minikube CLI 管理虚拟机上的 Kubernetes 环境,比如:启动,停止,删除,获取状态等。一旦 Minikube 虚拟机启动,用户就可以使用熟悉的 Kubectl CLI 在 Kubernetes 集群上执行操作。 三、Minikube安装 3.1. 系统要求 CUP:2核以上 内存:2GB以上 硬盘:需要20G 网络:能连因特网(需要下载安装包), 容器:需要先安装Docker或其他容器。 3.2. 安装前准备 3.2.1. 安装 Docker 安装步骤参考:https://www.runoob.com/docker/centos-docker-install.html docker 的最低建议版本为 20.10.0 以上 配置阿里云加速器:https://cr.console.aliyun.com/cn-shenzhen 启动 docker: systemctl start docker systemctl enable docker.service 3.2.2. 创建新用户 操作 minikube 需要一个具有 root 权限的用户(非root) 需要将该用户添加进入 docker 用户组 添加该用户至 docker 用户组:sudo gpasswd -a 用户名 docker 更新 docker 用户组:newgrp docker 3.3. 部署 切换新创建的用户来操作 minikube,我这里创建的用户为 zlt su zlt 安装步骤参考:https://minikube.sigs.k8s.io/docs/start/ 3.3.1. 安装命令 执行以下2个命令,下载并安装 minikube 命令: curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube 执行命令 minikube version 查看版本号: 3.3.2. 启动集群 执行以下命令: minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.8 image-mirror-country 为指定使用国内源 kubernetes-version 指定部署的版本(最新版兼容性坑比较多,所以选择低版本) 执行成功如下图所示: 3.3.3. 验证 执行命令 minikube status 查看状态,结果如下: [zlt@zlt opt]$ minikube status minikube type: Control Plane host: Running kubelet: Running apiserver: Running kubeconfig: Configured 3.3.4. 查看集群状态 可直接使用 minikube 自带的 kubectl 命令。 获取集群所有节点(机器): minikube kubectl get nodes 获取集群所有命名空间: minikube kubectl get namespaces 查看集群所有 Pod: minikube kubectl -- get pods -A 3.3.5. Minikube 常用命令 进入节点服务器: minikube ssh 执行节点服务器命令,例如查看节点 docker info: minikube ssh -- docker info 删除集群, 删除 ~/.minikube 目录缓存的文件: minikube delete 关闭集群: minikube stop 销毁集群: minikube stop && minikube delete 四、安装 kubectl 由于 minikube 内置的 kubectl 命令功能不全,所以最好独立安装一个 kubectl 用以下命令下载最新发行版: curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" 安装 kubectl: sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl 查看版本的详细信息: kubectl version --client --output=yaml 五、安装 dashboard 执行以下命令,启动 dashboard 插件: minikube dashboard 集群外部想要直接访问 dashboard 还需要设置代理才能访问,执行以下命令: kubectl proxy --port=8001 --address='192.168.28.138' --accept-hosts='^.*' --port 需要暴露的端口号 --address 服务器外网IP(宿主机IP) --accept-hosts 外部访问服务器的IP(白名单) 这样就可以在浏览器上通过以下地址访问 Kubernetes Dashboard: http://192.168.28.138:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ 扫码关注有惊喜!

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

K8s搭建redis集群

示例redis1:将每个redis.yaml 的路径以及名称进行更改,如果不暴露端口可以将 type: NodePort 改为 ClusterIP,去掉nodePort: 32255,内部端口想修改可以将redis-2改为7001以此类推 vi redis-1.yaml kind: Service apiVersion: v1 metadata: name: redis-1 namespace: default labels: app: redis-1 spec: type: NodePort selector: app: redis-1 ports: - port: 6379 name: rest targetPort: 6379 protocol: TCP nodePort: 32255 --- apiVersion: apps/v1 kind: Deployment metadata: name: redis-1 namespace: default spec: replicas: 1 minReadySeconds: 120 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: redis-1 template: metadata: labels: app: redis-1 spec: containers: - name: redis-1 image: redis:latest imagePullPolicy: Always command: - "redis-server" args: - "/etc/redis/redis.conf" resources: limits: cpu: 1024m memory: 1024Mi requests: cpu: 50m memory: 500Mi ports: - containerPort: 6379 name: rest protocol: TCP volumeMounts: - mountPath: /var/lib/redis name: data - mountPath: /etc/redis/redis.conf name: conf securityContext: privileged: true dnsPolicy: ClusterFirst nodeName: 主机名或ip volumes: - hostPath: path: /srv/redis/test/data name: data - hostPath: path: /srv/redis/test/redis.conf name: conf kubectl apply -f redis-1.yaml 示例redis2:创建4个或6个自行决定将每个redis.yaml 的路径以及名称进行更改 vi redis-2.yaml kind: Service apiVersion: v1 metadata: name: redis-2 namespace: default labels: app: redis-2 spec: type: NodePort selector: app: redis-2 ports: - port: 6379 name: rest targetPort: 6379 protocol: TCP nodePort: 32266 --- apiVersion: apps/v1 kind: Deployment metadata: name: redis-2 namespace: default spec: replicas: 1 minReadySeconds: 120 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 selector: matchLabels: app: redis-2 template: metadata: labels: app: redis-2 spec: containers: - name: redis-2 image: redis:latest imagePullPolicy: Never command: - "redis-server" args: - "/etc/redis/redis.conf" resources: limits: cpu: 1024m memory: 1024Mi requests: cpu: 50m memory: 500Mi ports: - containerPort: 6379 name: rest protocol: TCP volumeMounts: - mountPath: /var/lib/redis name: data - mountPath: /etc/redis/redis.conf name: conf securityContext: privileged: true dnsPolicy: ClusterFirst nodeName: 主机名或ip volumes: - hostPath: path: /srv/redis/test/data2 name: data - hostPath: path: /srv/redis/test/redis.conf name: conf kubectl apply -f redis-2.yaml node 节点操作 vi /srv/redis/test/redis.conf bind 0.0.0.0 masterauth 123456 requirepass 123456 slowlog-log-slower-than 100000 appendonly yes cluster-enabled yes cluster-config-file /var/lib/redis/nodes.conf cluster-node-timeout 5000 dir /var/lib/redis port 6379 node节点进行操作(本人是在单台node操作,如果有多个节点可以在多个节点进行创建,reids.conf也需要在多个节点进行创建)先创建data1-data6 mkdir -p /srv/redis/test/data{1..6} 主节点操作,查看redis 容器ip kubectl get pods -o wide | grep redis 启动好reids后进入容器后执行组建集群 redis-cli --cluster create --cluster-replicas 1 -a "密码" 192.168.68.117:7000 192.168.94.253:7001 192.168.70.33:7002 192.168.68.117:7003 192.168.94.253:7004 192.168.70.33:7005 查看集群信息在任意一个 redis 节点的主机上执行以下命令: # redis-cli -c -a "12345" -h 192.168.190.133 -p 7002 cluster info # redis-cli -c -a "12345" -h 192.168.190.133 -p 7002 cluster nodes

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册