什么是弱引用
弱引用实例:java.lang.ref.WeakReference类或者其子类的一个实例,就是一个弱引用实例。
弱引用:如果一个弱引用实例的成员变量referent引用了一个对象obj,那么就称这个弱引用实例对obj的引用是弱引用。
弱引用对象:被一个弱引用实例引用的对象,称为弱引用对象。
public class WeakReference < T > extends Reference < T > {
public WeakReference ( T referent) {
super ( referent) ;
}
public WeakReference ( T referent, ReferenceQueue < ? super T > q) {
super ( referent, q) ;
}
}
示例
在实际业务场景中,我们通常会定义一个WeakReference的子类来解决我们的需求。 例如:
class Apple {
String color;
void Apple ( String color) {
this . color = color;
}
String getColor ( ) {
return color;
}
void setColor ( String color) {
this . color = color;
}
public String toString ( ) {
return new StringBuilder ( "Apple[color=" ) . append ( this . color) . append ( "]" ) . toString ( ) ;
}
protected void finalize ( ) throws Throwable {
System . out. println ( this ) ;
}
}
如下所定义的Salad类,其实例是一个弱引用实例,其实例会持有一个Apple类对象的弱引用。当一个Apple实例对象只被salad类实例(或者其它弱引用实例)引用时,它就会被GC回收。
class Salad extends WeakReference < Apple > {
Apple apple;
void Salad ( Apple apple) {
super ( apple) ;
}
}
弱引用 WeakReference 相关的GC回收规则
当一个对象只被弱引用实例引用(持有)时,这个对象就会被GC回收。
WeakReference类的javadoc:
一个弱引用实例,不会对它(的成员变量referent)所引用的对象的finalizable(是否可销毁)、finalized(销毁)和 reclaimed(GC回收)产生任何影响。
如果GC在某个时间点确定某对象是弱可达的(只被某个或某些弱引用对象引用),那么它就会清除对该弱可达对象的所有弱引用(将引用了弱可达对象的弱引用实例的referent置为null:referent=null),同时还会找出从"GC Roots"到该对象的强引用链和软引用链上的所有弱可达对象,然后也会清除对这些弱可达对象的所有弱引用。
同时,GC会将以上弱可达对象标记为可销毁的(finalizable)。然后会立刻或者在稍后的某个时间点,将以上那些清除了的弱引用实例对象入队到它们在创建时就注册到的queue中去。(参考Reference)
弱引用通常用于实现规范化映射(WeakHashMap、WeakCache)。
注意
上述规则中,会被GC标记为finalizable的的是弱引用实例引用的对象,而非弱引用实例本身
如果显式地声明了一个变量E e,并使之指向一个对象:e = new E(),这时变量e就是这个新创建的对象的一个强引用。如果变量e所引用的这个对象同时又被WeakReference的一个实例持有,则由于存在对对象的一个强引用e,对象并不符合上述回收规则,因此对象至少在变量e的作用域范围内都不会被回收。
示例:
public class Test {
public static void main ( String [ ] args) throws InterruptedException {
Salad saladWithRedApple = new Salad ( new Apple ( "red " ) ) ;
Apple green = new Apple ( "green" ) ;
Salad saladWithGreenApple = new Salad ( green) ;
System . gc ( ) ;
try {
Thread . sleep ( 5000 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
out. println ( saladWithRedApple. get ( ) == null ) ;
out. println ( saladWithGreenApple. get ( ) == null ) ;
}
}
Reference
此类是所有Reference类的实例对象(所有Reference的实现类的实例对象)的抽象基类,此类中定义了所有Reference类的实例对象的通用操作。由于引用类对象同垃圾回收两者之间有密切的关系(对象的回收本身就与对象的引用关系密切,例如初代垃圾收集器就是判断对象是否还被变量引用来确定对象是否可以被会回收的),因此子类可能不会直接实现Reference类(而是实现WeakReference等类,以避免出现垃圾对象不被及时回收的情况。注:如果用户直接实现Reference类,就相当于一个定义一个强引用类,因为GC对于用户自定义的类并没有做任何特殊处理。但GC对于JDK中定义的 SoftReference 和 WeakReference 等,都做了特殊处理,因此就有了不要直接实现Reference类的建议。)。
在Reference类中定义了以下几个实例变量:
private T referent;
volatile ReferenceQueue < ? super T > queue;
Reference next;
transient private Reference < T > discovered;
Reference对实例对象定义了4种内部状态(没有显式地用枚举类声明出来):
活动的(active):刚创建的Reference实例处于活动状态。垃圾收集器会对active状态的引用所指向的实际对象referent做特殊处理:当垃圾收集器监测到active状态的实例的referent的可达性变成了某个特定状态时,会将当前Reference实例的状态由active更改为pending或者inactive。具体取决于实例创建时,是否注册到了一个ReferenceQueue队列(即r的queue是否为null),如果实例创建时注册了queue(注意注册到queue与添加到queue不是一个概念,这里的注册到了queue,实际是指r持有了一个ReferenceQueue实例的引用),则实例状态改为pending,并会被添加到挂起队列(pendinglist,挂起队列同queue不是一个队列);否则实例状态被改为inactive。
挂起(pending):当实例被添加到挂起队列pending-list中后,状态就会被改为pending,即挂起队列中的所有元素的状态都是Pending。挂起队列中的元素都在等待线程类将实例入队(添加到元素自身持有的queue中去)。创建时没有注册到queue的Reference实例永远也不会变成此状态。
enqueued:当实例被添加到其自身持有的queue(即其创建时注册的queue)后,状态被更改为enqueued。当实例被从此队列中移除后,状态就变为inactive
不活跃(inactive):当实例被更改成此状态后,其状态就不会再改变了。
实例在各个状态下时,其所持有的ReferenceQueue实例-queue变量和持有的Reference实例-next变量的值如下:
active状态时:queue = 实例被创建时如果注册了queue,则此queue就不会空。否则queue=ReferenceQueue.NULL; next = null.
pending状态时:queue=创建时注册到的queue,next=this。
enqueued状态时:queue=ReferenceQueue.ENQUEUED(其实也是null);next=原来的队头(头插法),如果原来的队列为空,则next=this。
inactive状态时:queue=ReferenceQueue.NULL,next=this。
在如上这种模式下,垃圾收集器仅需要通过检查next字段就能确定实例是否需要特别的处理:如果next==null,那么实例处于active状态,如果next!=null,这垃圾收集器只需对实例进行常规处理。 为了确保垃圾收集器能在不干扰对reference实例对象进行enqueue()的应用线程的正常运行的情况下,能发现处于active状态的实例,垃圾收集器应该通过discovered字段链接这些处于active状态的实例。 discovered字段也用于链接挂起列表中的Reference实例对象。
ReferenceQueue
Reference类中定义了一个此类的对象:
volatile ReferenceQueue queue;
当某Reference类实例(或其子类的实例)可能将不会再被使用,需要被垃圾收集器监测以回收时,应将对象追加到此queue中。
垃圾收集器会不断监测此queue中的实例的状态,当监测到实例变更为某种状态时,会对对象进行垃圾回收。
当前对象r入队后即queue.enqueue(),就会将自己的queue变量置空,即r.queue=null,以便垃圾收集器回收。
Lock
static private class Lock { }
private static Lock lock = new Lock ( ) ;
定义了Lock类并创建了一个此类的实例,用于作为同步垃圾收集线程的对象。 垃圾收集线程在每个收集周期开始时必须先获得此锁,因此获得此锁的其它代码应尽快完成:尽量不要创建新的对象、尽量避免调用用户代码。
pending
pending是一个全局变量,每个JVM中只有一份。
private static Reference pending=null; // 是一个链表的头结点
pending指向一个链表的头结点,当某个处于特殊状态的Reference实例需要插入此链表中时,会采用头插法的方式,将自己设置为pending,成为新的头结点。
pending所指向的链表中的所有 Reference 实例都是处于挂起状态、等待入队的 Reference 实例。
当active状态的引用实例的referent的可达性处于某个特定状态时,垃圾收集线程会将此Reference实例添加到这个pending链表,并等待引用处理线程将元素从pending链表中移除,然后enqueue()到元素注册的queue中去。
这个链表被lock对象保护。
这个链表用元素的discovered字段链接每个元素(相当于链表节点中的next字段)。
ReferenceHandler
此线程用于将pending所指向的链表中的所有处于pending状态的Reference实例,入队到它们各自持有的queue中去。
此线程会调用boolean tryHandlePending(boolean waitFor)方法来处理pending状态的引用对象。
此线程的优先级被设置为最高。
如果可能还有其它pending状态的引用实例,tryHandlePending会返回true。如果没有其它pending状态的实例,并且希望应用程序可以做更多的有意义的工作而不是这个线程一直自旋,一直占用CPU,则会返回false。
tryHandlePending方法的waitForNotify参数的意义:如果参数值为true,则线程会一直wait直到VM notify了它、或者线程被interrupted。如果参数值为false,则当没有pending状态的引用时,线程就立即退出了。 如果处理了一个pending状态的引用,则方法返回true。如果没有要处理的对象,则一直wait,直到被notify或者被
private static class ReferenceHandler extends Thread {
. . .
public void run ( ) {
while ( true ) {
tryHandlePending ( true ) ;
}
}
. . .
}
static boolean tryHandlePending ( boolean waitForNotify) {
Reference < Object > r;
Cleaner c;
try {
synchronized ( lock) {
if ( pending != null ) {
r = pending;
c = r instanceof Cleaner ? ( Cleaner ) r : null ;
pending = r. discovered;
r. discovered = null ;
} else {
if ( waitForNotify) {
lock. wait ( ) ;
}
return waitForNotify;
}
}
} catch ( OutOfMemoryError x) {
Thread . yield ( ) ;
return true ;
} catch ( InterruptedException x) {
return true ;
}
if ( c != null ) {
c. clean ( ) ;
return true ;
}
ReferenceQueue < ? super Object > q = r. queue;
if ( q != ReferenceQueue . NULL) q. enqueue ( r) ;
return true ;
}
Reference类中的静态代码块
Reference中定义了一些静态代码块,主要是启动一个线程,将处于pending状态的引用类对象入队,入队后的Reference实例的状态将变成Enqueued。
在Reference类中,lock、pending、handler = new ReferenceHandler(…)、tryHandlePending(…)这些成员都是类成员,因此,handler 线程是对全局的pending链表中的所有处于pending状态的Re实例进行处理。 queue、next、discovered则是实例变量。
static {
ThreadGroup tg = Thread . currentThread ( ) . getThreadGroup ( ) ;
for ( ThreadGroup tgn = tg;
tgn != null ;
tg = tgn, tgn = tg. getParent ( ) ) ;
Thread handler = new ReferenceHandler ( tg, "Reference Handler" ) ;
handler. setPriority ( Thread . MAX_PRIORITY) ;
handler. setDaemon ( true ) ;
handler. start ( ) ;
SharedSecrets . setJavaLangRefAccess ( new JavaLangRefAccess ( ) {
@Override
public boolean tryHandlePendingReference ( ) {
return tryHandlePending ( false ) ;
}
} ) ;
}
WeakReference
弱引用对象,不会其引用的对象被JVM设置为可回收状态,然后被回收。弱引用通常用于实现规范化映射。
如果垃圾收集器在某个时间点确定某个对象的可达性是弱可达的(即这个对象可以通过一个弱引用链可达,即使同时也有其它强引用链或者软引用链可达此对象),那么GC就会清除所有引用这个对象的弱引用,还会通过可以到达这个对象的强引用链和软引用链找到链上其它对象上的所有弱引用、并清除所有这些弱引用。
同时,GC还会将所有之前被清除了弱引用的对象声明为finalizable的。并且可能同时或者接着就会将那些弱引用实例本身添加到它们注册到的ReferenceQueue队列中去。
ReferenceQueue 类什么用?
在Reference类中,定义了一个ReferenceQueue类型的成员变量,变量名为queue。 并定义了相应的构造函数:
public Reference ( T referent, ReferenceQueue < ? super T > queue) {
this . referent = referent;
this . queue = ( queue == null ) ? ReferenceQueue . NULL : queue;
}
当构造一个引用实例时,如果初始化了成员变量queue的值,我称之为将引用实例与queue绑定了。 那么将引用实例与这个queue绑定,有什么用呢? 由于GC会对Reference类及其子类的实例进行特殊方式的处理,比如对于weak引用实例,会在每次GC时都会将其发现的所有weak引用实例的referent 断开其引用。但是用户可能需要对此做一些个性化的处理。因此,JVM设计出这样的方式:GC在清理weak实例时,会将weak实例入队到其绑定的queue中,用户就可以去queue中获取这些被GC处理了的weak实例,然后再做一些个性化处理。
并不是所有的reference实例都必须绑定一个queue,如果用户不需要对被GC的实例做特殊的处理,就不用设置。
一般在缓存map场景下,会定义一个ReferenceQueue,如WeakHashMap,WeakCache等。因为通常将实际的key封装成一个WeakReference类实例,存储到缓存map的key中,目的是借助GC自动及时释放缓存内存,防止map过大。但GC自动将map中weak实例对实际key的referent置为null后,相应的entry就失去了在map中存在的意义了,这时queue的作用就出来了:GC在清理weak实例时,将此实例入队到创建实例时绑定到的queue中,用户主动遍历这个queue,将queue中元素对应的map中的entry清理掉。否则map永远也不会释放这些已经失去意义的entry,这就会造成内存泄漏。
WeakReference常用场景下的内存泄漏问题
以ThreadLocal.ThreadLocalMap为例,经常看到如下说法:ThreadLocalMap中,Entry extends WeakReference
,Entry的key也即ThreadLocal实例本身会被赋值给WeakReference的referent,JVM执行GC时,只要遇到弱引用就会将其断开,即设置referent=null
,则Entry的key变null了,那么Entry的value就已经没有意义了,也应该能被GC回收掉,否则就是内存泄漏。但是如果我们不主动调用threadlocal.remove()
,不主动设置vlaue=null,那么被value引用的对象就会一直到线程销毁都无法被GC回收掉,这就是ThreadLocal会造成内存泄漏的说法。
但是,针对这种情况,ThreadLocal也不是什么都没做。
在ThreadLocal实例每次执行set(T value)方法时(首次创建线程的threadLocals对象时除外),最后都会执行以下代码
if ( ! cleanSomeSlots ( i, sz) && sz >= threshold)
rehash ( ) ;
cleanSomeSlots方法代码如下:
private boolean cleanSomeSlots ( int i, int n) {
boolean removed = false ;
Entry [ ] tab = table;
int len = tab. length;
do {
i = nextIndex ( i, len) ;
Entry e = tab[ i] ;
if ( e != null && e. get ( ) == null ) {
n = len;
removed = true ;
i = expungeStaleEntry ( i) ;
}
} while ( ( n >>>= 1 ) != 0 ) ;
return removed;
}
可见,除了第一次,其后每次向线程的threadLocals 中添加entry时,都会清理在此之前被GC掉的的key对应的entry。 也就是说,通常情况下,每个线程最多只会存在一个应该被GC回收但未能被回收的泄漏的对象。 如果这个对象非常大,占用JVM内存空间较多,那么就影响较大。 如果线程非常多,每个线程都有一个泄漏的对象,那么影响也较大。
你可能感兴趣的:(JAVA-语法基础,WeakReference,java,GC,ThreadLocal,内存泄漏)
Node.js 与 PostgreSQL 集成:深入 pg 模块的应用与实践
title:Node.js与PostgreSQL集成:深入pg模块的应用与实践date:2025/2/5updated:2025/2/5author:cmdragonexcerpt:随着JavaScript在服务器端编程中的兴起,Node.js已成为构建高性能网络应用程序的重要平台。PostgreSQL则以其强大的特性以及对复杂数据结构的支持,被广泛用作数据库解决方案。在Node.js中,pg模块
2025春招,Netty面试题汇总
javanetty面试
大家好,我是V哥。2025年春招Java面试,肯定绕不开Netty的相关问题,V哥替大家跟几位大厂技术主管交流后,整理的一些2025年可能会遇到的Netty面试题,涵盖基础概念、核心组件、性能优化、故障排查等方面,分享给大家,收藏起来备用。基础概念类请简要介绍一下Netty是什么,以及它的主要应用场景有哪些?参考答案:Netty是一个基于JavaNIO封装的高性能网络编程框架,它简化了网络编程的复
深入浅出JSON.parse
前端javascript
前言众所周知,JSON.parse方法用于将一个json字符串转换成由字符串描述的JavaScript值或对象,该方法支持传入2个参数,第一个参数就是需要被转换的json字符串,第二个参数则是一个转换器函数(reviver,也叫还原函数),这个函数会针对每个键/值对都调用一次,这个转换器函数又接受2个参数,第一个参数为转换的每一个属性名,第二个参数则为转换的每一个属性值,并且该函数需要返回一个值,
线上事故风险解读之规范篇
专业在线打字练习平台-巧手打字通,只输出有价值的知识。一统一编码规范事故回顾门店误删事件:由于switch分支条件中遗漏了break语句,导致程序执行了本不应执行的代码逻辑,意外删除了门店数据。线程池资源泄露导致OOM:线程池中的队列数据未能及时释放,造成内存泄漏,最终引发内存溢出(OOM)问题。日志过载导致服务不可用:在流量高峰期,由于日志打印量过大,占用了大量CPU资源,导致服务性能急剧下降,
Dart 语法基础
Dart注释Dart支持单行注释、多行注释和文档注释。单行注释单行注释以//开头。//和行尾之间的所有内容都被Dart编译器忽略。voidmain(){//TODO:重构为AbstractLlamaGreetingFactory?print('欢迎来到我的羊驼农场!');}多行注释多行注释以/*开头,以*/结尾。/*和*/之间的所有内容都被Dart编译器忽略(除非注释是文档注释;请参见下一节)。多
Java基础学习笔记-强制类型转换
蝴蝶不愿意
Java基础学习笔记 学习 笔记
###数据类型转化不同基本数据类型之间进行运算时需要进行类型转换。除布尔类型外,所有基本数据类型进行运算时都要考虑类型转换,主要应用在算术运算时和赋值运算时。(1)算术运算时存储位数越多,类型的级别越高。不同类型的操作数,首先自动转换为表达式中最高级别的数据类型然后进行运算,运算的结果是最高级别的数据类型,简称低级别自动转换为高级别。![[类型转换.png]](2)赋值运算转换方式有自动类型转换和
find命令学习
Miqiuha
学习
转自:https://wangchujiang.com/linux-command/c/find.html1.-type参数find.-type类型参数f普通文件l符号连接d目录c字符设备b块设备s套接字pFifo2.按时间UNIX/Linux文件系统每个文件都有三种时间戳:访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。修改时间(-mtime/天,-mmin/分钟):文件最
Java泛型详解 | 最新、全面、详细和深入 | 2万字超全
快乐随风起
JVM Java 笔记 java jvm 开发语言
目录1泛型概述1.1前言1.2泛型的定义1.3Java泛型的作用2Java泛型的特点2.1类型擦除2.2类型擦除原则2.3类型擦除带来的影响2.4弱记忆3泛型的使用3.1泛型类3.1.1泛型类的使用3.1.2泛型类派生子类注意点3.2泛型接口3.2.1泛型接口的使用3.2.2泛型接口实现类注意点3.3泛型通配符3.3.1前言案例3.3.2什么是类型通配符3.4泛型上下界3.5泛型方法3.5.1泛型
验证工具:VCS与Verdi介绍
TrustZone_
IC验证之旅 fpga开发
VCS和Verdi都是Synopsys公司旗下的工具,在集成电路设计和验证领域发挥着重要作用。VCSVCS,全称VerilogCompileSimulator,是Synopsys公司的一款Verilog仿真工具。它具有以下主要功能:编译和仿真:VCS能够对Verilog设计代码和testbench进行编译,生成simv二进制可执行文件,该文件后续用于仿真。它支持Verilog-1995、Veril
java 泛型 json_Java泛型与Json反序列化
KateZeng
java 泛型 json
Java的JSON库有很多,本文分析google的Gson和alibaba的fastjson,在Java泛型场景反序列化的一些有意思的行为。考虑下面的json字符串:["2147483648","2147483647"]用fastjson在不指定类型的情况下解析,下面的代码输出啥:JSON.parseArray(s).forEach(o->{System.out.println(o.getClas
Java 资源管理教程:掌握 close 方法、Cleaner 类与 Runtime.addShutdownHook
代数狂人
Java java python 开发语言
在Java编程中,高效地管理资源是至关重要的,特别是当你处理文件、数据库连接、网络连接等有限资源时。为了确保这些资源得到正确释放,Java提供了多种机制。本教程将深入探讨close方法、Cleaner类以及Runtime.addShutdownHook方法,帮助你更好地管理资源。1.close方法:资源释放的基础close方法是Java中释放资源的标准方式。它通常与实现了java.io.Close
Java环形链表约瑟夫环问题
南风暖栀
数据结构 算法 java 链表
1,先创建一个节点,让frist指向改节点,并形成环形2,后面当我们每创建一个新节点,就把该节点加入已有环形链表中即可遍历环形链表1.让辅助指针,指向first2然后用while遍历好了,上代码packageyanhaochen;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){//testCir
计算机毕业设计之springcloud基于微服务架构的学习系统的设计与实现
bishe22是微
课程设计 spring cloud 微服务 后端 java
本文首先实现了基于微服务架构的学习系统的发展,随后依照传统的软件开发流程,最先为系统挑选适用的言语和软件开发平台,依据需求分析开展控制模块制做和数据库查询构造设计,随后依据系统整体功能模块的设计,制作系统的功能模块图、E-R图。随后,设计框架,依据设计的框架撰写编码,完成系统的每个功能模块。最终,对基本系统开展了检测,包含软件性能测试、单元测试和性能指标。测试结果表明,该系统能够实现所需的功能,运
什么是LILO?思维导图 代码示例(java 架构)
用心去追梦
java 架构 python
什么是LILO?LILO(LinuxLoader)是早期Linux系统中常用的引导加载程序之一,用于启动操作系统。它在计算机启动时运行,负责将内核加载到内存中,并初始化系统以开始操作系统的执行。尽管现在许多系统已经转向使用GRUB或GRUB2作为默认的引导加载程序,但在某些老旧系统或特定场景下,LILO仍然被使用。LILO的特点历史与地位是最早的Linux引导加载程序之一。曾经广泛应用于各种Lin
JavaScript高级教程-集合引用类型(二)
小郑T_T
JavaScript 笔记 javascript 前端
JavaScript高级教程-集合引用类型(二)四、Map1.基本API2.顺序与迭代五、WeakMap1.基本API2.弱键3.不可迭代键4.使用弱映射(1)私有变量(2)DOM节点元数据六、Set1.基本API2.顺序与迭代七、WeakSet1.基本API2.弱值3.不可迭代值4.使用弱集合四、Map作为ECMAScript6的新增特性,Map是一种新的集合类型,为这门语言带来了真正的键/值存
JavaScript高级教程-代理与反射
小郑T_T
JavaScript 笔记 javascript
代理与反射一、代理基础1.创建空代理2.定义捕获器3.捕获器参数和反射API4.捕获器不变式5.可撤销代理6.实用反射API(1)反射API与对象API(2)状态标记(3)用一等函数替代操作符(4)安全地应用函数7.代理另一个代理8.代理的问题与不足(1)代理中的this(2)代理与内部槽位二、代理捕获器与反射方法1.get()2.set()3.has()4.defineProperty()5.g
Java 技术全栈深度探索:从基础到企业级应用实践
智界工具库
java 开发语言
文章简介:本文是一篇全面深入的Java课程文章,围绕众多关键技术领域展开。从RPC框架、注册中心等分布式核心组件,到数据中台、服务容错等企业级架构要点;从Spring生态剖析到电商、直播答题等多类型项目实战;涵盖容器云、监控、测试、CI&CD平台实践以及问题定位与安全分析等运维保障内容;还涉及Netty网络编程、X2C需求设计及大数据集群资源评估等。通过系统的讲解与案例剖析,助力读者深入理解Jav
leetcode——爬楼梯(java)
gentle_ice
leetcode 算法 java 数据结构
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1.1阶+1阶+1阶2.1阶+2阶3.2阶+1阶解题方法:(递推)1.经过分析,这道题本质上是一个斐波那契数列问题。2.所以,我们可以直接使用斐波那契数列的规
2025最全计算机毕业设计选题推荐【前后端全栈方向】
大熊计算机毕设
计算机项目推荐 论文笔记
✅博主介绍:CSDN毕设辅导博主、CSDN认证Java领域优质创作者✅技术范围:主要包括Java、Vue、Python、爬虫、小程序、安卓app、大数据、机器学习等设计与开发。✅主要内容:免费功能设计、开题报告、任务书、功能实现、代码编写、论文编写和辅导、论文降重、答辩答疑辅导。文末有博主名片哦正文本文整理了30个涵盖前端Vue、后端Java或Python的全栈开发选题,适用于各种应用场景,帮助你
Android中的C++虚函数机制详解与应用
Mn孟
本文还有配套的精品资源,点击获取简介:在Android系统中,C++作为支持Java层的底层语言,在原生库开发和高性能应用中发挥重要作用。虚函数作为C++面向对象编程的关键特性,允许基类指针调用派生类重写的成员函数实现多态性。本文将详细讨论虚函数在Android中的概念、原理和应用,包括虚函数的声明、重写以及与JNI的交互。同时,将阐述虚函数性能开销以及在Android开发中虚函数的典型应用场景,
编程AI深度实战:自己的AI,必会LangChain
relis
编程AI:企业级开发深度实战 python langchain rag 知识库 芯片设计 ai 大模型
系列文章:编程AI深度实战:私有模型deepseekr1,必会ollama-CSDN博客编程AI深度实战:自己的AI,必会LangChain-CSDN博客编程AI深度实战:给vim装上AI-CSDN博客编程AI深度实战:火的编程AI,都在用语法树(AST)-CSDN博客编程AI深度实战:让verilog不再是AI的小众语言-CSDN博客您听说过LangChain这个术语,但不确定它到底是什么?那么
vue3基于SpringBoot的航空散货调度系统
计算机专业码农一枚
spring boot 后端 java
目录功能和开发技术介绍具体实现截图开发核心技术介绍:技术创新点vue3和vue2的区别:核心代码部分展示非功能需求分析系统开发流程系统运行步骤软件测试源码获取功能和开发技术介绍本课题拟采用主流的MVC架构、开发工具idea、java语言编程、MySQL数据库技术、Vue.js技术和现代网络通讯技术来完成。1.前后端分离项目,前端使用vue3框架2.后端使用java编程语言的springboot框架
Java基于SpringBoot+Vue的航空/集装箱散货调度系统(源码+文档+运行视频+讲解视频)
QQ177825331
java spring boot vue.js
所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot+Vue的航空/集装箱散货调度系统(源码+文档+运行视频+讲解视频)系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:mysql版本不限数据库工具:Navicat/SQLyog都可以前端:vue.js+ElementUI开发工具:I
Assembly语言的移动应用开发
孔瑾熙
包罗万象 golang 开发语言 后端
Assembly语言的移动应用开发引言在当今快速发展的技术环境中,移动应用开发已成为软件工程领域的重要组成部分。随着智能手机的普及,各类应用层出不穷,从游戏到生活服务,应用程序在我们的日常生活中提供了便利。虽然高层次语言(如Java、Swift和Kotlin)因其简单易用而广泛被使用,但Assembly语言的使用也不乏其独特的优势。本文将深入探讨Assembly语言在移动应用开发中的应用,包括其基
探秘Golang构建利器:Maven-Golang-Wrapper
幸竹任
探秘Golang构建利器:Maven-Golang-Wrapper项目地址:https://gitcode.com/gh_mirrors/mv/mvn-golangGolang与Maven的融合,为Java开发者打开了新世界的大门。让我们一起深入探索【Maven-Golang-Wrapper】这一强大工具,它将带你轻松迈入Go语言的开发世界。1.项目介绍Maven-Golang-Wrapper是一
OkHttpClient请求失败处理与网页下载成功实践
小白学大数据
python scala 爬虫 python
在现代的网络应用开发中,数据的获取和处理是核心任务之一。无论是从第三方API获取数据,还是从网页中提取内容,网络请求都是不可或缺的环节。在Java中,OkHttp是一个非常流行且功能强大的HTTP客户端库,它提供了简洁的API和高效的性能,广泛应用于各种网络请求场景。然而,在实际开发中,网络请求可能会因为各种原因失败,如网络问题、服务器错误、代理配置错误等。因此,正确处理请求失败并确保下载成功是开
如何使用Java代码给图片增加倒影效果
在多模态模型的架构上,ChatGPT的绘图能力主要依赖以下几个核心组件:跨模态编码器(Cross-ModalEncoder):跨模态编码器的作用是将文本和图像的特征进行对齐。GPT可以将用户输入的文本描述转换为文本特征表示,然后利用跨模态编码器将这些特征映射到图像特征空间。这种方式确保模型能够理解描述性语言中不同细节是如何与图像特征对应的。
大数据相关开源项目汇总
万里浮云
大数据
调度与管理服务Azkaban是一款基于Java编写的任务调度系统任务调度,来自LinkedIn公司,用于管理他们的Hadoop批处理工作流。Azkaban根据工作的依赖性进行排序,提供友好的Web用户界面来维护和跟踪用户的工作流程。YARN是一种新的Hadoop资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,解决了旧MapReduce框架的性能瓶颈。它的基本思想是把资源
策略模式+职责链模+享元模式 实现坦克大战
科学的发展-只不过是读大自然写的代码
设计模式-坦克大战-java 策略模式 享元模式 java
需求:坦克大战创建两种坦克坦克类型射程速度b7070米时/70公里b5050米时/70公里类图代码importjava.util.HashMap;//--接口层---------------------------------------------------//基本功能基类classFunction{publicStringmStr;publicStringmUnit;Function(Str
Java提供了哪些IO方式? NIO如何实现多路复用? -
橘野禾
java 开发语言 后端 数据结构 系统架构
简述同步阻塞IO库:传统的java.io包下面一些熟知的IO功能,比如File抽象,输入输出流等,交互方式是同步阻塞。java.net下面提供的部分网络API,比如Socket、ServerSocket、HttpURLConnection;1.4引入的NIO,提供了Channel、Selector、Buffer等新的抽象,可以用于构建多路复用的、同步非阻塞IO,同时提供了更接近OS底层的高性能数据
java杨辉三角
3213213333332132
java基础
package com.algorithm;
/**
* @Description 杨辉三角
* @author FuJianyong
* 2015-1-22上午10:10:59
*/
public class YangHui {
public static void main(String[] args) {
//初始化二维数组长度
int[][] y
《大话重构》之大布局的辛酸历史
白糖_
重构
《大话重构》中提到“大布局你伤不起”,如果企图重构一个陈旧的大型系统是有非常大的风险,重构不是想象中那么简单。我目前所在公司正好对产品做了一次“大布局重构”,下面我就分享这个“大布局”项目经验给大家。
背景
公司专注于企业级管理产品软件,企业有大中小之分,在2000年初公司用JSP/Servlet开发了一套针对中
电驴链接在线视频播放源码
dubinwei
源码 电驴 播放器 视频 ed2k
本项目是个搜索电驴(ed2k)链接的应用,借助于磁力视频播放器(官网:
http://loveandroid.duapp.com/ 开放平台),可以实现在线播放视频,也可以用迅雷或者其他下载工具下载。
项目源码:
http://git.oschina.net/svo/Emule,动态更新。也可从附件中下载。
项目源码依赖于两个库项目,库项目一链接:
http://git.oschina.
Javascript中函数的toString()方法
周凡杨
JavaScript js toString function object
简述
The toString() method returns a string representing the source code of the function.
简译之,Javascript的toString()方法返回一个代表函数源代码的字符串。
句法
function.
struts处理自定义异常
g21121
struts
很多时候我们会用到自定义异常来表示特定的错误情况,自定义异常比较简单,只要分清是运行时异常还是非运行时异常即可,运行时异常不需要捕获,继承自RuntimeException,是由容器自己抛出,例如空指针异常。
非运行时异常继承自Exception,在抛出后需要捕获,例如文件未找到异常。
此处我们用的是非运行时异常,首先定义一个异常LoginException:
/**
* 类描述:登录相
Linux中find常见用法示例
510888780
linux
Linux中find常见用法示例
·find path -option [ -print ] [ -exec -ok command ] {} \;
find命令的参数;
SpringMVC的各种参数绑定方式
Harry642
springMVC 绑定 表单
1. 基本数据类型(以int为例,其他类似):
Controller代码:
@RequestMapping("saysth.do")
public void test(int count) {
}
表单代码:
<form action="saysth.do" method="post&q
Java 获取Oracle ROWID
aijuans
java oracle
A ROWID is an identification tag unique for each row of an Oracle Database table. The ROWID can be thought of as a virtual column, containing the ID for each row.
The oracle.sql.ROWID class i
java获取方法的参数名
antlove
java jdk parameter method reflect
reflect.ClassInformationUtil.java
package reflect;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.Modifier;
import javassist.bytecode.CodeAtt
JAVA正则表达式匹配 查找 替换 提取操作
百合不是茶
java 正则表达式 替换 提取 查找
正则表达式的查找;主要是用到String类中的split();
String str;
str.split();方法中传入按照什么规则截取,返回一个String数组
常见的截取规则:
str.split("\\.")按照.来截取
str.
Java中equals()与hashCode()方法详解
bijian1013
java set equals() hashCode()
一.equals()方法详解
equals()方法在object类中定义如下:
public boolean equals(Object obj) {
return (this == obj);
}
很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、I
精通Oracle10编程SQL(4)使用SQL语句
bijian1013
oracle 数据库 plsql
--工资级别表
create table SALGRADE
(
GRADE NUMBER(10),
LOSAL NUMBER(10,2),
HISAL NUMBER(10,2)
)
insert into SALGRADE values(1,0,100);
insert into SALGRADE values(2,100,200);
inser
【Nginx二】Nginx作为静态文件HTTP服务器
bit1129
HTTP服务器
Nginx作为静态文件HTTP服务器
在本地系统中创建/data/www目录,存放html文件(包括index.html)
创建/data/images目录,存放imags图片
在主配置文件中添加http指令
http {
server {
listen 80;
server_name
kafka获得最新partition offset
blackproof
kafka partition offset 最新
kafka获得partition下标,需要用到kafka的simpleconsumer
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.
centos 7安装docker两种方式
ronin47
第一种是采用yum 方式
yum install -y docker
java-60-在O(1)时间删除链表结点
bylijinnan
java
public class DeleteNode_O1_Time {
/**
* Q 60 在O(1)时间删除链表结点
* 给定链表的头指针和一个结点指针(!!),在O(1)时间删除该结点
*
* Assume the list is:
* head->...->nodeToDelete->mNode->nNode->..
nginx利用proxy_cache来缓存文件
cfyme
cache
user zhangy users;
worker_processes 10;
error_log /var/vlogs/nginx_error.log crit;
pid /var/vlogs/nginx.pid;
#Specifies the value for ma
[JWFD开源工作流]JWFD嵌入式语法分析器负号的使用问题
comsci
嵌入式
假如我们需要用JWFD的语法分析模块定义一个带负号的方程式,直接在方程式之前添加负号是不正确的,而必须这样做:
string str01 = "a=3.14;b=2.71;c=0;c-((a*a)+(b*b))"
定义一个0整数c,然后用这个整数c去
如何集成支付宝官方文档
dai_lm
android
官方文档下载地址
https://b.alipay.com/order/productDetail.htm?productId=2012120700377310&tabId=4#ps-tabinfo-hash
集成的必要条件
1. 需要有自己的Server接收支付宝的消息
2. 需要先制作app,然后提交支付宝审核,通过后才能集成
调试的时候估计会真的扣款,请注意
应该在什么时候使用Hadoop
datamachine
hadoop
原帖地址:http://blog.chinaunix.net/uid-301743-id-3925358.html
存档,某些观点与我不谋而合,过度技术化不可取,且hadoop并非万能。
--------------------------------------------万能的分割线--------------------------------
有人问我,“你在大数据和Hado
在GridView中对于有外键的字段使用关联模型进行搜索和排序
dcj3sjt126com
yii
在GridView中使用关联模型进行搜索和排序
首先我们有两个模型它们直接有关联:
class Author extends CActiveRecord {
...
}
class Post extends CActiveRecord {
...
function relations() {
return array(
'
使用NSString 的格式化大全
dcj3sjt126com
Objective-C
格式定义The format specifiers supported by the NSString formatting methods and CFString formatting functions follow the IEEE printf specification; the specifiers are summarized in Table 1. Note that you c
使用activeX插件对象object滚动有重影
蕃薯耀
activeX插件 滚动有重影
使用activeX插件对象object滚动有重影 <object style="width:0;" id="abc" classid="CLSID:D3E3970F-2927-9680-BBB4-5D0889909DF6" codebase="activex/OAX339.CAB#
SpringMVC4零配置
hanqunfeng
springmvc4
基于Servlet3.0规范和SpringMVC4注解式配置方式,实现零xml配置,弄了个小demo,供交流讨论。
项目说明如下:
1.db.sql是项目中用到的表,数据库使用的是oracle11g
2.该项目使用mvn进行管理,私服为自搭建nexus,项目只用到一个第三方 jar,就是oracle的驱动;
3.默认项目为零配置启动,如果需要更改启动方式,请
《开源框架那点事儿16》:缓存相关代码的演变
j2eetop
开源框架
问题引入
上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲。
该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲。
当然去看相关实现代代码的时候,大致是下面的样子。
[java]
view plain
copy
print
?
public vo
AngularJS浅析
kvhur
JavaScript
概念
AngularJS is a structural framework for dynamic web apps.
了解更多详情请见原文链接:http://www.gbtags.com/gb/share/5726.htm
Directive
扩展html,给html添加声明语句,以便实现自己的需求。对于页面中html元素以ng为前缀的属性名称,ng是angular的命名空间
架构师之jdk的bug排查(一)---------------split的点号陷阱
nannan408
split
1.前言.
jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.ou
如何对10亿数据量级的mongoDB作高效的全表扫描
quentinXXZ
mongodb
本文链接:
http://quentinXXZ.iteye.com/blog/2149440
一、正常情况下,不应该有这种需求
首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提出来。要知道,对于一般较大数据量的数据库,全表查询,这种操作一般情况下是不应该出现的,在做正常查询的时候,如果是范围查询,你至少应该要加上limit。
说一下,
C语言算法之水仙花数
qiufeihu
c 算法
/**
* 水仙花数
*/
#include <stdio.h>
#define N 10
int main()
{
int x,y,z;
for(x=1;x<=N;x++)
for(y=0;y<=N;y++)
for(z=0;z<=N;z++)
if(x*100+y*10+z == x*x*x
JSP指令
wyzuomumu
jsp
jsp指令的一般语法格式: <%@ 指令名 属性 =”值 ” %>
常用的三种指令: page,include,taglib
page指令语法形式: <%@ page 属性 1=”值 1” 属性 2=”值 2”%>
include指令语法形式: <%@include file=”relative url”%> (jsp可以通过 include