大纲
内存抖动和内存泄漏
内存大户,Bitmap内存优化
Profile内存检测工具
Mat大对象与泄漏检测
【内存抖动和内存泄漏】
Out Of Memory(内存溢出)
翻译中文就是内存用完了 ,当JVM因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个error,此时称之为溢出。(注:非exception,因为这个问题已经严重到不足以被应用处理)。
为什么会OOM?
分配的少了 :比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少。
应用用的太多 :并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出。
在Java语言中,由于存在了垃圾自动回收机制,所以,我们一般不用去主动释放不用的对象所占的内存,也就是理论上来说,是不会存在“内存泄露”的。但是,如果编码不当,比如,将某个对象的引用放到了全局的Map中,虽然方法结束了,但是由于垃圾回收器会根据对象的引用情况来回收内存,导致该对象不能被及时的回收。如果该种情况出现次数多了,就会导致内存溢出,比如系统中经常使用的缓存机制。Java中的内存泄露,不同于C++中的忘了delete,往往是逻辑上的原因泄露。
OOM的类型?
JVM内存模型?
按照JVM规范,JAVA虚拟机在运行时会管理以下的内存区域:
程序计数器 :当前线程执行的字节码的行号指示器,线程私有
JAVA虚拟机栈 :Java方法执行的内存模型,每个Java方法的执行对应着一个栈帧的进栈和出栈的操作。
本地方法栈 :类似“ JAVA虚拟机栈 ”,但是为native方法的运行提供内存环境。
JAVA堆 :对象内存分配的地方,内存垃圾回收的主要区域,所有线程共享。可分为新生代,老生代。
方法区 :用于存储已经被JVM加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。Hotspot中的“永久代”。
运行时常量池 :方法区的一部分,存储常量信息,如各种字面量、符号引用等。
直接内存 :并不是JVM运行时数据区的一部分, 可直接访问的内存, 比如NIO会用到这部分。 按照JVM规范,除了程序计数器不会抛出OOM外,其他各个内存区域都可能会抛出OOM。
最常见的OOM情况有以下三种:
java.lang.OutOfMemoryError: Java heap space java堆内存溢出,此种情况最常见,一般由于内存泄露或者堆的大小设置不当引起。对于内存泄露,需要通过内存监控软件查找程序中的泄露代码,而堆大小可以通过虚拟机参数-Xms,-Xmx等修改。
java.lang.OutOfMemoryError: PermGen space java永久代溢出,即方法区溢出了,一般出现于大量Class或者jsp页面,或者采用cglib等反射机制的情况,因为上述情况会产生大量的Class信息存储于方法区。此种情况可以通过更改方法区的大小来解决,使用类似-XX:PermSize=64m -XX:MaxPermSize=256m的形式修改。另外,过多的常量尤其是字符串也会导致方法区溢出。
java.lang.StackOverflowError 不会抛OOM error,但也是比较常见的Java内存溢出。JAVA虚拟机栈溢出,一般是由于程序中存在死循环或者深度递归调用造成的,栈大小设置太小也会出现此种溢出。可以通过虚拟机参数-Xss来设置栈的大小。
内存抖动
短时间内大量的对象被创建,导致可用内存不足,从而引起频繁gc回收对象,这种已用内存忽高忽低的现象就叫内存抖动。由于gc的过程会 “stop the world” 停止其他的一切工作,gc太频繁无疑会造成界面卡顿,而且gc回收后可能会产生内存碎片,如果这时其他线程需要申请大块内存还有可能发生OOM,所以内存抖动的情况必须要避免。
什么情况会出现内存抖动呢?
for循环内使用了+进行字符串拼接
这是很常见的字符串拼接操作,通过查看字节码文件可以看出+的拼接字符串实际上是创建StringBuilder对象进行拼接,这样就会出现大量创建对象频繁GC,导致内存抖动。
内存抖动一定是锯齿状吗?
看下面一个实例,实现IOS小菊花的功能
public class IOSStyleLoadingView extends View {
private Context mContext;
private float mStrokeWidth;
private float northwestXStart = 264.57f;
private float northwestYStart = 264.71f;
private float northwestXEnd = 193.72f;
private float northwestYEnd = 194.14f;
private float northXStart = 300;
private float northYStart = 250;
private float northXEnd = 300;
private float northYEnd = 150;
private float notheastXStart = 335.25f;
private float notheastYStart = 264.54f;
private float notheastXEnd = 405.76f;
private float notheastYEnd = 193.63f;
private float eastXStart = 350;
private float eastYStart = 300f;
private float eastXEnd = 450;
private float eastYEnd = 300;
private float southeastXStart = 335.36f;
private float southeastYStart = 335.34f;
private float southeastXEnd = 406.10f;
private float southeastYEnd = 406.02f;
private float southXStart = 300.03f;
private float southYStart = 345f;
private float southXEnd = 300;
private float southYEnd = 450;
private float southwestXStart = 264.68f;
private float southwestYStart = 335.39f;
private float southwestXEnd = 194.06f;
private float southwestYEnd = 406.19f;
private float westXStart = 250;
private float westYStart = 300;
private float westXEnd = 150;
private float westYEnd = 300;
String colorStr[] = new String[]{
"#ffff00",
"#ff3300",
"#ccff00",
"#ff00cc",
"#ccffff",
"#cc99ff",
"#99ff66",
"#993300"
};
private ValueAnimator valueAnimator;
private int currentColor = 0;
public IOSStyleLoadingView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
this.mStrokeWidth = UIUtils.dp2px(this.mContext, 5);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Sample test1=new Sample("测试1");
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(this.mStrokeWidth);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeCap(Paint.Cap.ROUND);
Path p0 = new Path();
paint.setColor(Color.parseColor(colorStr[0]));
p0.moveTo(northwestXStart, northwestYStart);
p0.lineTo(northwestXEnd, northwestYEnd);
canvas.drawPath(p0, paint);
Path p1 = new Path();
paint.setColor(Color.parseColor(colorStr[1]));
p1.moveTo(northXStart, northYStart);
p1.lineTo(northXEnd, northYEnd);
canvas.drawPath(p1, paint);
Path p2 = new Path();
paint.setColor(Color.parseColor(colorStr[2]));
p2.moveTo(notheastXStart, notheastYStart);
p2.lineTo(notheastXEnd, notheastYEnd);
canvas.drawPath(p2, paint);
Path p3 = new Path();
paint.setColor(Color.parseColor(colorStr[3]));
p3.moveTo(eastXStart, eastYStart);
p3.lineTo(eastXEnd, eastYEnd);
canvas.drawPath(p3, paint);
Path p4 = new Path();
paint.setColor(Color.parseColor(colorStr[4]));
p4.moveTo(southeastXStart, southeastYStart);
p4.lineTo(southeastXEnd, southeastYEnd);
canvas.drawPath(p4, paint);
Path p5 = new Path();
paint.setColor(Color.parseColor(colorStr[5]));
p5.moveTo(southXStart, southYStart);
p5.lineTo(southXEnd, southYEnd);
canvas.drawPath(p5, paint);
Path p6 = new Path();
paint.setColor(Color.parseColor(colorStr[6]));
p6.moveTo(southwestXStart, southwestYStart);
p6.lineTo(southwestXEnd, southwestYEnd);
canvas.drawPath(p6, paint);
Path p7 = new Path();
paint.setColor(Color.parseColor(colorStr[7]));
p7.moveTo(westXStart, westYStart);
p7.lineTo(westXEnd, westYEnd);
canvas.drawPath(p7, paint);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
startAnimation();
}
public void startAnimation() {
valueAnimator = ValueAnimator.ofInt(7, 0);
valueAnimator.setDuration(400);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if ((int) animation.getAnimatedValue() != currentColor){
String b[] = new String[colorStr.length];
for (int c = 0, size = colorStr.length - 1; c < size; c++) {
b[c + 1] = colorStr[c];
}
b[0] = colorStr[colorStr.length - 1];
colorStr = b;
invalidate();
currentColor = (int) animation.getAnimatedValue();
}
}
});
valueAnimator.start();
}
}
内存分配
这是一个看起来相对平滑的内存走势图,但是也能看出内存一直在增加,不知道为什么我的内存分配Allocations一直为0,希望看到的小伙伴留言解答一下。 上面的代码有三个问题:
1、不断创建String对象,如下代码
paint.setColor(Color.parseColor(color[0]));
点击进去看源码:
public static int parseColor(@Size(min=1) String colorString) {
if (colorString.charAt(0) == '#') {
// Use a long to avoid rollovers on #ffXXXXXX
// 这里调用了String类的substring方法
long color = Long.parseLong(colorString.substring(1), 16);
if (colorString.length() == 7) {
// Set the alpha value
color |= 0x00000000ff000000;
} else if (colorString.length() != 9) {
throw new IllegalArgumentException("Unknown color");
}
return (int)color;
} else {
Integer color = sColorNameMap.get(colorString.toLowerCase(Locale.ROOT));
if (color != null) {
return color;
}
}
throw new IllegalArgumentException("Unknown color");
}
原来这里调用了String类的substring方法,我们都知道String类是不可变类,每一个字符串对应一个String对象,每次调用substring方法截取字符串就要新建一个String对象来接收截取后的值,所以我们选中的String对象就来自这里。 代码修改如下:
int[] colorInt = new int[colorStr.length];
// 构造方法中初始化
for (int i = 0; i < colorStr.length; i++) {
colorInt[i] = Color.parseColor(colorStr[i]);
}
2、不能再onDraw中创建对象
Path mPath = new Path();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 把Paint、Path的创建移出去
mPath.reset();
paint.setColor(colorInt[(currentColor++)%8]);
mPath.moveTo(northwestXStart, northwestYStart);
mPath.lineTo(northwestXEnd, northwestYEnd);
canvas.drawPath(mPath, paint);
}
3、属性动画的addUpdateListener监听中不断创建数组
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
if ((int) animation.getAnimatedValue() != currentColor){
// 记录每次回调的int值,去改变颜色的角标
currentColor = (int) animation.getAnimatedValue();
invalidate();
}
}
});
通过修改,内存非常稳定,没有了大量对象的创建。那我们来看一下是否有内存泄漏的问题呢? 使用Profiler工具dump一下,查看内存分配的具体信息,在使用MAT工具查看明细。
查看Activity是否有强引用
可以看到我们刚刚的自定义菊花Activity退出后一直存在强引用,造成内存泄漏。Activity的Context一直被自定义控件持有,再往上看IOSStyleLoadingView
又IOSStyleLoadingView$1
内部类持有。
引用关系
注意: 动画一直要记得停止
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
if (valueAnimator != null){
valueAnimator.removeAllUpdateListeners();
valueAnimator.cancel();
}
}
总结:
软引用与弱引用区别?
/**
* 软引用
*/
Object softObject = new Object();
SoftReference objectSoftReference = new SoftReference<>(softObject);
softObject = null;
System.gc();
System.out.println("sort:"+objectSoftReference.get());
/**
* 弱引用(结果为null,只要被GC扫到就会被回收)
*/
Object weakObject = new Object();
WeakReference objectWeakReference = new WeakReference<>(weakObject);
weakObject = null;
System.gc();
System.out.println("weak:"+objectWeakReference.get());
你可能感兴趣的:(内存优化(三):Profile内存检测工具)
C#编程的技术难点有什么
编程
在C#编程的过程中,开发者会面临许多技术难点,尤其是在深入理解和应用C#的高级特性时。C#编程的技术难点主要体现在内存管理、并发编程、反射机制、LINQ(语言集成查询)、以及异步编程等方面。这些难点往往需要开发者对C#的底层原理和高级功能有较为深入的理解,并且在实际项目中逐步积累经验。其中,异步编程与并发编程是C#开发中常见且具挑战性的难点,特别是在多线程和任务并行的处理上,需要合理运用相关的工具
JavaScript设计模式 -- 适配器模式
鎈卟誃筅甡
javascript 设计模式 适配器模式
在软件开发中,经常会遇到这样的情况:现有的类或第三方库提供的接口与系统中期望的接口不匹配。如果直接修改已有代码风险较大或者不可行,这时适配器模式(AdapterPattern)就能派上用场。适配器模式通过创建一个包装类,将原有接口转换为客户所期望的接口,从而使原本不兼容的类能够协同工作。本文将从基本概念入手,详细介绍适配器模式的实现方式及其在多个场景下的应用示例,并探讨其优缺点和使用建议。适配器模
实现Shell免密登录的详细指南
醉心编码
脚本基础 shell 脚本
实现Shell免密登录的详细指南前提条件步骤一:生成SSH密钥对步骤二:将公钥复制到远程服务器步骤三:配置SSH客户端(可选)步骤四:测试免密登录常见问题排查在使用Linux或Unix系统时,我们经常需要通过Shell访问远程服务器。通常,这种访问需要通过SSH(SecureShell)进行,每次连接时都需要输入用户名和密码,这不仅繁琐,而且在某些自动化场景下显得尤为不便。为了实现免密登录,我们可
如何学习ARM嵌入式系统的设计
AAAA%
学习 嵌入式硬件 单片机
学习ARM嵌入式系统设计是一个系统性的过程,需要理论知识与实践技能相结合。以下是一份详细的学习路径指南,帮助你逐步掌握ARM嵌入式系统的设计:1.基础知识储备了解计算机体系结构:学习计算机组成原理,了解CPU、内存、IO等基本概念。学习C语言编程:C语言是嵌入式系统开发的主流语言,需要熟练掌握。理解操作系统原理:虽然嵌入式系统可能不总是运行完整的操作系统,但了解操作系统的基本概念对于理解系统设计至
Java笔记——Java的三大体系架构:深入剖析Java的三大体系架构
啊健的影子
java 笔记 架构
Java的三大体系架构概述JavaSEJavaSE的主要特点和应用场景JavaSE中的核心API和功能JavaSE的优缺点JavaSE的主要特点和应用场景JavaSE中的核心API和功能JavaSE的优缺点JavaEEJavaEE的主要特点和应用场景JavaEE中的核心API和功能JavaEE的优缺点JavaEE的主要特点和应用场景JavaEE中的核心API和功能JavaEE的优缺点JavaMEJ
水务+AI应用探索(一)| FastGPT+DeepSeek 本地部署
LLM.
人工智能 LLM 清华大学 deepseek 程序员 fastgpt 本地化部署
在当下的科技浪潮中,AI无疑是最炙手可热的焦点之一,其强大的能力催生出了丰富多样的应用场景,广泛渗透到各个行业领域。对于水务行业而言,AI的潜力同样不可估量。为了深入探究AI在水务领域的实际应用成效,切实掌握与之相关的前沿应用技术,我们积极开展了AI在水务业务应用方面的实践工作,力求为行业发展带来新的突破与变革。一deepseek的本地化部署二搭建企业知识库应用三AI应用实践:工单地址信息识别四A
解决“400 Bad RequestThe plain HTTP request was sent to HTTPS portnginx/1.23.1”
zzyh123456
http https 网络协议
目录一、问题描述二、问题解决三、问题原因(1)问题成因(2)那为什么访问其他网站的时候,其不会出错呢?而且自己会用https协议?一、问题描述在浏览器直接输入:“www.51969.com:8443”后,报错400BadRequestTheplainHTTPrequestwassenttoHTTPSportnginx/1.23.1二、问题解决在浏览器直接输入:“https://www.naquan
APP开发实战130-APP三方服务介绍
xjbclz
Android-综合 APP开发实战
32三方服务介绍在开发APP的时候,有许多服务功能可以集成三方SDK实现,以下是一些常用的SDK:数据分析:腾讯MTA、友盟、阿里云消息推送:极光、个推、友盟、小米、华为、阿里云阿里云的推送里集成了小米和华为的推送服务,建议推送选择阿里云,这样不用自己集成小米和华为的推送服务。IM:环信、融云、极光位置服务:高德、百度高德的导航功能比百度好,尤其在一些小地方性能监测:OneAPM、听云、透视宝、博
51-31 CVPR’24 | VastGaussian,3D高斯大型场景重建
深圳季连AIgraphX
aiXpilot 智驾大模型1 自动驾驶 智慧城市 AIGC 计算机视觉 数据挖掘
2024年2月,清华大学、华为和中科院联合发布的VastGaussian模型,实现了基于3DGaussianSplatting进行大型场景高保真重建和实时渲染。Abstract现有基于NeRF大型场景重建方法,往往在视觉质量和渲染速度方面存在局限性。虽然最近3DGaussiansSpltting在小规模和以对象为中心的场景中效果很好,但由于视频内存有限、优化时间长、外观变化明显,将其扩展到大型场景
Redis 主从复制的原理详解
海里真的有鱼
redis 数据库 缓存
引言Redis作为一种高性能的内存数据库,广泛应用于高并发、低延迟的场景中。然而,单机版的Redis存在一定的局限性,尤其是在高可用性和负载均衡方面。为了应对这些挑战,Redis提供了主从复制(Replication)机制,使得一个Redis实例(主节点)可以将数据同步到其他多个实例(从节点)。主从复制是Redis集群高可用架构的基础,它不仅提高了系统的可用性,还为读写分离、数据备份等场景提供了支
Elasticsearch 技术分享
chao_dev
大数据 elasticsearch
Elasticsearch技术分享文章目录Elasticsearch技术分享一,Elasticsearch基础介绍1.简介2.kibana3.基本概念4.索引的应用二,Elasticsearch聚合查询1.聚合的概念2.Metric(指标)聚合3.Bucket(桶)聚合4.Pipeline(管道)聚合5.Matrix(矩阵)聚合6.总结三,Elasticsearch索引别名Aliases1.业务问
CVPR2023 Highlight | ECON:最新单图穿衣人三维重建SOTA算法
3D视觉工坊
3D视觉从入门到精通 算法 SLAM 自动驾驶 3D视觉
作者:宁了个宁|来源:计算机视觉工坊在公众号「3D视觉工坊」后台,回复「原论文」可获取论文pdf。添加微信:dddvisiona,备注:三维重建,拉你入群。文末附行业细分群。图1所示。从彩色图像进行人体数字化。ECON结合了自由形式隐式表示的最佳方面,以及明确的拟人化正则化,以推断高保真度的3D人类,即使是宽松的衣服或具有挑战性的姿势。0.笔者个人体会这篇文章讨论了单图像的穿着人类重建问题。隐式方
从 size_t 到面试官的微笑:我的 C++ 面试历险记
Vitalia
C/C++ # 面试经验 c++ 面试 C
面试复盘之前面试遇到一些很好玩的事情,也学到了很多知识,积累了很多经验。某中厂面试的虚拟表演的第三轮:有一道题我用了经典for循环,大概这样:vectorarr={0,1,2);for(inti=0;i=0;i--){//xxxxxxxx}然后就搞笑了,超时,循环退不出来了。我一拍脑门,size_t是无符号类型诶,赶紧改成int,然后美滋滋。面试官一脸冷漠看完全程,说:我不会C++,也不知道你说的
《Ollama 与 DeepSeek 整合应用入门指南》一、二、三章
Allen-Steven
ollama deepseek
第一章:工具概述与核心价值1.1Ollama技术解析本地化部署优势:无需网络连接的数据隐私保护跨平台架构设计:支持Windows/macOS/Linux全平台模型管理引擎:自动化处理模型依赖与版本控制1.2DeepSeek模型特性多模态处理能力:文本生成、代码理解、数学推理中文优化架构:针对中文语料的特殊训练策略模型家族图谱:从1.3B到67B的参数规模选择1.3技术整合价值本地智能计算:企业数据
C语言-note004
CSDNy666999
c语言 开发语言
1.内存函数1-1memcpy内存拷贝memcpy(参数1【目的】,参数2【源】,参数3【无符号整型】)memcpy函数不能用来处理重叠的内存空间的数据拷贝使用memmove实现重叠内存空间的数据拷贝void*memcpy(void*dest,constvoid*src,size_tnum){}void*:通用类型指针1-2memmove内存拷贝分两种情况拷贝:(1)从前向后拷贝destsrc示例
交换机三层转发原理(涵盖ARP,ICMP,IP协议)
一名嵌入式糕手
tcp/ip 服务器 linux
ARP(地址解析协议)ARP是一种将IP地址转换为MAC地址的协议,工作在OSI模型的链路层,ARP主要用于局域网中,当一个主机需要与同一网络中的另一台主机通信时,它首先会使用ARP来获取目标主机的MAC地址,ARP报文由源,目MAC,载荷组成,载荷包含源IP和目的IP,ARP请求是一个广播帧,目标主机收到报文后会解析载荷内容,如果目的IP与自身IP匹配,会返回ARP响应,为一个单播帧,为了提高效
【Linux探索学习】第二十九弹——线程概念:Linux线程的基本概念与线程控制详解
GG Bond.ฺ
Linux探索学习 linux 学习 算法 运维
Linux学习笔记:https://blog.csdn.net/2301_80220607/category_12805278.html?spm=1001.2014.3001.5482前言:在现代操作系统中,线程是程序执行流的最小单元。与进程相比,线程更加轻量级,创建和销毁的开销更小,且线程之间可以共享内存空间,因此在多任务处理、并发编程中,线程的使用非常广泛。Linux作为一个多用户、多任务的操
【蓝桥杯集训·每日一题2025】 AcWing 6122. 农夫约翰的奶酪块 python
查理零世
蓝桥杯 python 算法
Week12月17日农夫约翰的奶酪块农夫约翰有一块立方体形状的奶酪,它位于三维坐标空间中,从(0,0,0)(0,0,0)(0,0,0)延伸至(N,N,N)(N,N,N)(N,N,N)。农夫约翰将对他的奶酪块执行一系列QQQ次更新操作。对于每次更新操作,农夫约翰将从整数坐标(x,y,z)(x,y,z)(x,y,z)到(x+1,y+1,z+1)(x+1,y+1,z+1)(x+1,y+1,z+1)处切割
【微服务】springboot 构建docker镜像多模式使用详解
小码农叔叔
linux与容器实战 springboot相关 spring boot 微服务 java
目录一、前言二、微服务常用的镜像构建方案3.1使用Dockerfile3.2使用dockerplugin插件3.3使用dockercompose编排文件三、环境准备3.1服务器3.2安装JDK环境3.2.1创建目录3.2.2下载安装包3.2.3配置环境变量2.2.4查看java版本3.3安装maven3.3.1下载maven安装包并解压3.3.2配置setting文件3.3.3配置maven的环境
2012年下半年软件设计师上午题知识点及其详细解释(附真题及答案解析)
xiaohiiii
软件设计师 服务器 数据库 运维 软件工程 计算机网络 职场和发展
以下是2012年下半年软件设计师上午题的所有题目(从第1题到第75题)的总结,按顺序列出每道题目的考察知识点及其详细解释,供考生背诵记忆:1.控制器知识点:CPU的组成与功能解释:控制器负责指令的执行和异常事件的处理。它从内存中读取指令,解码并执行指令,同时处理中断和异常。控制器是CPU的核心部件之一。2.循环冗余校验码(CRC)知识点:数据校验解释:CRC是一种错误检测码,用于检测数据传输中的错
23种设计模式-装饰器(Decorator)设计模式
萨达大
软考中级-软件设计师 设计模式 java C++ 结构型设计模式 软考 软件设计师 装饰器模式
文章目录一.什么是装饰器设计模式?二.装饰器模式的特点三.装饰器模式的结构四.装饰器模式的优缺点五.装饰器模式的C++实现六.装饰器模式的Java实现七.代码解析八.总结类图:装饰器设计模式类图一.什么是装饰器设计模式? 装饰器模式(DecoratorPattern)是一种结构型设计模式。它允许在运行时动态地为对象添加新的功能,而无需修改其代码。装饰器模式通过将对象嵌套在装饰器对象中,实现了功能的
Python中NameError:全局名称未定义详解
傻啦嘿哟
关于python那些事儿 python 开发语言
目录一、什么是NameError二、全局名称未定义的原因三、案例分析与解决案例1:变量未声明案例2:拼写错误案例3:作用域问题案例4:导入问题四、实践与建议五、总结在Python编程中,NameError是一种常见的异常类型,它通常表明你试图使用一个未被定义的变量名。对于新手来说,理解NameError的原因和解决方法是提升编程技能的重要一环。本文将深入探讨Python中NameError:glo
CSDN宣布C知道产品接入DeepSeek R1满血版大模型,文心一言、星火认知模型
周杰伦_Jay
大模型LLMs 热点事件 文心一言 人工智能 leetcode 目标检测 机器学习 自然语言处理 生成对抗网络
文章目录前言一、产品升级与模式革新二、技术整合与大模型应用三、深度思考模式的核心优势四、应用场景与用户受益五、未来发展与技术创新前言亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的动力,谢谢大家!有问题请私信或联系邮箱:fn_kobe@163.com一、产品升级与模式革新CSDN宣布C知道产品接入DeepSeek大模型。通过植入“深度思考模式”,全面升级AI
腾讯云大模型知识引擎×DeepSeek赋能文旅
繁依Fanyi
python
腾讯云大模型知识引擎×DeepSeek赋能文旅——以合肥文旅为例的技术革新与实践路径一、技术底座:知识引擎与DeepSeek的融合逻辑腾讯云大模型知识引擎与DeepSeek模型的结合,本质上是**“知识库+检索增强生成(RAG)+实时联网能力”**的技术框架升级。通过三步调用API接口,开发者可快速搭建基于DeepSeek的文旅智能应用。其核心优势包括:动态知识更新:突破传统大模型预训练数据的时间
初阶c语言(函数练习)
不灭锦鲤
c语言 算法 数据结构
目录第一题,写一个函数来判断是否是闰年最终代码第二题,写一个函数,实现一个整形有序数组的二分查找。实现代码第三题,写一个函数,每调用这个函数,这个值都会加一实现代码前言:对应b站鹏哥视频41集内容:第一题,写一个函数来判断是否是闰年其实我都是跟着老师写的,然后整理下思路就是说,首先知道什么是闰年,就是可以被4整除,不能被100整除,如果他能直接被400整除也算闰年然后就是注意ifelse语句,如果
免登录H5快手商城系统/抖音小店商城全开源运营版本
云深不知处㊣
源码专区 免登录商城源码
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍最近因为直播需要然后在互站花500买了一套仿抖音的商城系统,感觉确实还可以,反正都买了所以就分享给有需要的人以下是互站那边的网站介绍可以了看一下,还是很不错的1、无需登录直接可以购买商品2、独立后台支持分站3、修复已知问题完美运营4、支持对接第三方支付:易支付、码支付、虎皮椒等。二、效果展示1.部分代码代码如下(
有趣幽默彩虹屁文案生成工具微信小程序源码
云深不知处㊣
源码专区 微信小程序 文案小程序源码
内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍有趣幽默彩虹屁文案生成工具小程序源码此文案小程序主要功能为分享各种有趣幽默的文案免服务器免域名,源码只提供彩虹屁,朋友圈,毒鸡汤API接口,其他需自行查找替代小程序拥有复制收藏功能,可自行体验,设置流量主可自行查看代码进行更换id二、效果展示1.部分代码代码如下(示例):">¥已售:2.效果图展示三、学习资料下载
Windows线程同步—Critical_Section(临界区)深度解析与实战指南
和舒貌
windows c++ 网络 信息与通信 后端
C++Critical_Section深度解析与实战指南一、线程同步的必要性在多线程编程中,当多个线程访问共享资源时(如全局变量、文件、内存区域等),会出现竞态条件(RaceCondition)。例如两个线程同时对同一个变量进行累加操作,可能导致结果不符合预期:线程A共享变量x=0线程B读取x=0读取x=0计算x+1=1计算x+1=1写入x=1写入x=1线程A共享变量x=0线程B关键问题分析:线程
python实例2.2:编写一个装饰器,计算任何一个函数执行的时间(详解及其知识点拓展)
清风 001
python学习付费专栏 python
目录一、编写一个装饰器,计算任何一个函数执行的时间二、装饰器详解,及其用法举例三、举例说明装饰器在日志记录方面的应用四、装饰器还可以用于哪些方面?五、装饰器工厂一、编写一个装饰器,计算任何一个函数执行的时间装饰器是一种非常方便的设计模式,它可以用来修改或增强函数的行为,而无需直接修改函数的定义。下面是一个简单的Python装饰器,用来计算任意一个函数执行所需的时间:pythonimporttime
HTML之JavaScript DOM(document)编程处理事件
录大大i
前端 HTML JavaScript javascript html 前端
HTML之JavaScriptDOM(document)编程处理事件Document/*事件:本质是行为,用户的行为或者浏览器的行为;事件发生指的是处罚js函数执行事件的三要素:事件源、事件、事件处理程序事件的绑定:1.通过元素的属性绑定on***2.通过DOM编程动态绑定注:1.一个事件可以绑定多个函数;eg:onclick="show(),show1()2.一个元素可以绑定多个事件eg:onc
插入表主键冲突做更新
a-john
有以下场景:
用户下了一个订单,订单内的内容较多,且来自多表,首次下单的时候,内容可能会不全(部分内容不是必须,出现有些表根本就没有没有该订单的值)。在以后更改订单时,有些内容会更改,有些内容会新增。
问题:
如果在sql语句中执行update操作,在没有数据的表中会出错。如果在逻辑代码中先做查询,查询结果有做更新,没有做插入,这样会将代码复杂化。
解决:
mysql中提供了一个sql语
Android xml资源文件中@、@android:type、@*、?、@+含义和区别
Cb123456
@+ @ ? @*
一.@代表引用资源
1.引用自定义资源。格式:@[package:]type/name
android:text="@string/hello"
2.引用系统资源。格式:@android:type/name
android:textColor="@android:color/opaque_red"
数据结构的基本介绍
天子之骄
数据结构 散列表 树、图 线性结构 价格标签
数据结构的基本介绍
数据结构就是数据的组织形式,用一种提前设计好的框架去存取数据,以便更方便,高效的对数据进行增删查改。正确选择合适的数据结构,对软件程序的高效执行的影响作用不亚于算法的设计。此外,在计算机系统中数据结构的作用也是非同小可。例如常常在编程语言中听到的栈,堆等,就是经典的数据结构。
经典的数据结构大致如下:
一:线性数据结构
(1):列表
a
通过二维码开放平台的API快速生成二维码
一炮送你回车库
api
现在很多网站都有通过扫二维码用手机连接的功能,联图网(http://www.liantu.com/pingtai/)的二维码开放平台开放了一个生成二维码图片的Api,挺方便使用的。闲着无聊,写了个前台快速生成二维码的方法。
html代码如下:(二维码将生成在这div下)
? 1
&nbs
ImageIO读取一张图片改变大小
3213213333332132
java IO image BufferedImage
package com.demo;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @Description 读取一张图片改变大小
* @author FuJianyon
myeclipse集成svn(一针见血)
7454103
eclipse SVN MyEclipse
&n
装箱与拆箱----autoboxing和unboxing
darkranger
J2SE
4.2 自动装箱和拆箱
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
4.2.1 autoboxing和unboxing
在Java中,所有要处理的东西几乎都是对象(Object)
ajax传统的方式制作ajax
aijuans
Ajax
//这是前台的代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+
只用jre的eclipse是怎么编译java源文件的?
avords
java eclipse jdk tomcat
eclipse只需要jre就可以运行开发java程序了,也能自动 编译java源代码,但是jre不是java的运行环境么,难道jre中也带有编译工具? 还是eclipse自己实现的?谁能给解释一下呢问题补充:假设系统中没有安装jdk or jre,只在eclipse的目录中有一个jre,那么eclipse会采用该jre,问题是eclipse照样可以编译java源文件,为什么呢?
&nb
前端模块化
bee1314
模块化
背景: 前端JavaScript模块化,其实已经不是什么新鲜事了。但是很多的项目还没有真正的使用起来,还处于刀耕火种的野蛮生长阶段。 JavaScript一直缺乏有效的包管理机制,造成了大量的全局变量,大量的方法冲突。我们多么渴望有天能像Java(import),Python (import),Ruby(require)那样写代码。在没有包管理机制的年代,我们是怎么避免所
处理百万级以上的数据处理
bijian1013
oracle sql 数据库 大数据 查询
一.处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 o
mac 卸载 java 1.7 或更高版本
征客丶
java OS
卸载 java 1.7 或更高
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
成功执行此命令后,还可以执行 java 与 javac 命令
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
成功执行此命令后,还可以执行 java
【Spark六十一】Spark Streaming结合Flume、Kafka进行日志分析
bit1129
Stream
第一步,Flume和Kakfa对接,Flume抓取日志,写到Kafka中
第二部,Spark Streaming读取Kafka中的数据,进行实时分析
本文首先使用Kakfa自带的消息处理(脚本)来获取消息,走通Flume和Kafka的对接 1. Flume配置
1. 下载Flume和Kafka集成的插件,下载地址:https://github.com/beyondj2ee/f
Erlang vs TNSDL
bookjovi
erlang
TNSDL是Nokia内部用于开发电信交换软件的私有语言,是在SDL语言的基础上加以修改而成,TNSDL需翻译成C语言得以编译执行,TNSDL语言中实现了异步并行的特点,当然要完整实现异步并行还需要运行时动态库的支持,异步并行类似于Erlang的process(轻量级进程),TNSDL中则称之为hand,Erlang是基于vm(beam)开发,
非常希望有一个预防疲劳的java软件, 预防过劳死和眼睛疲劳,大家一起努力搞一个
ljy325
企业应用
非常希望有一个预防疲劳的java软件,我看新闻和网站,国防科技大学的科学家累死了,太疲劳,老是加班,不休息,经常吃药,吃药根本就没用,根本原因是疲劳过度。我以前做java,那会公司垃圾,老想赶快学习到东西跳槽离开,搞得超负荷,不明理。深圳做软件开发经常累死人,总有不明理的人,有个软件提醒限制很好,可以挽救很多人的生命。
相关新闻:
(1)IT行业成五大疾病重灾区:过劳死平均37.9岁
读《研磨设计模式》-代码笔记-原型模式
bylijinnan
java 设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* Effective Java 建议使用copy constructor or copy factory来代替clone()方法:
* 1.public Product copy(Product p){}
* 2.publi
配置管理---svn工具之权限配置
chenyu19891124
SVN
今天花了大半天的功夫,终于弄懂svn权限配置。下面是今天收获的战绩。
安装完svn后就是在svn中建立版本库,比如我本地的是版本库路径是C:\Repositories\pepos。pepos是我的版本库。在pepos的目录结构
pepos
component
webapps
在conf里面的auth里赋予的权限配置为
[groups]
浅谈程序员的数学修养
comsci
设计模式 编程 算法 面试 招聘
浅谈程序员的数学修养
批量执行 bulk collect与forall用法
daizj
oracle sql bulk collect forall
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎。通常可以在SELECT INTO、
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT。本文将逐一描述BULK COLLECT在这几种情形下的用法。
有关FORALL语句的用法请参考:批量SQL之 F
Linux下使用rsync最快速删除海量文件的方法
dongwei_6688
OS
1、先安装rsync:yum install rsync
2、建立一个空的文件夹:mkdir /tmp/test
3、用rsync删除目标目录:rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
Yii CModel中rules验证规格
dcj3sjt126com
rules yii validate
Yii cValidator主要用法分析:
yii验证rulesit 分类: Yii yii的rules验证 cValidator主要属性 attributes ,builtInValidators,enableClientValidation,message,on,safe,skipOnError
基于vagrant的redis主从实验
dcj3sjt126com
vagrant
平台: Mac
工具: Vagrant
系统: Centos6.5
实验目的: Redis主从
实现思路
制作一个基于sentos6.5, 已经安装好reids的box, 添加一个脚本配置从机, 然后作为后面主机从机的基础box
制作sentos6.5+redis的box
mkdir vagrant_redis
cd vagrant_
Memcached(二)、Centos安装Memcached服务器
frank1234
centos memcached
一、安装gcc
rpm和yum安装memcached服务器连接没有找到,所以我使用的是make的方式安装,由于make依赖于gcc,所以要先安装gcc
开始安装,命令如下,[color=red][b]顺序一定不能出错[/b][/color]:
建议可以先切换到root用户,不然可能会遇到权限问题:su root 输入密码......
rpm -ivh kernel-head
Remove Duplicates from Sorted List
hcx2013
remove
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return&
Spring4新特性——JSR310日期时间API的支持
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
浅谈enum与单例设计模式
247687009
java 单例
在JDK1.5之前的单例实现方式有两种(懒汉式和饿汉式并无设计上的区别故看做一种),两者同是私有构
造器,导出静态成员变量,以便调用者访问。
第一种
package singleton;
public class Singleton {
//导出全局成员
public final static Singleton INSTANCE = new S
使用switch条件语句需要注意的几点
openwrt
c break switch
1. 当满足条件的case中没有break,程序将依次执行其后的每种条件(包括default)直到遇到break跳出
int main()
{
int n = 1;
switch(n) {
case 1:
printf("--1--\n");
default:
printf("defa
配置Spring Mybatis JUnit测试环境的应用上下文
schnell18
spring mybatis JUnit
Spring-test模块中的应用上下文和web及spring boot的有很大差异。主要试下来差异有:
单元测试的app context不支持从外部properties文件注入属性
@Value注解不能解析带通配符的路径字符串
解决第一个问题可以配置一个PropertyPlaceholderConfigurer的bean。
第二个问题的具体实例是:
Java 定时任务总结一
tuoni
java spring timer quartz timertask
Java定时任务总结 一.从技术上分类大概分为以下三种方式: 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务; 说明: java.util.Timer定时器,实际上是个线程,定时执行TimerTask类 &
一种防止用户生成内容站点出现商业广告以及非法有害等垃圾信息的方法
yangshangchuan
rank 相似度计算 文本相似度 词袋模型 余弦相似度
本文描述了一种在ITEYE博客频道上面出现的新型的商业广告形式及其应对方法,对于其他的用户生成内容站点类型也具有同样的适用性。
最近在ITEYE博客频道上面出现了一种新型的商业广告形式,方法如下:
1、注册多个账号(一般10个以上)。
2、从多个账号中选择一个账号,发表1-2篇博文