什么是弱引用
弱引用实例: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,内存泄漏)
已解决java.lang.ClassNotFoundException:报错问题
王蘸蘸
bug修复 java python pycharm
在Java开发中,java.lang.ClassNotFoundException是一个常见但令人头痛的问题。当应用程序在运行时找不到指定的类时,就会抛出这个异常。本文将详细探讨ClassNotFoundException的原因、常见场景,并提供解决方案和最佳实践。一、问题分析java.lang.ClassNotFoundException是一个被检查的异常(CheckedException),通
Perf-linux服务器性能测试
进阶的小猫
压测和性能测试 linux 运维 python
1.压测基础数据准备:压测的环境:2.压测时关注服务端性能内存:50%以下CPU:一般小于75%,平均每核CPU的load小于1网络带宽:磁盘:IO:数据库:JVM:小于80%fullGC频率:小于半小时一次响应时间:小于期望值20,30,50,100ms错误率:低于0.5‰如何做服务器压测-入门级-简书https://www.jianshu.com/p/0b1f2f3b4bbd实现一个简单的压测
对领域驱动设计(DDD)的学习成果
huaishu
架构
领域驱动设计之领域模型2004年EricEvans发表Domain-DrivenDesign–TacklingComplexityintheHeartofSoftware(领域驱动设计),简称EvansDDD。领域驱动设计分为两个阶段:以一种领域专家、设计人员、开发人员都能理解的“通用语言”作为相互交流的工具,在不断交流的过程中不断发现一些主要的领域概念,然后将这些概念设计成一个领域模型;由领域模
模板-富文本
晓风残月Yuperman
nginx 运维
博主介绍:大家好,我是想成为Super的Yuperman,互联网宇宙厂经验,17年医疗健康行业的码拉松奔跑者,曾担任技术专家、架构师、研发总监负责和主导多个应用架构。近期专注:RPA应用研究,主流厂商产品使用,开源RPA应用,包括UI.Vision、taskUI、taskt、OpenRpa、RobotFramework等技术范围:长期专注java体系,软件架构,DDD,多年java、golang、
Java高级:mysql创建用户密码
字节全栈_kYu
java mysql 开发语言
为查询缓存优化你的查询EXPLAIN你的SELECT查询当只要一行数据时使用LIMIT1为搜索字段建索引在Join表的时候使用相当类型的例,并将其索引千万不要ORDERBYRAND()避免SELECT*永远为每张表设置一个ID使用ENUM而不是VARCHAR从PROCEDUREANALYSE()取得建议尽可能的使用NOTNULLPreparedStatements无缓冲的查询把IP地址存成UNSI
AIGC的底层框架和技术模块
五岔路口
AIGC
AIGC(ArtificialIntelligenceGeneratedContent,人工智能生成内容)的底层框架和技术模块是构建其强大自然语言处理能力的核心组成部分。以下是对AIGC底层框架和技术模块的详细解析:底层框架AIGC的底层框架主要基于深度学习的语言模型,特别是Transformer模型及其变种,如GPT(GenerativePre-trainedTransformer)等。这些模型
101算法javaScript描述【3】
2401_89317507
算法 javascript java
通常情况下,不能出现超过连续三个相同的罗马数字并且罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况:I可以放在V(5)和X(10)的左边,来表示4和9。X可以放在L(50)和C(100)的左边,来表示40和90。C可以放在D(500)和M(1
LeetCode—406.根据身高重建队列(Queue Reconstruction by Height)——分析及代码(Java)
江南土豆
数据结构与算法 LeetCode Java 题解
LeetCode—406.根据身高重建队列[QueueReconstructionbyHeight]——分析及代码[Java]一、题目二、分析及代码1.贪心算法(1)思路(2)代码(3)结果三、其他一、题目假设有打乱顺序的一群人站成一个队列。每个人由一个整数对(h,k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。编写一个算法来重建这个队列。注意:总人数少于1100人。示
java xml dom 解析_解析 XML DOM
十二月极光
java xml dom 解析
解析XMLDOM大多数浏览器都内建了供读取和操作XML的XML解析器。解析器把XML转换为JavaScript可存取的对象。实例W3School提供的实例独立于浏览器和平台。这些实例可在所有现代浏览器中运行。解析XML所有现代浏览器都内建了用于读取和操作XML的XML解析器。解析器把XML读入内存,并把它转换为可被JavaScript访问的XMLDOM对象。微软的XML解析器与其他浏览器中的解析器
JavaScript网页设计实战:微信登录 + 获取用户头像和昵称
James吖
javascript 微信 前端 开发语言 目标检测 ecmascript 神经网络
引言在现代Web开发中,社交媒体登录已经成为提升用户体验的一个重要组成部分。微信登录因其广泛的用户基础和便捷的登录方式,深受开发者和用户的喜爱。本文将通过一个实战案例,介绍如何在JavaScript网页应用中集成微信登录功能,并获取用户的头像和昵称。前提条件在开始之前,请确保你已经具备以下条件:已经在微信开放平台上注册并创建了应用,获取到了AppID和AppSecret。了解基本的HTML、CSS
lua-文件操作代码大全
James吖
lua java java
1.创建新文件--使用File类import"java.io.File"--导入File类File(文件路径).createNewFile()--使用io库io.open("/sdcard/aaaa",'w')2.创建新文件夹--使用File类import"java.io.File"--导入File类File(文件夹路径).mkdir()--创建多级文件夹File(文件夹路径).mkdirs()-
2025最新版Java面试八股文大全
m0_74823452
java 面试 开发语言
一、Java并发面试题1、ThreadLocal1.1谈谈你对ThreadLocal的理解?ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量,只是针对当前线程的全局变量。1.2ThreadLocal底层实现原理?Threadlocal内部有一个非常关键的内部类ThreadlocalMap,里面定义了一个由key-
XML DOM 改变节点值
shangaoo
xml java 前端
nodeValue属性用于改变节点值。setAttribute()方法用于改变属性值。尝试一下-实例下面的实例使用XML文件books.xml。函数loadXMLDoc(),位于外部JavaScript中,用于加载XML文件。改变元素的文本节点本例使用nodeValue属性来改变"books.xml"中第一个元素的文本节点。通过使用setAttribute来改变属性值本例使用setAttribut
Moodle参考架构在AWS上的部署指南
廉彬冶Miranda
Moodle参考架构在AWS上的部署指南aws-refarch-moodleMoodleReferenceArchitecturewithsupportingCloudFormationtemplates项目地址:https://gitcode.com/gh_mirrors/aw/aws-refarch-moodle1.项目基础介绍和主要编程语言项目基础介绍Moodle参考架构是一个在Amazon
XMLDOM之浏览器差异
dengguxinghe4335
javascript xhtml ViewUI
DOM解析中的浏览器差异所有现代浏览器都支持w3cDOM规范,不过浏览器之间是有差异的,重要的区别有两点:加载XML的方式;处理空白和换行的方式;1、加载XML的方式:所有现代浏览器都内建了用于读取和操作XML的XML解析器。解析器把XML读入内存,并把它转换为可被JavaScript访问的XMLDOM对象;微软的XML解析器与其他浏览器中的解析器是有差异的。微软的解析器支持对XML文件和XML字
LeetCode:406. 根据身高重建队列(Java 贪心)
Cosmoshhhyyy
LeetCode leetcode 算法 职场和发展
目录406.根据身高重建队列题目描述:实现代码与解析:贪心原理思路:406.根据身高重建队列题目描述:假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[hi,ki]表示第i个人的身高为hi,前面正好有ki个身高大于或等于hi的人。请你重新构造并返回输入数组people所表示的队列。返回的队列应该格式化为数组queue,其中queu
RPC 和 RESTFUL
快乐的小三菊
java 基础 java
一、网络分层聊今天的话题之前,先普及个关于网络架构的分层的知识,在当前的世界中,有两套网络的参考模型,一套是OSI参考模型,一套是TCP/IP的参考模型。对于java开发而言,我们只需要知道现在用的是TCP/IP模型,这个模型分为四层就可以了。OSI参考模型(OpenSystemsInterconnectionReferenceModel):包括七层,这个模型过于理想化,未能在因特网中进行广泛推广
【 书生·浦语大模型实战营】学习笔记(三):“茴香豆” 搭建你的RAG 智能助理
GoAI
自然语言处理NLP 深入浅出AI 深入浅出LLM 深度学习 LLM 人工智能 大模型
AI学习星球推荐:GoAI的学习社区知识星球是一个致力于提供《机器学习|深度学习|CV|NLP|大模型|多模态|AIGC》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于前沿论文解读、资料共享、行业最新动态以、实践教程、求职相关(简历撰写技巧、面经资料与心得)多方面综合学习平台,强烈推荐AI小白及AI爱好者学习,性价比非常高!加入星球➡️点击链接【书生·
JavaScript-黑马程序员-前端零基础
羊羊的代码笔记本
javascript 前端 html
目录1.初识JavaScript1.1浏览器执行js1.2js的组成1.3js三种书写方式1.4JavaScript输入输出语句2.变量2.1变量是一个装东西的容器2.2变量是使用2.3更新变量2.4声明多个变量1.初识JavaScript是一种高级编程语言1.1浏览器执行js浏览器分成两部分:渲染引擎和js引擎渲染引擎:用来解析HTML和CSS,俗称内核js引擎:也称为js解释器。用来读取网页中
仓库管理系统,Java+Vue,含源码及详细文档,助力高效仓储管理
瓯雅爱分享
源码下载 软件工程 java mysql vue 源代码管理
前言:仓库管理系统是一个关键的供应链管理软件,它帮助企业和组织有效地追踪库存、管理仓库运营,并优化物流流程。以下是对仓库管理系统各部分的详细解释:一、入库管理入库管理模块负责处理所有入库操作,包括接收货物、验收、分类、上架等步骤。它具有以下功能:预约入库:允许供应商或运输公司提前通知仓库,以便做好接收准备。货物验收:检查货物的数量、质量、规格等是否与订单相符。分类与编码:根据货物的属性进行分类,并
Docker Ubuntu 20.04执行CI任务交叉编译riscv64-linux-gcc时no such file or directory
Wentao Wu
第一次接触rsicv64的交叉编译环境(其他交叉编译环境也基本没接触过,只是知道概念和原理),目前的需求是需要在gitlab上给一套rsicv64-linux-gcc执行CI任务,默认直接在本地服务器执行交叉编译,需要经常清理服务器文件,且成熟的开发环境不适合作为测试环境来运行,因此考虑将CI任务直接在Docker中执行,也需要配置最小化且测试环境最干净的Docker镜像。手工在服务器执行,全套流
JAVA深拷贝与浅拷贝(呕心沥血之作)
Ra1n .
JAVA java intellij-idea 软件工程
JAVA深拷贝与浅拷贝①对于Java拷贝的理解②浅拷贝一、图解二、代码举例三、适用情况③深拷贝一、图解二、代码举例三、适用情况①对于Java拷贝的理解 在JAVA语言中,我们常常会需要用到拷贝操作,当我们需要用到拷贝一个JAVA对象的时候,JAVA中常见的有四种拷贝方式: 一、使用stream(这是java中传统的文件复制方式。这里创建两个文件-source和destination。然后从so
java map深拷贝_java Map深度复制问题
weixin_39860732
java map深拷贝
展开全部这里的pos是基础类型,不是引用类型,不需要拿出来单独复制,浅clone就可e5a48de588b63231313335323631343130323136353331333332613737以了,但是attr这个map需要进行深度复制,因为这个是引用类型,复制后的对象修改该属性依然会影响源对象clone方法可以简单写为@OverrideprotectedObjectclone()thro
java map深拷贝_关于HashMap的浅拷贝深拷贝
K8S技术社区
java map深拷贝
Map中存储的都是String,不是基本数据类型的,这个有很大影响;putAll()和clone()对基本数据类型的数据是没有问题的,但是引用类型还是不行。HashMap的浅拷贝clone()方法一、创建一个HashMap对象source,进行赋值,然后再克隆一个对象targetMap出来。通过改变targetMap的值,观察source与targetMap的变化。HashMapsource=ne
1246. 等差数列
Taoger_Xu
算法
文章目录题目大意:题目分析AC代码题目大意:题目分析读题的时候首先想到了差分,后来发现是一道思维题,Si=Ai-Ai-1,如果满足等差数列,假设所给的n项之间间隔分别为S1,S2...Sk,设公差为d,则满足Si=ki*d,如果Si=kd,那么ai-1后面要添加的数为k,例如2,88-2=6=3*2,则2后面需要添加4,6,8三项构成等差。所以等差d为差分数组的gcdAC代码#include#in
Docker 本地导入镜像“exec: \“/bin/bash\“: stat /bin/bash: no such file or directory“: unknown
thlqq
docker 容器
详细报错信息dockerrun-itubuntu:v2/bin/bashdocker:Errorresponsefromdaemon:OCIruntimecreatefailed:container_linux.go:296:startingcontainerprocesscaused"exec:\"/bin/bash\":stat/bin/bash:nosuchfileordirectory":
MapUtils常用方法
qq_41482600
java基础 开发语言
1、摘要MapUtils是一个用于处理Map对象的实用工具类,它提供了许多方便的方法来执行常见的操作,如获取值、设置默认值、合并Map等。本文将介绍MapUtils的常见用法,以帮助你更轻松地处理Map数据。2、前言在Java编程中,Map是一种常用的数据结构,用于存储键值对。然而,处理Map数据时,经常需要进行一些繁琐的操作,例如检查键是否存在,获取键对应的值,或者在键不存在时设置默认值。为了简
SpringBoot核心组件详细解析
德乐懿
后端 spring boot 后端 java
SpringBoot核心组件详细解析SpringBoot作为当前Java领域最流行的微服务框架之一,其核心组件的设计与应用对于开发高效、稳定的应用程序至关重要。本文将详细解析SpringBoot的核心组件,包括SpringBoot框架本身、Spring、SpringMVC、数据库连接池等,通过阐述每个组件的作用、特点、使用场景,并结合实际案例,深入分析SpringBoot核心组件之间的关联性和依赖
python爬虫之JS逆向入门,了解JS逆向的原理及用法(18)
盲敲代码的阿豪
python之爬虫系统教学 python 爬虫 javascript JS逆向
文章目录1.JS逆向是什么?2、如何分析加密参数并还原其加密方式?2.1分析JS加密的网页2.2编写python代码还原JS加密代码3、案例测试4、操作进阶(通过执行第三方js文件实现逆向)4.1python第三方模块(execjs)4.2调用第三方js文件完成逆向操作4.3总结1.JS逆向是什么?什么是JS加密?我们在分析某些网站的数据接口时,经常会遇到一些密文参数,这些参数实际就是通过Java
读书笔记-《Spring技术内幕》(一)IoC容器的实现
萝卜青今天也要开心
spring java 后端 笔记
如今已是2024年,掌握Spring早已是Java从业人员的基本要求。Spring帮我们屏蔽掉了许多繁琐的工作,使我们可以把重心放在业务逻辑上。但也因此,要深刻体会到Spring带来的便捷性,反倒需要与没有使用Spring时作对比。为此,我特地翻了下上大学时用JaveWeb开发的项目(无框架),希望能让大家更好理解。01SpringIoC容器概述Spring的架构图如上所示,IoC与AOP都是Sp
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