问题
在应用开发的多线程问题中,可能会遇到AsyncTask.execute()时会出现RejectedExecution 的场景
java.util.concurrent.RejectedExecutionException: Task android.os.AsyncTask$SerialExecutor$1@7840c01 rejected from java.util.concurrent.ThreadPoolExecutor@5a73928[Running, pool size = 9, active threads = 9, queued tasks = 128, completed tasks = 192]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2014)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:794)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1340)
at android.os.AsyncTask$SerialExecutor.scheduleNext(AsyncTask.java:247)
at android.os.AsyncTask$SerialExecutor.execute(AsyncTask.java:241)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:607)
at android.os.AsyncTask.execute(AsyncTask.java:551)
要从根源上解决以上问题,需要排查抛出异常时队列中任务的具体情况。
如何解决
整体设计如下:
sDefaultExecutor 在原生代码里就是SerialExecutor ,而SerialExecutor 是串行执行队列,但最终也是通过THREAD_POOL_EXECUTOR 完成。为了加大复现概率,可以在Application 创建时通过反射,替换AsyncTask 的sDefaultExecutor 为THREAD_POOL_EXECUTOR
if (BuildConfig.DEBUG) {
AsyncTaskWithTag.setEnableTaskInfo(true);
// 线程池监控
ReflectUtils.setStaticFieldValue(AsyncTask.class, "THREAD_POOL_EXECUTOR", AsyncTaskWithTag.THREAD_POOL_EXECUTOR);
ReflectUtils.setStaticFieldValue(AsyncTask.class, "sDefaultExecutor", AsyncTaskWithTag.THREAD_POOL_EXECUTOR);
}
使用ThreadPoolExecutorWithTag 替换AsyncTask 的sDefaultExecutor
//AsyncTaskWithTag.java
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable, "AsyncTaskTag #" + mCount.getAndIncrement());
AsyncTaskRunningInfo.addTaskNameToMap(thread.toString(), runnable.toString());
return thread;
}
};
private static final RejectedExecutionHandler defaultHandler =
new RejectedExecutionHandlerWithTag();
public static final Executor THREAD_POOL_EXECUTOR;
static {
ThreadPoolExecutorWithTag threadPoolExecutor = new ThreadPoolExecutorWithTag(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory, defaultHandler);
threadPoolExecutor.allowCoreThreadTimeOut(true);
THREAD_POOL_EXECUTOR = threadPoolExecutor;
}
其中所有通过ThreadPoolExecutorWithTag创建的Thread,都将信息保存到AsyncTaskRunningInfo的Map集合中。
OOM时拒绝策略,使用自定义的RejectedExecutionHandlerWithTag。
public class RejectedExecutionHandlerWithTag implements RejectedExecutionHandler {
private static final String TAG = "Rejected";
private static final String TASK_CREATE_BY = " create by: ";
private static final String TASK_CREATE_TIME = " create at: ";
private static final String TASK_COST_TIME = " cost time: ";
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (!executor.isShutdown()) {
prepareThreadInfo(executor);
prepareWorksQueueInfo(executor);
}
throw new RejectedExecutionException("Task " + r.toString() +
" rejected from " +
executor.toString());
}
// 工作线程
private void prepareThreadInfo(ThreadPoolExecutor executor) {
Object workersValue = ReflectUtils.getFieldValue(executor, "workers");
if (workersValue instanceof HashSet) {
long currentTime = System.currentTimeMillis();
StringBuilder builder = new StringBuilder();
HashSet workers = (HashSet) workersValue;
for (Object ob : workers) {
try {
Object threadValue = ReflectUtils.getFieldValue(ob, "thread");
if (threadValue instanceof Thread) {
Thread thread = (Thread) threadValue;
String name = thread.toString();
String taskName = AsyncTaskRunningInfo.getTaskNameFromMap(name);
if (taskName != null) {
// thread 对应的 task
String taskTag = AsyncTaskRunningInfo.getTaskNameFromMap(taskName);
if (taskTag != null) {
builder.append(name).append(TASK_CREATE_BY).append(taskTag);
} else {
taskName = name;
builder.append(name).append(TASK_CREATE_BY).append(taskName);
}
long taskTime = AsyncTaskRunningInfo.getTaskTimeFromMap(taskName);
if (taskTime > 0) {
builder.append(TASK_CREATE_TIME).append(taskTime);
builder.append(TASK_COST_TIME).append(currentTime - taskTime);
}
} else {
builder.append(name);
}
builder.append("\n");
}
} catch (Exception e) {
e.printStackTrace();
}
}
Log.d(TAG, " executor running thread queue : \n" + builder.toString());
}
}
// 等待队列
private void prepareWorksQueueInfo(ThreadPoolExecutor executor) {
long currentTime = System.currentTimeMillis();
StringBuilder builder = new StringBuilder();
for (Runnable runnable : executor.getQueue()) {
String name = runnable.toString();
String taskName = AsyncTaskRunningInfo.getTaskNameFromMap(name);
if (taskName != null) {
builder.append(name).append(TASK_CREATE_BY).append(taskName);
} else {
builder.append(name);
}
long taskTime = AsyncTaskRunningInfo.getTaskTimeFromMap(name);
if (taskTime > 0) {
builder.append(TASK_CREATE_TIME).append(taskTime);
builder.append(TASK_COST_TIME).append(currentTime - taskTime);
}
builder.append("\n");
}
Log(TAG, " executor pool work wait queue : \n" + builder.toString());
}
private void Log(String tag, String msg) {
if (tag == null || tag.length() == 0
|| msg == null || msg.length() == 0)
return;
// 每段打印3K
int segmentSize = 3 * 1024;
long length = msg.length();
if (length > segmentSize) {
while (msg.length() > segmentSize) {
String logContent = msg.substring(0, segmentSize);
Log.d(tag, logContent);
msg = msg.substring(segmentSize);
}
}
Log.d(tag, msg);
}
}
当触发OOM时回调到rejectedExecution ,输出当前Map 中的所有Task 信息。
public class ThreadPoolExecutorWithTag extends ThreadPoolExecutor {
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
@Override
protected void beforeExecute(Thread wt, Runnable task) {
super.beforeExecute(wt, task);
if (wt != null) {
AsyncTaskRunningInfo.removeTaskNameFromMap(wt.toString());
AsyncTaskRunningInfo.removeTaskTimeFromMap(wt.toString());
}
if (task != null) {
AsyncTaskRunningInfo.removeTaskNameFromMap(task.toString());
AsyncTaskRunningInfo.removeTaskTimeFromMap(task.toString());
}
}
@Override
public void execute(Runnable command) {
super.execute(command);
if (command == null)
throw new NullPointerException();
if (command instanceof AsyncTaskWithTag) {
AsyncTaskRunningInfo.addTaskNameToMap(command.toString(), ((AsyncTaskWithTag) command).tagName());
}
AsyncTaskRunningInfo.addTaskTimeToMap(command.toString(), System.currentTimeMillis());
}
}
AsyncTaskWithTag是继承于AsyncTask,使用AsyncTaskWithTag创建任务必须指定TagName,创建任务后会将runnable和TagName关联,在出现RejectedExecution 时可通过runnable 找到对应Task
public abstract class AsyncTaskWithTag extends AsyncTask {
private static final String TAG = "AsyncTaskWithTag";
private static boolean ENABLE_TASK_INFO = false;
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
// We want at least 2 threads and at most 4 threads in the core pool,
// preferring to have 1 less than the CPU count to avoid saturating
// the CPU with background work
private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE_SECONDS = 30;
private static final int QUEUE_SIZE = 128;
private static final BlockingQueue sPoolWorkQueue =
new LinkedBlockingQueue<>(QUEUE_SIZE);
public static final Executor THREAD_POOL_EXECUTOR;
private static final ThreadFactory sThreadFactory = new ThreadFactory() {
private final AtomicInteger mCount = new AtomicInteger(1);
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable, "AsyncTaskTag #" + mCount.getAndIncrement());
AsyncTaskRunningInfo.addTaskNameToMap(thread.toString(), runnable.toString());
return thread;
}
};
private static final RejectedExecutionHandler defaultHandler =
new RejectedExecutionHandlerWithTag();
static {
ThreadPoolExecutorWithTag threadPoolExecutor = new ThreadPoolExecutorWithTag(
CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
sPoolWorkQueue, sThreadFactory, defaultHandler);
threadPoolExecutor.allowCoreThreadTimeOut(true);
THREAD_POOL_EXECUTOR = threadPoolExecutor;
}
public abstract String tagName();
public static boolean isEnableTaskInfo() {
return ENABLE_TASK_INFO;
}
public static void setEnableTaskInfo(boolean enableTaskInfo) {
ENABLE_TASK_INFO = enableTaskInfo;
}
public AsyncTaskWithTag() {
super();
if (isEnableTaskInfo()) {
prepareTaskInfo();
}
}
private void prepareTaskInfo() {
try {
Object future = ReflectUtils.getFieldValue(this, "mFuture");
if (future != null) {
AsyncTaskRunningInfo.addTaskNameToMap(future.toString(), tagName());
Log.d(TAG, "create task from " + tagName() + ":" + future.toString());
} else {
Log.d(TAG, "do not find future --- " + tagName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
项目工程有较多使用sDefaultExecutor 、THREAD_POOL_EXECUTOR 的AsyncTask,可以考虑把这类AsyncTask 全部替换为AsyncTaskWithTag。也可根据项目情况,先把某些嫌疑较大的AsyncTask 替换为AsyncTaskWithTag ,一步一步排除AsyncTask
new AsyncTask() {
@Override
protected Void doInBackground(Void... voids) {
...
}
}.execute();
修改为:
new AsyncTaskWithTag() {
@Override
public String tagName() {
return " my task name";
}
@Override
protected Void doInBackground(Void... voids) {
...
}
}.execute();
ThreadPoolExecutorWithTag 继承ThreadPoolExecutor, 在线程的关键执行函数阶段添加了增、删Map 处理
public class ThreadPoolExecutorWithTag extends ThreadPoolExecutor {
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
}
public ThreadPoolExecutorWithTag(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
}
//接近准确,最准确的是在afterExecute函数中删掉记录
@Override
protected void beforeExecute(Thread wt, Runnable task) {
super.beforeExecute(wt, task);
if (wt != null) {
AsyncTaskRunningInfo.removeTaskNameFromMap(wt.toString());
AsyncTaskRunningInfo.removeTaskTimeFromMap(wt.toString());
}
if (task != null) {
AsyncTaskRunningInfo.removeTaskNameFromMap(task.toString());
AsyncTaskRunningInfo.removeTaskTimeFromMap(task.toString());
}
}
@Override
public void execute(Runnable command) {
super.execute(command);
if (command == null)
throw new NullPointerException();
if (command instanceof AsyncTaskWithTag) {
AsyncTaskRunningInfo.addTaskNameToMap(command.toString(), ((AsyncTaskWithTag) command).tagName());
}
AsyncTaskRunningInfo.addTaskTimeToMap(command.toString(), System.currentTimeMillis());
}
}
当自定义的线程池也遇到RejectedExecution 时,可以使用ThreadPoolExecutorWithTag + AsyncTaskWithTag 来实现对应分析
进阶思考
在以上流程中,需要记录对应AsyncTask的信息依赖于修改对应的Task为自定义的AsyncTaskWithTag,其中这里可以使用面向切片的编程技术,通过ASM修改字节码,根据自定义的一种规则(比如类名白名单),把继承于AsyncTask的子类修改为继承AsyncTaskWithTag,把直接创建AsyncTask任务的代码位置修改为创建为AsyncTaskWithTag,这样可以在Gradle编译时自动替换掉AsyncTask(包括第三方库中的),可以更全面的记录到AsyncTask的创建信息和执行耗时。
你可能感兴趣的:(AsyncTask RejectedExecution 排查方案)
element--el-table添加合计后固定列x轴滚动条无法滚动问题
冯浩(grow up)
element element-plus vue.js 前端 javascript
效果图改变固定列滚轮高度问题解决文章解决方案使用到的参数pointer-events属性用来控制一个元素能否响应鼠标操作,常用的关键字有auto和nonepointer-events:none;让一个元素忽略鼠标操作pointer-events:auto;还原浏览器设定的默认行为代码演示添加class添加css样式:deep.tableData{//滚动条高度调整::-webkit-scrollb
2025自动化采集豆瓣选电影20年代以来的推荐数据并进行结构化分析及数据缺失值处理方案
BigWiggins
python 开发语言 单元测试
今天在豆瓣数据中采集20年代以来的电影时遇到了取得电影标题/评分/年份等大量缺失值核心功能动态分页采集:通过API参数迭代获取全量数据反爬策略:请求头模拟、Cookies自动化、随机延迟数据清洗:缺失值填充、嵌套JSON解析持久化存储:JSON结构化存储与PandasDataFrame转换技术栈请求处理:requests库实现API调用数据解析:json模块处理结构化响应异常管理:try-exce
是德科技Keysight N9962A手持式微波频谱分析仪
tan13145876435
科技
是德科技KeysightN9962A手持式微波频谱分析仪N9962A是一款使用电池供电的便携式微波频谱分析仪。其可选配的功能特性包括全频段跟踪发生器和前置放大器、干扰分析仪、时间选通、VSWR、反射、内置功率计和GPS接收机。N9962AFieldFox手持式微波频谱分析仪特性无需预热即可进行准确的频谱分析仪测量(±0.5dB)。10MHz无间隙实时带宽能够捕获间歇性信号。采用便携式解决方案可以表
无人机怎么设定航线_飞行航线设置方法及装置与流程
柯布西耶
无人机怎么设定航线
本发明涉及无人机技术领域,具体而言,涉及一种飞行航线设置方法及装置。背景技术:近年来,无人机航空摄影测量得到了快速发展,与传统的摄影测量技术相比,无人机具有高机动性、高分辨率、低成本、操作灵活等优势,在中小区域测量得到了广泛应用。无人机航空摄影不仅需要高水平飞行技术,还包括高效的航线设计,其方案精度及自动化水平直接影响航摄质量和效益。现阶段无人机航空摄影测量主要采用的是普通的蛇形航线飞行方式进行飞
cv君独家视角 | AI内幕系列十四:【手机、相机防抖大揭秘】数字防抖、鸡头防抖、光学防抖、AI防抖等(附源码+长期更新)
cv君
原创项目级实战项目 cv君独家视角 AI内幕系列 深度学习与计算机视觉精品 人工智能 ai isp 科技 python
目录摘要主要防抖技术手机防抖对比某拇指相机技术分析:1.基础介绍2.功能需求2.1功能背景2.2技术背景与技术选型2.3技术方案2.4可行性落地链路2.5竞品调研与市场分析2.6防抖主客观评价源码实现运动防抖步骤:代码实现性能优化与改进代码改进进一步改进与应用深度学习方法示例实时处理与应用示例运动摄影无人机航拍摄像头防抖设备计算资源需求复杂场景处理参数调整和优化实时处理需求误差累积并行和分布式处理
无人机+自组网:中继通信增强技术详解
无人机技术圈
无人机技术 无人机
无人机与自组网技术的结合,特别是通过中继通信增强技术,为无人机在复杂环境中的通信提供了稳定、高效、可靠的解决方案。以下是对该技术的详细解析:一、无人机自组网技术概述无人机自组网技术是一种利用无人机作为节点,通过无线通信技术实现节点间自主组网、动态路由和数据传输的技术。它具有自组织、自配置、自愈合等特点,能够适应复杂多变的通信环境。在无人机集群中,每个无人机都可以作为终端节点、中继节点或中心节点,实
报错解决——ValueError: row index was 65536, not allowed by .xls format
William.csj
编程语言 python xlwt openpyxl
报错解决——ValueError:rowindexwas65536,notallowedby.xlsformat一、原因分析二、解决方案1、方法一2、方法二一、原因分析xlrd和xlwt是python中用来处理xls文件的函数,其单个sheet限制最大行数为65535,因此,当读写数据量超出时就会出现此错误:ValueError:rowindexwas65536,notallowedby.xlsf
数学建模:评价性模型学习——层次分析法(AHP模型)
美肚鲨ccc
matlab 矩阵 数据分析 算法
目录前言一、流程介绍二、模型实现1.构建层次结构2.构建判断矩阵1.对指标进行赋权2.建立判断矩阵3.层次单排序及一致性检验1、准则层2、方案层4、计算得分三、方法分析总结前言之前在课程作业上简单用过层次分析法,这次再系统性学习一遍,写一篇学习笔记!一、流程介绍构建层次结构构建判断矩阵计算权重、一致性检验计算得分得出结论二、模型实现1.构建层次结构探究以下五个城市的城市旅游竞争力排名:成都、杭州、
完美解决 vscode 连接不了扩展商店问题:We cannot connect to the Exiensions Marketplace at this time
冬阳春晖
编程所遇到的问题 vscode
目录前言(介绍经过和原理,可不看)解决方案参考链接:前言(介绍经过和原理,可不看)我找了一个小时这个问题的解决方案,代理服务器设置问题,问题确实是这个问题(之前有用过梯子的或走过代理的会遗留这个问题,当你用过梯子后微软会识别出来,然后让你访问不了vscode的插件浏览器,microsoftstore等,不过最近microsoftstore好像把这个问题给修复了,看来巨硬公司果然是忠诚于党和国家呀)
TopK问题
K. Bob
大数据
海量数据中寻找TopK问题TopK问题介绍TopK问题举例及解答TopK问题介绍 所谓的TopK问题:在海量数据中找出出现频率最好的前K个数,或者从海量数据中找出最大的前K个数。例如,在搜索引擎中,统计搜索最热门的10个查询词/在歌曲库中统计下载最高的前10首歌等。针对TopK问题,通常方案是分治+Trie树/Hash+小顶堆,即先将数据集按照Hash方法分解成多个小数据集,然后使用Trie树/
【数学模型】层次分析_数学建模层次分析法例题及答案(1)
2401_84181253
程序员 数学建模
|校园景色|0.1|0.2|0.8|经计算:A=0.4*0.6+0.3*0.5+0.2*0.3+0.1*0.2=0.47B=0.53B>A因此最终小坤去了大学B。即打分法解决评价问题时,只需要我们补充完成下面这张表格即可:权重方案1方案2指标1指标2指标3指标4同颜色单元格之和为1。一、层次分析法的例题题目:选择好大学后,坤坤准备在开学前去旅游,他决定在城市A,城市B,城市C中选择一个作为目标地点
【开发问题】解决 web.xml 文件版本导致的 404 错误
工一木子
Servlet servlet 开发问题 404
解决web.xml文件版本导致的404错误在开发基于Servlet的Web应用时,web.xml文件是配置Servlet容器行为的重要配置文件。通常,访问Servlet时出现404错误,可能与web.xml文件的版本不兼容有关。本文将探讨web.xml版本不匹配如何导致404错误,并提供解决方案,帮助大家快速排查并解决这个问题。一、了解web.xml版本与Servlet容器的关系web.xml是J
OenMessage——信息共享平台
IT源码大师
竞赛项目研究实战汇集 人工智能 大数据
引言在信息化时代,数据与知识的共享变得尤为重要。OenMessage作为一款创新的信息共享平台,致力于提供一个高效、安全的环境,促进用户之间的信息交流与协作。无论是在企业内部的团队合作,还是在跨行业的知识传播,OenMessage都能够提供可靠的解决方案。一、OenMessage平台概述OenMessage是一个基于云计算和互联网技术的信息共享平台,旨在通过高效的信息管理和沟通机制,打破信息孤岛,
2024年MySQL 下载、安装及启动停止教程(非常详细),涉及命令行net start mysql80提示发生系统错误5的解决方案
m0_74824002
面试 学习路线 阿里巴巴 mysql 数据库
一、安装包下载官方网址:https://www.mysql.com/MySQL官方提供了两种不同的版本:1.社区版本(MySQLCommunityServer):免费,但MySQL不提供任何技术支持2.商业版本(MySQLEnterpriseEdition):收费,可以使用30天,提供技术支持选择DOWNLOADS向下滑动页面,可找到图2所示内容,可选择商业版本或社区版本进行下载选择自己电脑系统对
企业级智能对话AI助手(一)技术方案设计
power-辰南
大模型算法实战工程 人工智能 NER NLU 自然语言 AI AGENT
一、系统需求分析1.1核心业务场景意图类型业务描述关键实体对接系统OA请假审批员工休假申请处理用户ID、起止日期、请假事由OA系统订单状态查询客户订单跟踪服务订单ID、用户ID订单管理系统库存实时查询商品存货信息展示商品ID、仓库名称WMS系统销售价格查询多渠道价格展示商品ID、销售渠道、用户ID价格中心系统1.2技术指标要求性能要求响应时间95%并发量1000+/sec扩展要求支持动态意图扩展支
Facebook 的隐私保护数据存储方案研究
ClonBrowser
反侦测指纹浏览器 社交媒体 tiktok ClonBrowser 互联网
Facebook的隐私保护数据存储方案研究在这个信息爆炸的时代,数据隐私保护已成为公众关注的热点。Facebook,作为全球最大的社交媒体平台之一,承载着海量用户数据,其隐私保护措施和数据存储方案对于维护用户隐私至关重要。本文将深入探讨Facebook在隐私保护方面的数据存储方案,以及这些方案如何帮助保护用户数据不被滥用。数据加密技术Facebook在数据存储方面采用了先进的加密技术。这意味着用户
MySQL8 忘记密码
学软件的小铃铛
adb
太尴尬了,好久没用MySQL已经忘记了用户密码,那么在Windows环境下遗忘了该怎么办呢?跟着小铃铛来看看。解决方案第一步:首先停止MySQL服务PSD:\program_23\mysql-8.0.33-winx64\bin>netstopmysqlmysql服务正在停止.mysql服务已成功停止。PS:如果不先停止服务,会报错data文件夹被占用,无法修改PSD:\program_23\mys
C 语言异常处理方式全面解析
Kurbaneli
c语言 ubuntu linux
引言在C语言编程领域,稳健的错误处理机制对于保障程序的可靠性、稳定性以及安全性至关重要。异常处理作为错误处理的进阶形式,虽然并非C语言标准库原生支持的特性,但通过巧妙运用语言特性和编程技巧,开发者能够实现有效的异常处理方案,从而提升代码的健壮性与可维护性。C语言传统错误处理方式的局限C语言中,传统的错误处理主要依赖返回值检查与全局错误变量(如errno)。例如,在文件操作中,使用fopen函数打开
大数据运维实战指南:零基础入门与核心技术解析(第一篇)
emmm形成中
大数据 运维
大数据运维实战指南:零基础入门与核心技术解析(第一篇)系列文章目录第一篇:大数据运维概述与核心技能体系第二篇:Hadoop生态体系与集群部署实战第三篇:分布式存储系统运维与优化第四篇:资源调度框架YARN/K8s深度解析第五篇:实时计算框架Flink/Spark运维指南第六篇:大数据监控体系与自动化运维第七篇:云原生时代的大数据运维实践第八篇:数据安全与合规性管理第九篇:性能调优与故障排查案例集第
vue控制台报错Duplicate keys detected: ‘xxxx‘. This may cause an update error.解决方案
October_CanYang
日常报错 elementui vue js css
vue控制台报错Duplicatekeysdetected:‘xxxx’.Thismaycauseanupdateerror.解决方案vue项目中在使用el-tree组件时报了一个这样的错:==Duplicatekeysdetected:'106002.Thismaycauseanupdateerror.==不影响使用,但我个人,不太喜欢报红,也是为了避免能够多学习点东西百度之后说是==v-for
Spring Boot 项目中慢SQL优化方案
冰糖心书房
Spring Boot 2025 Java面试系列 spring boot sql 后端
SpringBoot项目中慢SQL优化是一个重要的性能优化环节。以下是一些常用的慢SQL优化方案,涵盖了从SQL语句本身到数据库配置、应用层优化的多个方面:1.识别慢SQL:慢查询日志(SlowQueryLog):MySQL、PostgreSQL等数据库都提供了慢查询日志功能。开启慢查询日志,设置阈值(例如,超过1秒的查询被认为是慢查询)。分析慢查询日志,找出执行时间较长的SQL语句。MySQL示
Java 中数据脱敏的实现
Code额
Java java 数据脱敏
数据脱敏首先,要思考一个问题,SpringBoot查询到的一条数据是一个Java对象,为什么返回给前端时候,前端拿到的却是JSON格式的数据呢?是因为SpringBoot默认采用了Jackson作为序列化器,而Jackson序列化框架会自动把Java对象转换成JSON格式的数据,然后返回。通过这个思路,就可以得到一个方案,就是在JSON序列化这个层面,去解决这个问题,从而对数据进行脱敏。1.自定义
初学——DFS(深度优先搜索)
g927zz
搜索 深度优先 算法
P2089烤鸡题目背景猪猪Hanke得到了一只鸡。题目描述猪猪Hanke特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke吃鸡很特别,为什么特别呢?因为他有10种配料(芥末、孜然等),每种配料可以放1到3克,任意烤鸡的美味程度为所有配料质量之和。现在,Hanke想要知道,如果给你一个美味程度n,请输出这10种配料的所有搭配方案。输入格式一个正整数n,表示美味程度。输出格式第一行,方案总数。第二行
加州房价数据集加载出错:无法获取数据,HTTP Error : Forbidden
code_welike
http 网络协议 网络 python
加州房价数据集加载出错:无法获取数据,HTTPError:Forbidden在使用Python的sklearn库中,我们可以很方便地获取一些常用的数据集。在加载加州房价数据集时,有时会遇到“HTTPError:Forbidden”的错误提示,导致无法获取数据。这个问题的出现可能是因为我们的IP被限制了。那么该如何解决这个问题呢?解决方案:1.更换IP地址:首先,我们应该排除IP被限制的可能性。可以
如何收集 Kubernetes 集群的日志
沉默的八哥
运维 kubernetes 运维
一、Kubernetes日志收集核心方案1.EFKStack(Elasticsearch+Fluentd+Kibana)•适用场景:企业级日志分析、复杂查询需求、长期日志存储。•组件作用:•Fluentd:日志收集器(部署为DaemonSet,每个Node运行一个实例)。•Elasticsearch:日志存储与索引(支持分布式、高并发)。•Kibana:可视化仪表盘(日志搜索、图表展示)。2.Lo
后台数据报表导出数据量过大问题
FLGB
大数据 业务常见解决方案 java clickhouse 数据导出
现状分析之前在mysql业务库,导出报表会出现各种表相互关联,导致夯死的情况改进使用ClickHouse做宽表后面使用binlog监听,洗数据洗成一张宽表,存放在ck中,但是发现超过一定数量级100w也会很卡慢,但是比mysql强的是可以出来。如何导出300w、500w1000w数据量级查看了CK有个特性,执行流式数据处理,可以使用这个特性来处理方案1:分批查询如果你当前的做法是一次性查询100W
物联网乐鑫USB方案,设备互联和数据传输应用
深圳启明云端科技
乐鑫方案 物联网 智能家居 网络
USBUSB是一种通用的总线标准,用于连接主机和外部设备。乐鑫USB方案为用户提供了方便快捷的设备互联和数据传输方式。乐鑫SoC通过将USB作为标配外设之一,提供USB2.0OTG或USB-Serial-JTAG接口,支持主机(Host)和设备(Device)两种模式,为用户提供了丰富的USB主机方案和USB设备方案。不同系列的芯片支持的USB功能如下图USB2.0OTGESP32-S2/S3等芯
【完整版解决方案】sklearn加州房价数据集出错 housing = fetch_california_housing() HTTPError: HTTP Error 403: Forbidden
getalong
sklearn 人工智能 数据仓库 python
完整解决方案(一键复制)代码替换housing=fetch_california_housing()翻了几条解决方案要么不全,要么收费,烦死个人下面给出完整解决方案!!!1、下载数据集原始数据集:cal_housing.tgz2、放置数据集查找本地位置,执行代码后进入目标文件夹。fromsklearnimportdatasetsdata_home=datasets.get_data_home()放
千亿级高并发短链系统架构设计与Java实战:从原理到代码的完整方案
小诸葛IT课堂
系统架构
一、短链系统的核心挑战场景需求:每天生成1亿+短链单日访问量峰值100亿+平均响应时间maxWorkerId||workerId<0){thrownewIllegalArgumentExcepti
游戏行业科普(一)| 一款游戏的研发具体需要哪些人,附各自分工详情
游戏智眼
游戏
在一个游戏开发组里,策划、程序、美术是三个不可或缺的职能。策划主要负责设计、制定游戏整体的设计方案(世界观、玩法、系统等);美术负责视觉、表现设计(角色、场景、动画、特效等);程序负责技术实现(游戏逻辑、图形表现、开发工具等)、攻关技术问题。此外还有负责质量的测试职能,负责进度的项目管理等职能。游戏完成上线后,还需要发行运营进行宣传推广和玩家服务等工作(部分职能前期就需要介入)。整个项目的一把手一
Algorithm
香水浓
java Algorithm
冒泡排序
public static void sort(Integer[] param) {
for (int i = param.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
int current = param[j];
int next = param[j + 1];
mongoDB 复杂查询表达式
开窍的石头
mongodb
1:count
Pg: db.user.find().count();
统计多少条数据
2:不等于$ne
Pg: db.user.find({_id:{$ne:3}},{name:1,sex:1,_id:0});
查询id不等于3的数据。
3:大于$gt $gte(大于等于)
&n
Jboss Java heap space异常解决方法, jboss OutOfMemoryError : PermGen space
0624chenhong
jvm jboss
转自
http://blog.csdn.net/zou274/article/details/5552630
解决办法:
window->preferences->java->installed jres->edit jre
把default vm arguments 的参数设为-Xms64m -Xmx512m
----------------
文件上传 下载 解析 相对路径
不懂事的小屁孩
文件上传
有点坑吧,弄这么一个简单的东西弄了一天多,身边还有大神指导着,网上各种百度着。
下面总结一下遇到的问题:
文件上传,在页面上传的时候,不要想着去操作绝对路径,浏览器会对客户端的信息进行保护,避免用户信息收到攻击。
在上传图片,或者文件时,使用form表单来操作。
前台通过form表单传输一个流到后台,而不是ajax传递参数到后台,代码如下:
<form action=&
怎么实现qq空间批量点赞
换个号韩国红果果
qq
纯粹为了好玩!!
逻辑很简单
1 打开浏览器console;输入以下代码。
先上添加赞的代码
var tools={};
//添加所有赞
function init(){
document.body.scrollTop=10000;
setTimeout(function(){document.body.scrollTop=0;},2000);//加
判断是否为中文
灵静志远
中文
方法一:
public class Zhidao {
public static void main(String args[]) {
String s = "sdf灭礌 kjl d{';\fdsjlk是";
int n=0;
for(int i=0; i<s.length(); i++) {
n = (int)s.charAt(i);
if((
一个电话面试后总结
a-john
面试
今天,接了一个电话面试,对于还是初学者的我来说,紧张了半天。
面试的问题分了层次,对于一类问题,由简到难。自己觉得回答不好的地方作了一下总结:
在谈到集合类的时候,举几个常用的集合类,想都没想,直接说了list,map。
然后对list和map分别举几个类型:
list方面:ArrayList,LinkedList。在谈到他们的区别时,愣住了
MSSQL中Escape转义的使用
aijuans
MSSQL
IF OBJECT_ID('tempdb..#ABC') is not null
drop table tempdb..#ABC
create table #ABC
(
PATHNAME NVARCHAR(50)
)
insert into #ABC
SELECT N'/ABCDEFGHI'
UNION ALL SELECT N'/ABCDGAFGASASSDFA'
UNION ALL
一个简单的存储过程
asialee
mysql 存储过程 构造数据 批量插入
今天要批量的生成一批测试数据,其中中间有部分数据是变化的,本来想写个程序来生成的,后来想到存储过程就可以搞定,所以随手写了一个,记录在此:
DELIMITER $$
DROP PROCEDURE IF EXISTS inse
annot convert from HomeFragment_1 to Fragment
百合不是茶
android 导包错误
创建了几个类继承Fragment, 需要将创建的类存储在ArrayList<Fragment>中; 出现不能将new 出来的对象放到队列中,原因很简单;
创建类时引入包是:import android.app.Fragment;
创建队列和对象时使用的包是:import android.support.v4.ap
Weblogic10两种修改端口的方法
bijian1013
weblogic 端口号 配置管理 config.xml
一.进入控制台进行修改 1.进入控制台: http://127.0.0.1:7001/console 2.展开左边树菜单 域结构->环境->服务器-->点击AdminServer(管理) &
mysql 操作指令
征客丶
mysql
一、连接mysql
进入 mysql 的安装目录;
$ bin/mysql -p [host IP 如果是登录本地的mysql 可以不写 -p 直接 -u] -u [userName] -p
输入密码,回车,接连;
二、权限操作[如果你很了解mysql数据库后,你可以直接去修改系统表,然后用 mysql> flush privileges; 指令让权限生效]
1、赋权
mys
【Hive一】Hive入门
bit1129
hive
Hive安装与配置
Hive的运行需要依赖于Hadoop,因此需要首先安装Hadoop2.5.2,并且Hive的启动前需要首先启动Hadoop。
Hive安装和配置的步骤
1. 从如下地址下载Hive0.14.0
http://mirror.bit.edu.cn/apache/hive/
2.解压hive,在系统变
ajax 三种提交请求的方法
BlueSkator
Ajax jqery
1、ajax 提交请求
$.ajax({
type:"post",
url : "${ctx}/front/Hotel/getAllHotelByAjax.do",
dataType : "json",
success : function(result) {
try {
for(v
mongodb开发环境下的搭建入门
braveCS
运维
linux下安装mongodb
1)官网下载mongodb-linux-x86_64-rhel62-3.0.4.gz
2)linux 解压
gzip -d mongodb-linux-x86_64-rhel62-3.0.4.gz;
mv mongodb-linux-x86_64-rhel62-3.0.4 mongodb-linux-x86_64-rhel62-
编程之美-最短摘要的生成
bylijinnan
java 数据结构 算法 编程之美
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
public class ShortestAbstract {
/**
* 编程之美 最短摘要的生成
* 扫描过程始终保持一个[pBegin,pEnd]的range,初始化确保[pBegin,pEnd]的ran
json数据解析及typeof
chengxuyuancsdn
js typeof json解析
// json格式
var people='{"authors": [{"firstName": "AAA","lastName": "BBB"},'
+' {"firstName": "CCC&
流程系统设计的层次和目标
comsci
设计模式 数据结构 sql 框架 脚本
流程系统设计的层次和目标
RMAN List和report 命令
daizj
oracle list report rman
LIST 命令
使用RMAN LIST 命令显示有关资料档案库中记录的备份集、代理副本和映像副本的
信息。使用此命令可列出:
• RMAN 资料档案库中状态不是AVAILABLE 的备份和副本
• 可用的且可以用于还原操作的数据文件备份和副本
• 备份集和副本,其中包含指定数据文件列表或指定表空间的备份
• 包含指定名称或范围的所有归档日志备份的备份集和副本
• 由标记、完成时间、可
二叉树:红黑树
dieslrae
二叉树
红黑树是一种自平衡的二叉树,它的查找,插入,删除操作时间复杂度皆为O(logN),不会出现普通二叉搜索树在最差情况时时间复杂度会变为O(N)的问题.
红黑树必须遵循红黑规则,规则如下
1、每个节点不是红就是黑。 2、根总是黑的 &
C语言homework3,7个小题目的代码
dcj3sjt126com
c
1、打印100以内的所有奇数。
# include <stdio.h>
int main(void)
{
int i;
for (i=1; i<=100; i++)
{
if (i%2 != 0)
printf("%d ", i);
}
return 0;
}
2、从键盘上输入10个整数,
自定义按钮, 图片在上, 文字在下, 居中显示
dcj3sjt126com
自定义
#import <UIKit/UIKit.h>
@interface MyButton : UIButton
-(void)setFrame:(CGRect)frame ImageName:(NSString*)imageName Target:(id)target Action:(SEL)action Title:(NSString*)title Font:(CGFloa
MySQL查询语句练习题,测试足够用了
flyvszhb
sql mysql
http://blog.sina.com.cn/s/blog_767d65530101861c.html
1.创建student和score表
CREATE TABLE student (
id INT(10) NOT NULL UNIQUE PRIMARY KEY ,
name VARCHAR
转:MyBatis Generator 详解
happyqing
mybatis
MyBatis Generator 详解
http://blog.csdn.net/isea533/article/details/42102297
MyBatis Generator详解
http://git.oschina.net/free/Mybatis_Utils/blob/master/MybatisGeneator/MybatisGeneator.
让程序员少走弯路的14个忠告
jingjing0907
工作 计划 学习
无论是谁,在刚进入某个领域之时,有再大的雄心壮志也敌不过眼前的迷茫:不知道应该怎么做,不知道应该做什么。下面是一名软件开发人员所学到的经验,希望能对大家有所帮助
1.不要害怕在工作中学习。
只要有电脑,就可以通过电子阅读器阅读报纸和大多数书籍。如果你只是做好自己的本职工作以及分配的任务,那是学不到很多东西的。如果你盲目地要求更多的工作,也是不可能提升自己的。放
nginx和NetScaler区别
流浪鱼
nginx
NetScaler是一个完整的包含操作系统和应用交付功能的产品,Nginx并不包含操作系统,在处理连接方面,需要依赖于操作系统,所以在并发连接数方面和防DoS攻击方面,Nginx不具备优势。
2.易用性方面差别也比较大。Nginx对管理员的水平要求比较高,参数比较多,不确定性给运营带来隐患。在NetScaler常见的配置如健康检查,HA等,在Nginx上的配置的实现相对复杂。
3.策略灵活度方
第11章 动画效果(下)
onestopweb
动画
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
FAQ - SAP BW BO roadmap
blueoxygen
BO BW
http://www.sdn.sap.com/irj/boc/business-objects-for-sap-faq
Besides, I care that how to integrate tightly.
By the way, for BW consultants, please just focus on Query Designer which i
关于java堆内存溢出的几种情况
tomcat_oracle
java jvm jdk thread
【情况一】:
java.lang.OutOfMemoryError: Java heap space:这种是java堆内存不够,一个原因是真不够,另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配置来解决: <jvm-arg>-Xms3062m</jvm-arg> <jvm-arg>-Xmx
Manifest.permission_group权限组
阿尔萨斯
Permission
结构
继承关系
public static final class Manifest.permission_group extends Object
java.lang.Object
android. Manifest.permission_group 常量
ACCOUNTS 直接通过统计管理器访问管理的统计
COST_MONEY可以用来让用户花钱但不需要通过与他们直接牵涉的权限
D