- Android App开发之Jetpack架构,带你全面理解View的绘制流程
m0_66144992
程序员架构移动开发android
在UI组件日益完善的同时,也开始出现了RecyclerView、ConstraintLayout、MotionLayout等一些可以辅助大家写出更加符合性能要求的界面效果。在UI控件日益满足需求的同时,系统的安全与稳定性、用户隐私也越来越被重视,所以每个版本都出现了一些大的适配工作,例如运行时权限,FileProvider适配,限制后台服务、广播,限制反射SDK私有API,引导使用HTTPS,甚至
- Android AIDL实现进程间通讯IPC
2501_90326753
android
以下是一个简单的实现:1.AIDLServer提供数据接口①创建.aidl文件,公开接口给Client:packagecom.example.aidlserver.aidl;interfaceDataService{intgetData(Stringtype);StringgetTime();}②对应的Service,实现aidl中对应的方法:packagecom.example.aidlserv
- MySQL修改max_allowed_packet
一张假钞
mysql
个人博客地址:MySQL修改max_allowed_packet|一张假钞的真实世界通过global参数设置:setglobalmax_allowed_packet=32*1024*1024;注意,下面的写法是不正确的:setglobalmax_allowed_packet=32m;如果要重启也生效的话,在my.cnf中添加如下配置:max_allowed_packet=32m
- adb连接WiFi调试
陌恋殇雪
androidJavawifiadb
adbWiFi(手机,平板,车机)进行调试确认配置好adb环境adb命令adbtcpip5555连接adbconnet(手机WiFiIP)注意:必须在同一WiFi条件下(手机或者其它也可以连接电脑分享的热点),同时第一次操作的时候需要usb线连接,操作完成后断开就能成功,可以从AndroidStudio中看到存在这个ip的设备下面提供一张操作截图:
- 正确姿势使用adb wifi调试
IT先森
Android实战开发指南adbwifi调试adb调试adb
正确姿势使用adbwifi调试前言 在Android设备样机调试阶段,我们一般都会使用adbusb进行相关的调试,但是有时候可能usb口调试不是很方便,譬如usb口被占用了或者usb口不够,那么这个时候adbwifi调试就排上用场了,下面详细介绍一下怎么正确使用adbwifi进行调试。前期准备 首先必须保证你的手机和电脑连接的是同一个wifi,这点不用说吧。而且最好是局域网,因为
- 开始使用 adb WiFi 调试模式
每天干八碗饭的东东
android
使用adbWiFi调试模式,通过以下几个步骤即可完成(开始这些配置之前先确保你的adb环境是配置好的):确保Android手机和电脑连接的是同一局域网的WiFi;通过USB线连接Android手机;设置手机侦听端口5555上的TCP/IP连接: $adbtcpip5555※注意:如果有多个手机连接在电脑上,需要用-s‘serial_number’参数指定目标手机,比如: $adb-s'04157d
- 通过WiFi连接adb调试
小刘学安卓
adbandroid
通过WiFi连接adb调试解决cannotconnectto192.168.1.136:5555:由于目标计算机积极拒绝,无法连接。(10061)解决办法1(Windows下cmd环境执行)1.连接USB数据线,打开USB调试使用windows的“运行”命令行方式:(此方法需配置adb环境变量,也可直接进入adb工具目录执行\android-sdk-windows\platform-tools\)
- android 使用wifi进行adb调试
huangmingcsdn
Androidandroidadb
1.确认使用usb线连接android后adb调试成功2.android和电脑连接同一个局域网,记录androidip3.下载android终端模拟器Terminal4.打开android终端模拟器,输入命令,开启androidadb调试端口setpropservice.adb.tcp.port5555stopadbdstartadbd5.打开cmd窗口,输入命令adbconnectip
- Python:第三方库
衍生星球
python第三方库
1.第三方Python库库名用途pip安装指令NumPy矩阵运算pipinstallnumpyMatplotlib产品级2D图形绘制pipinstallmatplotlibPIL图像处理pipinstallpillowsklearn机器学习和数据挖掘pipinstallsklearnRequestsHTTP协议访问pipinstallrequestsJieba中文分词pipinstalljieba
- android studio 使用maven-publish 插件上传aar到远程maven仓库
-优势在我
androidstudiomavenandroid
上传插件编写1、在工程目录下添加upload.gradle文件applyplugin:'maven-publish'defRELEASE_REPOSITORY_URL='http://xxx.xx.com/artifactory/repository/release/'defSNAPSHOT_REPOSITORY_URL='http://xxx.xx.com/artifactory/reposit
- Android Studio之解决Gradle下载报错
Metaverse达爷
androidstudioandroid
作者:达爷使用软件:AndroidStudio前言最近在做Unity到AndroidStudio的适配,因为AndroidStudio迭代速度过快的缘故,许多小伙伴隔几天打开项目时会发现项目的配置文件需要更新,但由于考虑到科学上网等因素,发现配置文件更新速度较慢,项目卡在启动配置阶段导致项目无法打开。作者之前也遇到过这个问题,为此在尝试了许多现有的办法后,总结出来一套比较快速可行的解决方法,现分享
- OpenCV及基本用法
m0_74823683
opencv人工智能计算机视觉
一.OpenCV介绍1.OpenCV的全称是OpenSourceComputerVisionLibrary,是一个开放源代码的计算机视觉库。OpenCV是最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用,现在美国WillowGarage为OpenCV提供主要的支持。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序,目前在工业界以及科研领域广泛采用。
- flutter 专题 五十三 Flutter 底部向上动画弹出菜单
leluckys
Flutter面试与实战flutter前端javascript
在移动应用开发中,我们经常会遇到弹出菜单的开发需求,对于下拉菜单可以参考Flutter自定义下拉菜单,而如果是向上的弹出菜单或者更加负责的扇形菜单,则需要开发者进行自定义开发。上面是自定义向上弹出菜单的示例,如果要实现上面的效果,需要开发者对动画(AnimationController、Animation)和Flow组件能够很熟练的进行使用。,为了方便大家快速的进行开发,现在我们将它封装城一个组件
- android wifi安全检测,Android系统下检测Wifi连接互联网是否正常的代码
吴敬欣
androidwifi安全检测
/****判断网络状态是否可用**@returntrue:网络可用;false:网络不可用*/publicbooleanisConnectInternet(){ConnectivityManagerconManager=(ConnectivityManager)test.this.getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfon
- AFL QEMU模式安装报错(afl-2.52b & qemu-2.10.0)[已解决]
geniusle201
aflqemuafl-qemu模糊测试patch
搭建afl-qemu模块的时候,碰到了如下2个报错:xxxxxxxx/qemu/linux-user/syscall.c:253:16:error:staticdeclarationof‘gettid’followsnon-staticdeclaration253|_syscall0(int,gettid)^~~~~~xxxxxxxxx/qemu/linux-user/syscall.c:184:
- Java学习笔记
范梦迪
java笔记
第一章Java基础1.HelloWorld程序publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("Hello,World!");}}2.数据类型Java提供了多种数据类型,包括基本数据类型和引用数据类型。基本数据类型用于存储简单的数据值,而引用数据类型用于存储对象的引用。2.1基本数据类型Java
- This dependency was not found: * @logicflow/core/dist/LogicFlow.css
计算机辅助工程
css前端
在使用@logicflow/core这个库时,如果你遇到了找不到@logicflow/core/dist/LogicFlow.css的问题,通常是因为你没有正确地安装或引入该库的CSS文件。以下是几个步骤来帮助你解决这个问题:确认安装首先,确保你已经正确安装了@logicflow/core。你可以通过运行以下命令来安装它(如果你还没有安装的话):npminstall@logicflow/core引
- 微软AutoGen高级功能——Memory
梦丶晓羽
pythonAutoGenmicrosoft人工智能
介绍大家好,博主又来给大家分享知识了。这次又要给大家分享什么呢?哈哈。这次要给大家分享的是微软AutoGen框架的高级且重要的功能:Memory。在微软AutoGen中,Memory(记忆)是一个重要概念,它主要用于存储和管理智能体之间交互的历史信息,有助于智能体在对话和协作过程中参考过往内容,以更智能地推进任务。那我们直接进入正题。Memory在几种用例中,维护一个有用事实的存储库是很有价值的,
- Android音频处理库,Android中的音频处理------SoundPool,MediaRecorder,MediaPlayer以及RingStone总结...
weixin_39849888
Android音频处理库
用Soundpool能够播一些短的反应速度要求高的声音,比方游戏中的爆破声,而Mediaplayer适合播放长点的。MediaRecorder主要用来录音。SoundPool加载音乐文件使用了独立的线程,不会堵塞UI主线程的操作。可是这里假设音效文件过大没有加载完毕,我们调用play方法时可能产生严重的后果,这里AndroidSDK提供了一个SoundPool.OnLoadCompleteList
- 场景识别-音频场景
法迪
场景识别音频事件playback
目的避免管控正在使用音频的场景、同时定义黑名单音频使用APP列表是否正在播放音乐frameworks/base/services/core/java/com/android/server/audio/PlaybackActivityMonitor.javaPlaybackActivityMonitor进行playerEvent和releasePlayer事件进行埋点/***Updateplayer
- 【Android】Audio音频输出通道切换 - 蓝牙bluetooth、外放
Mars-xq
android音视频androidstudio
参考:【Android】Audio音频输出通道切换-蓝牙、外放AndroidAudio音频输出通道切换为什么iOS或Android设备连接蓝牙设备后不能通过蓝牙设备接电话?xq_android/MyAudioTrackDemo1手机音频的输出有外放(Speaker)、听筒(TelephoneReceiver)、有线耳机(WiredHeadset)、蓝牙音箱(BluetoothA2DP)等输出设备。
- 几个字符串操作函数(深析)
阅月跃悦
c语言c++算法
1、mystrupr--将小写字母转换为大写(my-string-up)#includevoidmystrupr(char*str){while(*str){if(*str>='a'&&*str='a'&&*strintmystrlen(char*str){intlen=0;while(*str++){len++;}returnlen;}intmain(){charstr[]="HelloWorl
- 【MediaTek】 T750 openwrt-23.05编译: error: ISO C++17 does not allow dynamic exception specifications
wellnw
功能实现及问题处理Openwrtopenwrt
MediaTekT750T750采用先进的7nm制程,高度集成5G调制解调器和四核ArmCPU,提供较强的功能和配置,设备制造商得以打造精巧的高性能CPE产品,如固定无线接入(FWA)路由器和移动热点。MediaTekT750平台是一款综合的芯片组,集成了5GSoCMT6890、12nm制程的收发器MT6190、ET、GNSS和PMIC等。高度集成的T750平台大幅减少组件数量,为产品设计者提供更
- Python实战:解析labelme标注数据——如何将数据转换为COCO格式
程序员杨弋
Python全栈工程师学习指南python开发语言
在计算机视觉中,标注数据是非常重要的,而Labelme是一个简单易用的自由标注工具,被广泛应用于图像语义分割、目标检测、实例分割等领域,然而标注数据并不总是以我们需要的格式存在,因此需要进行适当的转换,本文将详细介绍如何将Labelme标注数据转换为COCO格式。首先需要安装相关的Python库,包括labelme、numpy、matplotlib、pillow等,在安装完成后设置数据路径,并读取
- 字节跳动实习生和校招生内推
飞300
pythonjavascriptphp业界资讯算法
机器学习算法实习生-平台治理1、2026届硕士及以上学位在读,计算机等相关专业优先;2、有扎实的代码能力,熟悉深度学习/图神经网络/机器学习框架,如Pytorch、Tensorflow、DGL、Pyg、Sklearn等;3、熟悉机器学习/图学习/序列学习算法中的一项或者多项,如图建模、时序信号建模、节点/子图分类、社区挖掘、表征学习、自监督/半监督学习等,有一定深度和广度;4、熟悉相关算法在数据挖
- Docker容器中Elasticsearch内存不足问题排查与解决方案
一勺菠萝丶
#Linux#ELK网络服务器linux运维
在使用Docker运行Elasticsearch(ES)时,可能会遇到内存不足的问题,导致ES无法启动。以下是一次完整的排查和解决过程。问题描述在启动ES时,日志提示如下错误:#Nativememoryallocation(mmap)failedtomap5368709120bytesforcommittingreservedmemory.#Thereisinsufficientmemoryfor
- android jetpack,Android Jetpack应用指南
comparethecloud
androidjetpack
第1章初识Jetpack11.1Android应用程序架构设计标准的缺失概论11.2什么是Jetpack21.3Jetpack与AndroidX31.4迁移至AndroidX41.5新建项目默认支持AndroidX61.6总结8第2章LifeCycle92.1LifeCycle的诞生92.2使用LifeCycle解耦页面与组件102.2.1案例分析102.2.2LifeCycle的原理112.2.
- android studio build异常
JavaPub-rodert
ERROR解决androidstudioandroidandroid-studio
文章目录异常解决异常ERROR:FailedtoinstallthefollowingAndroidSDKpackagesassomelicenceshavenotbeenaccepted.platforms;android-28AndroidSDKPlatform28build-tools;28.0.2AndroidSDKBuild-Tools28.0.2Tobuildthisproject,a
- MNIST Examples for GGML - Convolutional network
Yongqiang Cheng
ggml-llama.cpp-whisper.cppGGMLMNISTExamplesConvolutionalnetwork
MNISTExamplesforGGML-Convolutionalnetwork1.Build2.MNISTExamplesforGGML2.1.Obtainingthedata2.2.Convolutionalnetwork2.2.1.TotrainaconvolutionalnetworkusingTensorFlow2.2.2.ToevaluatethemodelontheCPUusing
- 2024年最新Android Jetpack Compose开发指南及实战教程_jetpack compose pdf
2401_86391835
androidjetpackpdfandroid
这里免费分享一份阿里P7架构师和谷歌技术团队共同整理的JetpackCompose指南及实战教程,来帮助读者规划出从入门到精通的最佳学习路径。在对知识点细致的讲解之外,书中还穿插了大量示例代码和最佳实践,对于Compose的初/中级读者极具学习和参考价值。AndroidJetpackCompose开发应用指南第⼀章初识JetpackJetPack是什么JetPack和AndroidXAndroid
- mondb入手
木zi_鸣
mongodb
windows 启动mongodb 编写bat文件,
mongod --dbpath D:\software\MongoDBDATA
mongod --help 查询各种配置
配置在mongob
打开批处理,即可启动,27017原生端口,shell操作监控端口 扩展28017,web端操作端口
启动配置文件配置,
数据更灵活 
- 大型高并发高负载网站的系统架构
bijian1013
高并发负载均衡
扩展Web应用程序
一.概念
简单的来说,如果一个系统可扩展,那么你可以通过扩展来提供系统的性能。这代表着系统能够容纳更高的负载、更大的数据集,并且系统是可维护的。扩展和语言、某项具体的技术都是无关的。扩展可以分为两种:
1.
- DISPLAY变量和xhost(原创)
czmmiao
display
DISPLAY
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:DISPLAY=:0.0
- 获取B/S客户端IP
周凡杨
java编程jspWeb浏览器
最近想写个B/S架构的聊天系统,因为以前做过C/S架构的QQ聊天系统,所以对于Socket通信编程只是一个巩固。对于C/S架构的聊天系统,由于存在客户端Java应用,所以直接在代码中获取客户端的IP,应用的方法为:
String ip = InetAddress.getLocalHost().getHostAddress();
然而对于WEB
- 浅谈类和对象
朱辉辉33
编程
类是对一类事物的总称,对象是描述一个物体的特征,类是对象的抽象。简单来说,类是抽象的,不占用内存,对象是具体的,
占用存储空间。
类是由属性和方法构成的,基本格式是public class 类名{
//定义属性
private/public 数据类型 属性名;
//定义方法
publ
- android activity与viewpager+fragment的生命周期问题
肆无忌惮_
viewpager
有一个Activity里面是ViewPager,ViewPager里面放了两个Fragment。
第一次进入这个Activity。开启了服务,并在onResume方法中绑定服务后,对Service进行了一定的初始化,其中调用了Fragment中的一个属性。
super.onResume();
bindService(intent, conn, BIND_AUTO_CREATE);
- base64Encode对图片进行编码
843977358
base64图片encoder
/**
* 对图片进行base64encoder编码
*
* @author mrZhang
* @param path
* @return
*/
public static String encodeImage(String path) {
BASE64Encoder encoder = null;
byte[] b = null;
I
- Request Header简介
aigo
servlet
当一个客户端(通常是浏览器)向Web服务器发送一个请求是,它要发送一个请求的命令行,一般是GET或POST命令,当发送POST命令时,它还必须向服务器发送一个叫“Content-Length”的请求头(Request Header) 用以指明请求数据的长度,除了Content-Length之外,它还可以向服务器发送其它一些Headers,如:
- HttpClient4.3 创建SSL协议的HttpClient对象
alleni123
httpclient爬虫ssl
public class HttpClientUtils
{
public static CloseableHttpClient createSSLClientDefault(CookieStore cookies){
SSLContext sslContext=null;
try
{
sslContext=new SSLContextBuilder().l
- java取反 -右移-左移-无符号右移的探讨
百合不是茶
位运算符 位移
取反:
在二进制中第一位,1表示符数,0表示正数
byte a = -1;
原码:10000001
反码:11111110
补码:11111111
//异或: 00000000
byte b = -2;
原码:10000010
反码:11111101
补码:11111110
//异或: 00000001
- java多线程join的作用与用法
bijian1013
java多线程
对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means t
- Java发送http请求(get 与post方法请求)
bijian1013
javaspring
PostRequest.java
package com.bijian.study;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURL
- 【Struts2二】struts.xml中package下的action配置项默认值
bit1129
struts.xml
在第一部份,定义了struts.xml文件,如下所示:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts
- 【Kafka十三】Kafka Simple Consumer
bit1129
simple
代码中关于Host和Port是割裂开的,这会导致单机环境下的伪分布式Kafka集群环境下,这个例子没法运行。
实际情况是需要将host和port绑定到一起,
package kafka.examples.lowlevel;
import kafka.api.FetchRequest;
import kafka.api.FetchRequestBuilder;
impo
- nodejs学习api
ronin47
nodejs api
NodeJS基础 什么是NodeJS
JS是脚本语言,脚本语言都需要一个解析器才能运行。对于写在HTML页面里的JS,浏览器充当了解析器的角色。而对于需要独立运行的JS,NodeJS就是一个解析器。
每一种解析器都是一个运行环境,不但允许JS定义各种数据结构,进行各种计算,还允许JS使用运行环境提供的内置对象和方法做一些事情。例如运行在浏览器中的JS的用途是操作DOM,浏览器就提供了docum
- java-64.寻找第N个丑数
bylijinnan
java
public class UglyNumber {
/**
* 64.查找第N个丑数
具体思路可参考 [url] http://zhedahht.blog.163.com/blog/static/2541117420094245366965/[/url]
*
题目:我们把只包含因子
2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14
- 二维数组(矩阵)对角线输出
bylijinnan
二维数组
/**
二维数组 对角线输出 两个方向
例如对于数组:
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13, 14, 15, 16 },
slash方向输出:
1
5 2
9 6 3
13 10 7 4
14 11 8
15 12
16
backslash输出:
4
3
- [JWFD开源工作流设计]工作流跳跃模式开发关键点(今日更新)
comsci
工作流
既然是做开源软件的,我们的宗旨就是给大家分享设计和代码,那么现在我就用很简单扼要的语言来透露这个跳跃模式的设计原理
大家如果用过JWFD的ARC-自动运行控制器,或者看过代码,应该知道在ARC算法模块中有一个函数叫做SAN(),这个函数就是ARC的核心控制器,要实现跳跃模式,在SAN函数中一定要对LN链表数据结构进行操作,首先写一段代码,把
- redis常见使用
cuityang
redis常见使用
redis 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
引入jar包 jedis-2.1.0.jar (本文下方提供下载)
package redistest;
import redis.clients.jedis.Jedis;
public class Listtest
- 配置多个redis
dalan_123
redis
配置多个redis客户端
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&quo
- attrib命令
dcj3sjt126com
attr
attrib指令用于修改文件的属性.文件的常见属性有:只读.存档.隐藏和系统.
只读属性是指文件只可以做读的操作.不能对文件进行写的操作.就是文件的写保护.
存档属性是用来标记文件改动的.即在上一次备份后文件有所改动.一些备份软件在备份的时候会只去备份带有存档属性的文件.
- Yii使用公共函数
dcj3sjt126com
yii
在网站项目中,没必要把公用的函数写成一个工具类,有时候面向过程其实更方便。 在入口文件index.php里添加 require_once('protected/function.php'); 即可对其引用,成为公用的函数集合。 function.php如下:
<?php /** * This is the shortcut to D
- linux 系统资源的查看(free、uname、uptime、netstat)
eksliang
netstatlinux unamelinux uptimelinux free
linux 系统资源的查看
转载请出自出处:http://eksliang.iteye.com/blog/2167081
http://eksliang.iteye.com 一、free查看内存的使用情况
语法如下:
free [-b][-k][-m][-g] [-t]
参数含义
-b:直接输入free时,显示的单位是kb我们可以使用b(bytes),m
- JAVA的位操作符
greemranqq
位运算JAVA位移<<>>>
最近几种进制,加上各种位操作符,发现都比较模糊,不能完全掌握,这里就再熟悉熟悉。
1.按位操作符 :
按位操作符是用来操作基本数据类型中的单个bit,即二进制位,会对两个参数执行布尔代数运算,获得结果。
与(&)运算:
1&1 = 1, 1&0 = 0, 0&0 &
- Web前段学习网站
ihuning
Web
Web前段学习网站
菜鸟学习:http://www.w3cschool.cc/
JQuery中文网:http://www.jquerycn.cn/
内存溢出:http://outofmemory.cn/#csdn.blog
http://www.icoolxue.com/
http://www.jikexue
- 强强联合:FluxBB 作者加盟 Flarum
justjavac
r
原文:FluxBB Joins Forces With Flarum作者:Toby Zerner译文:强强联合:FluxBB 作者加盟 Flarum译者:justjavac
FluxBB 是一个快速、轻量级论坛软件,它的开发者是一名德国的 PHP 天才 Franz Liedke。FluxBB 的下一个版本(2.0)将被完全重写,并已经开发了一段时间。FluxBB 看起来非常有前途的,
- java统计在线人数(session存储信息的)
macroli
javaWeb
这篇日志是我写的第三次了 前两次都发布失败!郁闷极了!
由于在web开发中常常用到这一部分所以在此记录一下,呵呵,就到备忘录了!
我对于登录信息时使用session存储的,所以我这里是通过实现HttpSessionAttributeListener这个接口完成的。
1、实现接口类,在web.xml文件中配置监听类,从而可以使该类完成其工作。
public class Ses
- bootstrp carousel初体验 快速构建图片播放
qiaolevip
每天进步一点点学习永无止境bootstrap纵观千象
img{
border: 1px solid white;
box-shadow: 2px 2px 12px #333;
_width: expression(this.width > 600 ? "600px" : this.width + "px");
_height: expression(this.width &
- SparkSQL读取HBase数据,通过自定义外部数据源
superlxw1234
sparksparksqlsparksql读取hbasesparksql外部数据源
关键字:SparkSQL读取HBase、SparkSQL自定义外部数据源
前面文章介绍了SparSQL通过Hive操作HBase表。
SparkSQL从1.2开始支持自定义外部数据源(External DataSource),这样就可以通过API接口来实现自己的外部数据源。这里基于Spark1.4.0,简单介绍SparkSQL自定义外部数据源,访
- Spring Boot 1.3.0.M1发布
wiselyman
spring boot
Spring Boot 1.3.0.M1于6.12日发布,现在可以从Spring milestone repository下载。这个版本是基于Spring Framework 4.2.0.RC1,并在Spring Boot 1.2之上提供了大量的新特性improvements and new features。主要包含以下:
1.提供一个新的sprin
基本原理:
Android的Low Memory Killer是在标准linux kernel的OOM基础上修改而来的一种内存管理机制,当系统内存不足时,杀死Bad进程释放其内存。Bad进程的选择标准有两个:oom_adj和占用内存的大小。oom_adj代表进程的优先级,数值越大,优先级越高,对应每个oom_adj都有一个空闲内存的阈值。Android Kernel每隔一段时间会检查当前空闲内存是否低于某个阈值,如果是,则杀死oom_adj最大的Bad进程,如果有两个以上Bad进程oom_adj相同,则杀死其中占用内存最多的进程。
Low Memory Killer与OOM的区别
OOM即Out of Memory是标准linux Kernel的一种内存管理机制,Low Memory Killer在它基础上作了改进:
OOM基于多个标准给每个进程打分,分最高的进程将被杀死;Low MemoryKiller则用oom_adj和占用内存的大小来选择Bad进程,OOM在内存分配不足时调用,而Low Memory Killer每隔一段时间就会检查,一旦发现空闲内存低于某个阈值,则杀死Bad进程。
Low Memory Killer的实现
Low Memory Killer的源代码在drivers/staging/Android/lowmemorykiller.c中,它是通过注册Cache Shrinker来实现的。Cache Shrinker是标准linux kernel回收内存页面的一种机制,它由内核线程kswapd监控,当空闲内存页面不足时,kswapd会调用注册的Shrinker回调函数,来回收内存页面。
Low Memory Killer是在模块初始化时注册Cache Shrinker的,代码如下:
static int__init lowmem_init(void)
{
register_shrinker(&lowmem_shrinker);//注册Cache Shrinker
return 0;
}
lowmem_shrinker的定义如下:
static struct shrinker lowmem_shrinker=
{
.shrink=lowmem_shrink,
.seeks=DEFAULT_SEEKS*16
};
register_shrinker会将lowmem_shrink加入Shrinker List中,被kswapd在遍历Shrinker List时调用,而Low Memory Killer的功能就是在lowmem_shrink中实现的。
lowmem_shrink用两个数组作为选择Bad进程的依据,这两个数组的定义如下:
static int lowmem_adj[6]=
{
0,
1,
6,
12,
};
static int lowmem_adj_size=4;
static size_t lowmem_minfree[6]={
3*512,//6MB
2*1024,//8MB
4*1024,//16MB
16*1024,//64MB
};
lowmem_minfree保存空闲内存的阈值,单位是一个页面4K,lowmem_adj保存每个阈值对应的优先级。lowmem_shrink首先计算当前空闲内存的大小,如果小于某个阈值,则以该阈值对应的优先级为基准,遍历各个进程,计算每个进程占用内存的大小,找出优先级大于基准优先级的进程,在这些进程中选择优先级最大的杀死,如果优先级相同,则选择占用内存最多的进程。
lowmem_shrink杀死进程的方法是向进程发送一个不可以忽略或阻塞的SIGKILL信号:
force_sig(SIGKILL,selected);
用户接口
设置空闲内存阈值的接口:/sys/module/lowmemorykiller/parameters/minfree,设置对应优先级的接口:/sys/module/lowmemorykiller/parameters/adj,设置各个进程优先级的接口:/proc/<进程pid>/oom_adj。
Android启动时读取的配置文件/init.rc中定义了相应的属性供AP使用并有设置这些参数:
#killed by the kernel.These are used in
ActivityManagerService.
setprop ro.FOREGROUND_APP_ADJ 0
setprop ro.VISIBLE_APP_ADJ 1
setprop ro.SECONDARY_SERVER_ADJ 2
setprop ro.BACKUP_APP_ADJ 2
setprop ro.HOME_APP_ADJ 4
setprop ro.HIDDEN_APP_MIN_ADJ 7
setprop ro.CONTENT_PROVIDER_ADJ 14
setprop ro.EMPTY_APP_ADJ 15
#Define the memory thresholds at which the above process
classes will
#be killed.These numbers are in pages(4k).
setprop ro.FOREGROUND_APP_MEM 1536
setprop ro.VISIBLE_APP_MEM 2048
setprop ro.SECONDARY_SERVER_MEM 4096
setprop ro.BACKUP_APP_MEM 4096
setprop ro.HOME_APP_MEM 4096
setprop ro.HIDDEN_APP_MEM 5120
setprop ro.CONTENT_PROVIDER_MEM 5632
setprop ro.EMPTY_APP_MEM 6144
#Write value must be consistent with the above properties.
#Note that the driver only supports 6 slots,so we have HOME_APP
at the
#same memory level as services.
write/sys/module/lowmemorykiller/parameters/adj
0,1,2,7,14,15
write/sys/module/lowmemorykiller/parameters/minfree
1536,2048,4096,5120,5632,6144
#Set init its forked children's oom_adj.
write/proc/1/oom_adj-16
从以上设置可以看出,将init进程oom_adj设置为-16,从而保证init进程永远不会被杀掉