JVM ( Java Virtual Machine):Java虚拟机
目录
一、java内存区域与内存溢出异常
1、运行时数据区域
1.1 程序计数器(线程私有)
1.2 java虚拟机栈(线程私有)
1.3 本地方法栈(线程私有)
1.4 Java堆(线程共享)
1.5 方法区(线程共享)
1.6 运行时常量池(线程共享)
2、Java堆溢出
二、垃圾回收与内存分配策略
1、垃圾回收
1.1 何判断对象已死
1.2 finalize( )方法:
1.3 引用类型
1.4 回收方法区
1.5 垃圾回收算法
1.6 垃圾回收器
2、内存分配策略
2.1 对象优先在Eden上分配
2.2 大对象直接进入老年代
2.3 长期存活对象进入老年代
2.4 动态对象年龄判定
2.5 空间分配担保
三、java内存模型
1、主内存与工作内存
四、volatile变量的特殊规则
1、保证此变量对所有线程可见性
2、使用volatile变量的语义是禁止指令重排
一、java内存区域与内存溢出异常
1、运行时数据区域
JVM会在会在java程序运行的过程中,将它所管理的内存划分为若干个不同的数据区域。这些数据区域各有各的用途,各有各的创建于销毁时间,有的区域随着JVM的创建与启动而存在,有的区域依赖用户线程的启动与结束而创建和销毁。一般来说,JVM锁管理的区域包含以下几个运行时数据区域:
线程私有:程序计数器、java虚拟机栈、本地方法栈
线程共享:java堆、方法区、运行时常量池,直接内存
1.1 程序计数器(线程私有)
程序计数器是一块较小的内存空间;
如果当前线程正在执行一个java方法,这个计数器记录的是正在执行的虚拟机字节码指令地址;
如果正在执行的是一个Native方法,这个计数器值为空。
所谓的线程私有,就是说各个线程的计数器独立存储,互不影响。
1.2 java虚拟机栈(线程私有)
虚拟机栈描述的是java方法执行的内存模型: 每一个java方法执行的同时,都会创建一个栈帧用于存放局部变量表,操作数栈,动态链接,方发出口等信息。每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中入栈和出栈的过程。生命周期与线程相同。
之前一直说的栈区域实际上就是此处的虚拟机栈,再详细一点,就是虚拟机栈中的局部变量表。
局部变量表: 存放了编译器所知的各种基本数据类型(8中基本数据类型),对象引用。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这些方法需要在栈帧中分配多大的局部变量空间是完全确定的,在执行期间不会改变局部变量表大小。
在这个区域会产生以下两种异常:
如果线程请求栈的深度大于虚拟机所允许的最大深度,会抛出StackOverflowError异常(这里可以通过-Xss这个虚拟机参数来指定栈容量)
虚拟机在动态扩展时无法申请到足够的内存,或抛出OOM(OutOfMemoryError)异常
1.3 本地方法栈(线程私有)
本地方法栈与java虚拟机栈的作用是一样的,两者的区别是本地方法栈为虚拟机使用Native方法服务,而虚拟机栈为虚拟机使用java方法服务。
本地方法(Native方法):使用一些其他语言(C, C++ 或 汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。
在Hotspot虚拟机中,Java虚拟机栈和本地方法栈是同一块内存区域。
1.4 Java堆(线程共享)
Java堆是JVM所管理的最大区域,Java堆是所有线程共享的一块区域,在JVM启动时创建。此内存存放的都是对象实例。JVM规范中说到:所有的对象实例以及数组都要在堆上分配。
java堆是垃圾回收器管理的主要区域,因此又叫“GC 堆”。根据JVM规范规定的内容:Java堆可以处于物理上内存不连续的内存空间中。Java堆在主流的虚拟机中都是可扩展的(-Xmx设置最大值, -Xms设置最小值)。
如果堆中没有足够的内存完成实例分配并且对也无法在扩展时,会抛出OOM(OutOfMemoryError)异常。
1.5 方法区(线程共享)
方法区用于存放已被加载过的类信息,常量,静态变量,即时编译器编译(它把字节码转换为可执行的机器码)后的代码等数据。
和堆一样不需要连续的内存,可以动态扩展,当方法区无法满足动态内存需求时(扩展失败),一样会抛出OutOfMemoryError异常
对这块区域进行垃圾回收的主要目标是对常量池的回收和对类的卸载,但是一般比较难以实现。
在JDK8之前的HotSpoot虚拟机中,方法区也被称为“永久代”(永久代并不是意味着进入方法区之后就永久存在),但是永久代的大小很难确定,因为它收很多因素的影响,并且每次FullGC后永久代的大小都会改变,所以经常会抛出OutOfMemoryError异常,为了更方便管理方法区,JDK8移除永久代,并把方法区移至元空间,它位于本地方法中,而不是虚拟机内存中。
1.6 运行时常量池(线程共享)
运行时常量池是方法区的一部分,存放了 字面量 和符号引用
字面量: 字符串(JDK1.7之后移到堆中)、final常量、基本数据类型的值
符号引用: 类和结构的完全限定名,字段的名称和描述符、方法的名称和描述符。
2、Java堆溢出
在上面说过了Java堆是用来存放对象实例的,只要我们不停创建对象,并且保证GC Roots到对象之间有可达路径来避免GC清除这些对象,那么在对象数量达到最大对容量后就会产生内存溢出异常。
Java堆内存的OOM异常是实际应用中最常见的内存溢出情况。当出现Java堆内存溢出时,异常堆栈信息java.lang.OutOfMemoryError会进一步提示Java heap space。当出现Java heap space 时,表示OOM发生在堆上。
内存溢出和内存泄漏:
内存泄漏:泄漏对象无法被GC(对象不能被回收)
内存溢出:内存对象确实还应该存活。此时要根据JVM堆参数与物理内存相比较检查是否还应该吧JVM堆内存调大;或者检查对象生命周期是否过长。(内存不够了,放不下)
二、垃圾回收与内存分配策略
1、垃圾回收
关于在这之前的Java运行时内存各个区域的分析:程序计数器、虚拟机栈、本地方法栈这三个部分的生命周期与线程相关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存自然就跟着线程回收了。因此下面说的内存分配和回收主要是针对Java堆区和方法区这两个区域。
1.1 如何判断对象已死
为对象添加一个 引用计数器,当对象增加一个引用时计数器加一;当对象减少一个引用时计数器减一;引用对象为0时对象可以被回收。
在两个对象出现循环引用的情况下,此时引用计数器永远不为0,导致无法对他们进行回收。正是由于这种循环引用的存在,Java虚拟机中不采用这种算法。
/**
* 循环引用举例
* */
public class Test
{
public Object instance = null;
public static void main (String[] args)
{
Test a = new Test();
Test b = new Test();
a.instance = b;
b.instance = a;
}
}
在Java虚拟机中,采用的是可达性分析算法来判断对象该不该被回收。
此算法的核心思想是:通过一系列称为“GC Roots”的对象作为起始点向下搜索,搜索走过的路径称为“引用链”,当一个对象到GCRoots没有任何引用链时(不可达),表名此对象不可用。
在java语言中,虚拟机使用可达性分析法判断对象是否可以被回收,GC Roots一般包含以下内容:
• 虚拟机栈中局部变量表中引用的对象
• 本地方法栈中JNI(Native方法)引用的对象
• 方法区中类静态属性引用的对象
• 方法区中常量引用的对象
上面之所以说的是可能会被回收,主要是因为还有一个finalize方法:
1.2 finalize( )方法:
即使一个对象在可达性分析算法中不可达,这个对象也并非 “非死不可” ,这时候它只是出于暂缓 “行刑” 的一个阶段要宣告一个对象真正死亡,至少还要经过两次的标记过程:
如果一个对象现在和GC Roots不可达,那么它将会被第一次标记并进行一次筛选筛选条件是此对象是否有必要执行finalize方法。
当此对象没有覆盖finalize方法或者此方法已经被JVM调用过了,虚拟机将这两种情况视为 “没有必要执行finalize方法”,此时这个对象才真正的死亡。
如果这个对象被判断有必要执行finalize方法,那么这个对象将被放进一个叫F-Queue的队列中,并在稍后由虚拟机自动建立一个低优先级的Finalize线程去执行它(也就是虚拟机会除法finalize方法)。finalize方法是一个对象脱离死亡的最后一次机会,稍后GC将对F-Queue中的对象进行二次标记,如果对象在finalize方法中自救成功(和GC Roots可达),那么在第二次标记时它将会被移出 “即将回收”的集合;如果对象这个时候还是没有逃离,那么它将被回收
注意:finalize方法只会执行一次,当一个对象快死了,它有可能直接死亡或者被finalize救活,当它被拯救后再一次快死亡的时候就直接死亡,不会再调用finalize方法。
1.3 引用类型
在JDK1.2之前,java中的引用定义很传统:如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。(这种定义很狭隘,一个对象在这种定义下只有引用和被引用两种状态)
在JDK1.2之后,对引用的概念进行了扩充,将引用分为强引用, 软引用, 弱引用和虚引用 四种 ,这四种引用强度依次递减。
强引用:强引用指的是在程序代码之中普遍存在的,类似于 “Object obj = new Object( ) ;”这类引用,只要强引用还存在,垃圾回收器永远不会回收掉被引用的对象(被强引用关联的对象不会被回收)
软引用:软引用是用来描述一些还有用但是不是必须的对象。对于软引用关联的对象,在系统将要发生内存溢出之前,会把这些对象列入回收范围之中进行二次回收,如果这次回收还是没有足够的内存,才会抛出内存溢出异常。JDK1.2之后,提供了SoftReference类来实现软引用。(被软引用关联的对象只有在内存不够的情况下才会被回收)
Object obj = new Onject();
SoftReference sf = new SoftReference(obj);
sf = null;//使对象只被软引用关联
弱引用:弱引用也是用来描述非必须对象的。弱引用一定会被回收,也就是说它只能存活到下一次垃圾回收之前。在JDK1.2之后,提供WeakReference来实现弱引用。
Object obj = new Onject();
WeakReference sf = new WeakReference(obj);
sf = null;//使对象只被弱引用关联
虚引用:虚引用是最弱的一种引用关系,又被称为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间造成任何影响,也无法通过虚引用来获取一个对象实例。为一个对象设置虚引用的唯一目的只是在这个对象被收集器回收时,收到一个系统通知。在JDK1.2后,提供了PhantomReference类来实现虚引用。
Object obj = new Onject();
PhantomReference sf = new PhantomReference(obj);
sf = null;//使对象只被虚引用关联
1.4 回收方法区
方法区的垃圾回收主要收集两部分内容:废弃常量 和无用的类 。
回收废弃常量 : 和回收java堆中的对象十分类似:以常量池中的直接字面量为例:假如现在一个字符串“abc”已经进入了常量池,但是当前系统中没有一个String类对象引用常量池中的“abc”常量,也没有在其他地方引用这个字面量,如果此时发生GC且有必要的话,这个“abc”常量就会被清理出常量池。常量池中的其他类(接口)、方法、字段的符号引用也与此类似。
判断一个类是否是无用类: 需要同时满足一下三个条件
该类所有实例都已经被回收(java堆中不存在该类的任何实例)
加载该类的ClassLoader已经被回收
该类对应的Class对象没有在任何其他地方被引用,无法在任何地方通过反射访问该类的方法
满足以上三个方法也仅仅是"可以",而不是"必然"
1.5 垃圾回收算法
标记清除算法
标记清除算法: 就是先遍历一遍标记出所有需要回收的对象,在遍历一遍回收所有标记的对象。
两个不足之处:
◆ 效率问题:遍历两次,效率低
◆ 标记清除后会产生大量碎片空间,导致程序需要分配一个大对象时没有足够的连续空间而不得不提前触发一次垃圾回收
复制算法(新生代回收算法)
复制算法: 将内存按容量大小分为大小相等的两块,每次只使用其中的一块。当这一块需要垃圾回收时,会将此区域上的存活对象复制到另一块上面,然后把已经使用过的内存清理掉。这样做的好处是每次只对整个半区进行垃圾回收,但同时每次只能使用一半的内存。
现在的商业虚拟机都是采用的这种算法来收集新生代的,但并不是将内存划分为两块一样的空间,而是一块较大的Eden和两块较小的Survivor空间。每次只是用Eden和其中的一块Survivor,垃圾回收时将Eden和使用的Survivor中存活的对象复制到另一块Survivor上,在清除Eden和刚刚使用的Survivor的空间。
当Survivor空间不够时,需要依赖其他内存(老年代)进行分配担保。
Hotspot默认Eden和Survivor的大小比例是 Eden :Survivor :Survivor = 8 :1 :1
复制算法在存活率高的时候会进行较多的复制,效率低下,因此在老年代一般不用此方法,老年代使用标记-整理算法
标记整理算法(老年代回收算法)
标记-整理算法: 标记过程与标记-清除一致,但后续步骤不是直接清理,而是将存活的对象都向一端移动,然后直接清理掉端边界以外的部分。
分代收集算法
分代收集算法: 当前JVM都采用的是分代收集算法,这个算法并没有什么新思想,而是根据对象的存活周期将内存分为不同的几个块。
一般情况下Java堆分为新生代 和老年代 。
在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此采用复制算法
在老年代中,对象存活率高,没有额外空间对它进行分配担保,因此必须采用“标记-清理”或者“标记-整理”算法
常见问题: 请问了解Minor GC和Full GC吗?
Minor GC 又称为新生代GC,指的是发生在新生代的垃圾收集。因为java对象大多数都是 “朝生夕死” 的对象,因此Minor GC非常频繁,一般回收速度也比较快;
Full GC 又称为老年代GC或者Major GC,指的是发生在老年代的垃圾收集,出现Major GC,经常会伴随至少一次的Minor GC(并非绝对:在Parallel Scavenge收集器中就有直接进行Full GC 的策略选择过程)。Major GC至少比Minor GC慢10倍以上。
1.6 垃圾回收器
Hotspot虚拟机中的7个垃圾收集器如下图(连线表示各拉机器可以配合使用):
串行:垃圾收集器与用户线程交替执行
并行:垃圾收集器与用户线程同时执行
单线程:垃圾收集器只使用一个线程
多线程:垃圾收集器使用多个线程
吞吐量:CPU运行用户线程的时间与CPU总消耗时间的比值
Serial :译为串行,它以串行方式执行,是一个单线程收集器
引用场景:Serial收集器是虚拟机运行在Client模式下的默认新生代收集器
优点是:简单高效,在单个CPU下没有线程交互的开销,因此拥有最高的单线程收集效率
注意:它的单线程并不意味着他只会使用一个CPU或一条收集线程去完成垃圾收集工作,而更重要的是它在进行垃圾收集时,必须 暂停其他所有工作线程,直到它收集结束。
ParNew:多线程收集器,它是Serial的多线程版本
ParNew收集器是许多运行在Server模式下的虚拟机中首选新生代收集器
Parallel Scavenge:多线程收集器,其他收集器的目标是尽量缩短用户线程的等待时间,而它则是达到一个可控制的吞吐量。
Parallel Scavenge收集器是新生代收集器,并行GC,使用的是复制算法
Serial Old:是Serial的老年代版本,单线程收集器,使用标记-整理算法
Parallel Old收集器:老年代收集器,并行GC,是Parallel Scavenge的老年版本,多线程,使用标记 - 整理算法
应用场景:在注重吞吐量以及CPU资源敏感的场合,可以考虑使用 Parallel Scavenge加Parallel Old收集器
CMS收集器:老年代收集器,并发GC,是一种以获取 最短回收停顿时间为目标的收集器
优点:并发收集,低停顿
缺点:CMS收集器对CPU资源非常敏感,面向并发设计的程序都对CPU资源比较敏感
CMS收集器无法处理浮动垃圾,可能出现“Concurrent Mode Failure”失败而导致另一次Full GC产生。
G1收集器它是一款面向服务端的垃圾回收器,在多CPU和大内存的场景下有很好的性能。
堆被分为新生代和老年代,其他收集器在进行垃圾收集时收集范围都是整个新生代或者整个老年代,而G1可以直接对新生代和老年代一起回收。
G1把堆分为多个大小相等的独立区域(Region),新生代和老年代不再物理隔离。
通过region的概念的引入,从而将原来一整块内存空间划分为多个小空间,使得每个小空间可以单独进行垃圾回收,这种划分方法带来的很大的灵活性,使得可预测的停顿时间模型变成可能。通过记录每个region垃圾回收时间以及回收所得的空间,并维护一个优先列表,每次根据允许的收集时间优先回收价值最大的region。
G1具备如下特点:
空间整合:从整体上来看是基于“标记 - 整理算法”实现的收集器,从局部来看,是基于复制算法实现的,这意味着运行过程中不会产生内存空间碎片。
可预测的停顿:能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在GC上的时间不超过N毫秒。
2、内存分配策略
2.1 对象优先在Eden上分配
大多数情况下,对象在新生代Eden中分配。当Eden中没有足够的空间进行分配时,虚拟机将发生一次Minor GC。
2.2 大对象直接进入老年代
大对象:指的是需要大量连续空间的Java对象,最典型的大对象就是那种很长的字符串以及数组。大对象对虚拟机的内存分配是一个坏消息,经常出现大对象容易导致内存还有不少空间时就提前触发GC以获取足够的连续空间来放置大对象。
虚拟机提供了一个-XX:pretenureSizeThreshold参数,令大于这个设置的值的对象直接在老年代分配。这样做的目的是在于避免Eden区以及两个Survivor区之间发生大量的内存复制(新生代采用复制算法收集内存)
2.3 长期存活对象进入老年代
虚拟机给每个对象定义了一个对象年龄计数器(Age)。如果对象在Eden出生斌经过一次Minor GC后仍然存活,并且能被Survivor容纳,将被移动到Survivor空间中,并且把对象年龄设为1,对象在Survivor中每熬过一次Minor GC,年龄就会增加一岁。当他的年龄增加到一定程度,将晋升到老年代中,对象晋升到老年代中的年龄阈值,可以通过-XX:MaxTenuringThreshold设置。
2.4 动态对象年龄判定
为了更好的适应不同程序的内存状况,JVM并不是永远要求对象的年龄达到MaxTenuringThreshold才能景升到老年代。如果在Survivor中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。无需等到MaxTenuringThreshold的年龄要求。
2.5 空间分配担保
在发生Minor GC之前,虚拟机会检查老年代最大连续的可用空间是否大于新生代所有对象的总空间,如果大于,则此次MinorGC是安全的;如果小于,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败,如果HandlePromotionFailure=true,,那么会继续检查老年代最大可用连续空间是否大于历次晋升到老年代的对象的平均大小。如果大于,则尝试进行一次Minor GC,但这次Minor GC是有风险的;如果小于或者HandlePromotionFailure = false,则改为进行一次Full GC。
三、java内存模型
JVM定义了一种java的内存模型(JMM),用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各个平台下都能达到一致的内存访问效果。(C/C++直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台下的内存模型的差异,可能导致程序在不同平台上运行出现并发访问错误)
1、主内存与工作内存
java内存模型的主要目标是定义程序中各个变量的访问规则,即在JVM中将变量存入内存和从内存中取出变量这样的底层细节。此处的变量包括实例字段,静态字段和构成数组对象的元素,但不包括局部变量和方法参数,因为或两者线程是私有的,不会被线程共享。
java内存模型规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存拷贝副本,线程对变量的所有操作(读取,赋值等等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。线程、主内存和工作内存之间的关系如下:
主内存与工作内存之间的具体交互协议,即一个变量如何从主内存中拷贝到工作内存、如何从工作内存中同步会主内存之类的实现细节,java内存模型中定义了如下八种操作来完成。JVM实现时必须保证下面体积的每一种操作的原子性(不可再分)
lock(锁定):作用于主内存,他把一个变量标示为一条线程独占的状态。
unlock(解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才能被其他线程锁定。
read(读取):作用于主内存的变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用。
load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。
use(使用):作用于工作内存的变量,它把工作内存中一个变量的值传递给执行引擎。
assign(赋值):作用于工作内存的变量,它把一个从工作引擎接收到的值赋给工作内存中的变量。
store(存储):作用于工作内存的变量它把工作内存中一个变量的值传送到主内存中,以便后续的write操作。
write(写入):作用于主内存的变量,它把store操作从工作内存得到的值放入主内存的变量中。
Java内存模型的三大特性:
原子性:由java内存模型来直接保证原子性变量操作,包括read,load,assign,use,store和write。大致可以认为,基本数据类型的访问读写是具备原子性的。若需要更大范围的原子性,需要synchronized关键字约束。(即一个操作或者多个操作要么全部执行并且执行过程不会被其它任何因素打断,要么就都不执行)
可见性:可见性是指当一个线程修改了共享变量的值,其他线程就能够立即得知这个修改,volatile,synchronized,final三个关键字可以实现可见性
有序性:如果在本线程内观察,所有的操作都是有序的;如果在线程中观察另一个线程,所有的操作都是无序的。前半句表示线程内表现为串行,后半句指“指令重排”和“工作内存与主内存同步延迟”的现象。
四、volatile变量的特殊规则
1、保证此变量对所有线程可见性
volatile定义的变量,保证此变量对所有线程的可见性,这里的可见性指的是:当一条线程修改了这个变量的值,新值对于其他线程来说是立即得知的。(普通变量做不到这一点:普通变量的值在线程间传递均需要通过主内存来完成,例如 线程A修改一个普通变量的值,然后像主内存中进行回写,另一条线程B在线程A将新值写回主内存之后再从主内存中进行读取操作,新值才会对线程B可见)
volatile变量在各个线程中是一致的,但volatile变量的运算在并发下一样是不安全的,因为在java中并非原子操作。
volatile变量只保证可见性,在不符合以下两条规则的运算场景中,我们仍需要通过加锁(synchronized或lock)来保证原子性
运算结果并不依赖变量的当前值,或者能够保证只有单一的线程修改变量的值
变量不需要与其他状态变量共同参与不变约束
2、使用volatile变量的语义是禁止指令重排
volatile关键字的禁止指令重排序有一下意思:
当程序执行到volatile变量的读操作或者写操作时,在其前面的操作肯定全部已经执行,且结果已经对后面的可见,在其后面的肯定还没有执行。
在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行
//flag 为 volatile 变量
x = 2; // 语句1
y = 3; // 语句2
flag = true; // 语句3
x = 4; // 语句4
y = 5; // 语句5
// 此时不能将语句3放到语句1,2前面;也不能将语句3放到4,5后面;
// 但是此时语句1,2的顺序、语句4,5的顺序不会做任何保证
你可能感兴趣的:(java知识总结,Java_学习篇)
你好,我是冴羽,我写了一套《前端大佬成长之路》
你好,我是冴羽。这么正式的开头说明我有了一个大动作。是的,我创建了自己的知识星球:“冴羽·前端大佬成长之路”。重点一:新的一年,我会在知识星球更新一套“前端大佬成长之路”的课程。包含目标规划篇、学习方法篇、前端学习篇、个人管理篇、职场发展篇、面试技巧篇、健康养生篇共7大篇章、40节文章。总结了我近十年的工作生活经验,让大家少走一些弯路,节省一些时间。重点二:但是帮助你全面成长,一套课程是不够的,必
JAVA_双指针练习_快乐数
陳長生.
JAVA_test java 算法 开发语言
题目:解析:先将一个数的各个位的平方加起来,将它赋值给一个值。然后创建两个指针变量,一个slow指向第一个位置的值,一个fast直线第二个位置的值,不管该数是不是快乐数,他们都会进入一个循环,如下所示:那既然是一个循环,那他们肯定会相遇,如果相遇的那个值是1,那么就是快乐数。代码:classSolution{publicintbitSum(intn){intsum=0;while(n!=0){in
获得周公解梦数据接口java_周公解梦接口调用示例
任重道远doing
获得周公解梦数据接口java
packagemainimport("io/ioutil""net/http""net/url""fmt""encoding/json")//----------------------------------//周公解梦调用示例代码-聚合数据//在线接口文档:http://www.juhe.cn/docs/64//----------------------------------constAP
JVM调优-学习篇
m0_74825172
面试 学习路线 阿里巴巴 jvm 学习
概述公司的江南白衣写了一篇关键业务系统的JVM参数推荐(2016热冬版)的文章,大牛的文章总是需要细细品读。这篇文章介绍大量的JVM调优参数,内容也比较多,本文只是列出我自己能理解的一些参数,暂时理解不了的参数就只能等以后自己实力到家了,再慢慢补充上来。性能调优参数-XX:AutoBoxCacheMaxJAVA进程启动的时候,会加载rt.jar这个核心包的,rt.jar包里的Integer自然也是
【NLP算法面经】NLP算法面经 -- 腾讯 VS 美团(附面题)
青松ᵃⁱ
NLP 百面百过 AI面试 NLP面试 算法面试 人工智能
博客主页:[青松]目录【NLP百面百过】大模型算法高频面题(全面整理ʘ‿ʘ)一、大模型(LLMs)基础面大模型(LLMs)架构篇注意力机制(Attention)篇Transformer理论篇二、大模型微调面有监督微调(SFT)篇高效微调篇提示学习篇人类对齐训练(RLHF)篇Prompt工程篇三、大模型进阶面大模型压缩篇分布式训练篇大模型魔改篇四、NLP任务实战面文本分类篇命名实体识别(NER)篇关
深度学习篇---深度学习相关知识点&关键名词含义
Ronin-Lotus
深度学习篇 深度学习 人工智能 机器学习 pytorch paddlepaddle python
文章目录前言第一部分:相关知识点一、基础铺垫层(必须掌握的核心基础)1.数学基础•线性代数•微积分•概率与统计2.编程基础3.机器学习基础二、深度学习核心层(神经网络与训练机制)1.神经网络基础2.激活函数(ActivationFunction)3.损失函数(LossFunction)4.优化算法(Optimization)5.反向传播(Backpropagation)6.正则化与调优三、进阶模型
深度学习篇---深度学习中的超参数&张量转换&模型训练
Ronin-Lotus
深度学习篇 深度学习 人工智能 paddlepaddle pytorch 超参数 张量转换 模型训练
文章目录前言第一部分:深度学习中的超参数1.学习率(LearningRate)定义重要性常见设置2.批处理大小(BatchSize)定义重要性常见设置3.迭代次数(NumberofEpochs)定义重要性常见设置4.优化器(Optimizer)定义重要性常见设置5.损失函数(LossFunction)定义重要性常见设置6.正则化(Regularization)定义重要性常见设置7.网络架构(Net
Java_类加载器
学编程的小程
Java java 开发语言 类加载器
小程一言类加载器的基础双亲委派模型核心思想优势各类加载器的职责类加载器的工作流程举例:如何在Java中使用类加载器启动类加载器、扩展类加载器与系统类加载器输出解释自定义类加载器类加载器与类冲突总结小程一言本专栏是对Java知识点的总结。在学习Java的过程中,学习的笔记,加入自己的思考,结合各种资料的整理。文章与程序一样,一定都是不完美的,因为不完美,才拥有不断追求完美的动力类加载器的基础首先要明
sqldeveloper链接java_安装正确的Java后,MacOS上的Oracle SQLDeveloper将无法打开
徐三守
我下载了OracleSQLDeveloper,但是当我打开它时,它说它需要最少的Java8并且给了我下载的网站。我继续下载Java10.0.1,但当我重新打开SQL时,它继续说它需要最少的Java8。我检查了Java10.0.1已经正确安装,我很确定它有。它显示在"系统偏好设置"中,单击此按钮可以打开Java控制面板。我还发现有人建议尝试这个命令:c:\ProgramFiles\Oracle\sq
深度学习篇---深度学习框架图像预处理&各部分组件
Ronin-Lotus
深度学习篇 程序代码篇 深度学习 人工智能 Python 机器学习 pytorch paddlepaddle 深度学习框架
文章目录前言第一部分:图像预处理PaddlePaddle图像预处理PyTorch图像预处理第二部分:框架各部分组件PaddlePaddle1.卷积层(ConvolutionalLayer)2.池化层(PoolingLayer)3.全连接层(FullyConnectedLayer)4.激活函数(ActivationFunction)5.优化器(Optimizer)6.归一化(Normalizatio
深度学习篇---张量&数据流动处理
Ronin-Lotus
深度学习篇 深度学习 人工智能 python TensorFlow Pytorch 张量 数据流动处理
文章目录前言第一部分:张量张量的基本概念1.维度标量(0维)向量(1维)矩阵(2维)三维张量2.形状张量运算1.基本运算加法减法乘法除法2.广播3.变形4.转置5.切片6.拼接7.矩阵分解8.梯度运算:深度学习框架中的张量运算1.自动求导2.硬件加速3.高度优化第二部分:数据流动与处理1.磁盘(硬盘或固态硬盘)读取数据写入数据2.内存(RAM)加载程序和数据数据交换3.缓存CPU缓存磁盘缓存4.数
HDFS分布式文件系统3-2 shell定期采集数据到HDFS
诺特兰德
hdfs hadoop 大数据
1、准备工作创建目录:/export/data/logs/log/export/data/logs/toupload2、在/export/data/logs目录下创建upload2HDFS.sh内容如下:#!/bin/bashexportJAVA_HOME=/export/servers/jdkexportJRE_HOME=$JAVA_HOME/jreexportCLASSPATH=.:JAVA_
深度学习篇---数据存储类型
Ronin-Lotus
深度学习篇 深度学习 人工智能 学习 笔记 C Python 数据类型
文章目录前言第一部分:C语言中的数据存储类型1.char(通常是8位)优点缺点2.short(通常是16位)优点缺点3.int(通常是32位)优点缺点4.long(通常是32位或64位)优点缺点5.longlong(通常是64位)优点缺点6.float(通常是32位)优点缺点7.double(通常是64位)优点缺点第二部分:Python中的数据存储类型1.int(整数类型)优点缺点2.float(
深度学习篇---深度学习框架
Ronin-Lotus
深度学习篇 深度学习 人工智能 python Pytorch TensorFlow paddlepaddle
文章目录前言第一部分:框架简介1.PyTorch简介特点动态计算图易于上手强大的社区支持与Python的集成度高核心组件2.TensorFlow简介特点静态计算图跨平台强大的生态系统Keras集成核心组件3.PaddlePaddle简介特点易于使用高性能工业级应用丰富的预训练模型核心组件第二部分:基本操作PyTorch基本操作TensorFlow基本操作PaddlePaddle基本操作总结前言以上
分支限界法 01背包 java_分支限界法解决01背包问题
weixin_39530509
分支限界法 01背包 java
分支限界法和之前讲的回溯法有一点相似,两者都是在问题的解的空间上搜索问题的解。但是两者还是有一些区别的,回溯法是求解在解的空间中的满足的所有解,分支限界法则是求解一个最大解或最小解。这样,两者在解这一方面还是有一些不同的。之前回溯法讲了N后问题,这个问题也是对于这有多个解,但是今天讲的01背包问题是只有一个解的。下面就讲讲分支限界法的基本思想。分支限界法常以广度优先或以最小消耗(最大效益)优先的方
Android车机DIY开发之学习篇(七)NDK交叉工具构建
勿忘初心91
车机DIY 学习 嵌入式硬件 arm开发 单片机
Android车机DIY开发之学习篇(七)NDK交叉工具构建1.ubuntu安装GCCsudoapt-getupdatesudoapt-getinstallgccg++sudogcc--versionsudog++--version2.测试GCCVSCODE中新建Hello.c编译#includeintmain(void){printf(“Hello,thisisaprogramcompiledb
awtk开发实践——学习篇28: image_animation(图片动画控件)
惺忪牛犊子
# awtk c语言 嵌入式
说明: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。 QQ群号:513683159【相互学习】内容来源: 官方的手册(免费获取)Pxx=该手册的对应页码xx github-awtk控件说明 关于image_animation_t控件(图片动画控件)介绍,对应书P164。(书中还有更详细内容
gcc 编译 java_编译GCC4.9
刘俊海
gcc 编译 java
从svncheckoutsvn://gcc.gnu.org/svn/gcc/trunk拿了GCC的最新代码,打算编译了学东西习学习C++11的东西,结果在configure的时候出现如下问题:BuildingGCCrequiresGMP4.2+,MPFR2.3.1+andMPC0.8.0+http://www.multiprecision.org/mpc下载mpc-1.0.2.tar.gzftp:
深度学习篇---Anaconda&LabelImg
Ronin-Lotus
深度学习篇 深度学习 人工智能 学习 python 程序人生 机器学习 计算机视觉
文章目录前言第一部分:Anaconda是什么?1.简介2.特点(1)包管理器Conda(2)环境管理(3)预装包(4)跨平台(5)社区支持3.安装WindowsLinux3.基本命令(1)conda--version(2)condaupdateconda(3)condacreate--namemyenvpython=3.6(4)condaactivatemyenv(5)condadeactivat
《我的大脑好厉害》作者: 赵思家
刘书朋
。。今日书朋推荐||编号:[1502]。。ISBN:9787559661197。。内容简介。。作者通过孩子们感兴趣的55个日常问题,带来了一门学校的老师不教但非常重要的课——脑科学。全书以基础篇、五感篇、情绪篇、学习篇、健康篇和未来篇六大篇章,为读者搭建了一个科学完整的脑科学知识框架。作为科普作家,赵思家很擅长把复杂、艰深的脑科学知识转化成俏皮有趣又不失严谨的文字,帮助每个孩子都能以轻松有趣的方式
网格化服务 java_准备好使用本机,服务网格化的Java Enterprise Cloud
cunfu6353
docker java kubernetes spring 大数据
网格化服务java重要要点服务网格透明地为微服务添加了必需的技术横切关注点。诸如路由,弹性或身份验证之类的问题成为服务网格的责任。应用程序代码变得更加精简,并更加关注实际的业务逻辑。Istio通过Sidecar代理容器透明地增强了诸如KubernetesPod之类的工作负载。带有现代应用程序服务器的JavaEE通过使开发人员能够实施精益业务逻辑,可以与云原生技术很好地集成。JavaEE,云原生和服
Python中pickle文件操作及案例-学习篇
Zorione
Python python 学习 开发语言
一、简介Pickle算是Python的一种数据序列化方法,它能够将对象转换为字节流,进而可以保存到文件中或通过网络传输给其他Python程序。这种方式非常适合快速简便地保存复杂的数据结构,例如列表、字典、自定义对象等。二、pickle文件的读写示例代码如下:importpickle#导入pickle操作的库#创建一个示例数据data={'name':'Tom','age':30,'is_stude
深度学习应用 - 大规模深度学习篇
绎岚科技
深度学习 算法 机器学习 深度学习 人工智能 算法 机器学习
序言在科技日新月异的今天,人工智能(AI\text{AI}AI)已成为推动社会进步与产业升级的关键力量。其中,深度学习作为AI领域的璀璨明珠,凭借其强大的数据处理能力和特征学习能力,正引领着一场前所未有的智能革命。大规模深度学习,作为深度学习技术的前沿阵地,更是将这一技术的潜力发挥到了极致。它不仅能够处理海量数据,还能在复杂场景中挖掘出更深层次的规律和知识,为科学研究、工业制造、医疗健康、智慧城市
AI学习指南深度学习篇-门控循环单元的调参和优化
俞兆鹏
AI学习指南 ai
AI学习指南深度学习篇:门控循环单元的调参和优化引言神经网络在处理序列数据(如文本、时间序列等)方面展现出了强大的能力。门控循环单元(GRU)是循环神经网络(RNN)的一种变体,具有较为简单的结构和强大的性能。为了充分发挥GRU的潜力,调参和优化过程至关重要。本文将深入探讨GRU中的调参技巧、训练过程优化及避免过拟合的方法。一、门控循环单元(GRU)简介1.1GRU的结构GRU的结构相对简单,它利
2023-4-6晨间日记
火球四十
今天是什么日子起床:6点50分就寝:23点40分天气:小雨心情:好纪念日:任务清单昨日完成的任务,最重要的三件事:1、陪儿子打篮球。2、《精准努力》看完第二章改进:1、早睡,最近睡得太晚,影响早起。2、读完《精准努力》学习篇。3晚饭不要太晚习惯养成:早起,阅读写作周目标·完成进度日更文章:2/7读完一本书:2/6运动:打篮球亲子关系:陪儿子一起打篮球学习·信息·阅读《精准努力》策略篇,六步循环成事
温暖日记陪跑Day054:十月复盘
温暖日记星球
十月最后一天,来个简单的复盘吧!(健康篇)坚持早起健康冥想半小时,慢慢调整生物钟,11点争取上床睡觉。这个月运动有点少,11月需要增加。视力修复间断了,11月坚持。(学习篇)温暖练字陪跑营顺利结营。宝贝们收获很大,让我更加有信心开始第二期。第二期明天拉群开营。在富婆营做了一次复盘分享,酱老板总结说很棒,也链接了一大批优秀的富婆。坚持听书,每周的樊登新书都听完。输出两张导图。每天坚持看书一页。输出一
android aes解密 java_使用AES进行Android加密/解密
Java架构月亮
android aes解密 java
importjava.security.AlgorithmParameters;importjava.security.SecureRandom;importjava.security.spec.KeySpec;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKey;importj
Java学习笔记04:Java_数组
JasonYangQ
Java java
文章目录1.数组1.1数组介绍1.2数组的定义格式1.2.1第一种格式1.2.2第二种格式1.3数组的动态初始化1.3.1什么是动态初始化1.3.2动态初始化格式1.3.3动态初始化格式详解1.4数组元素访问1.4.1什么是索引1.4.2访问数组元素格式1.4.3示例代码1.5内存分配1.5.1内存概述1.5.2java中的内存分配1.9数组的静态初始化1.9.1什么是静态初始化1.9.2静态初始
idea打开项目白屏
Stack Piston
intellij-idea java ide
解决方法:右键“最大化”================idea打开项目白板解决方案_idea打开白屏-CSDN博客IDEA2022CPU占用100%的问题及解决方法_java_脚本之家
理解力是智商的核心
浪漫的巴布亚企鹅
《高手父母》学习篇共读梳理。学习篇——老师和家长都应警惕的“形式训练说”。分为两个部分:一是对“形式训练说”的批判;二是作者对迁移的基本观点。在生活中常见的形式训练说一类是死记硬背。比如不理解的情况下背诵数学公式、摇头晃脑背诵经典、不结合语境背诵英语单词、背语文答案等等。可拍的是:死记硬背,助长的是思维的惰性,因为没有理解。认为记住就等于学习发生了。王老师结合自己的经验总结:“我这些年教过的一些孩
关于旗正规则引擎中的MD5加密问题
何必如此
jsp MD5 规则 加密
一般情况下,为了防止个人隐私的泄露,我们都会对用户登录密码进行加密,使数据库相应字段保存的是加密后的字符串,而非原始密码。
在旗正规则引擎中,通过外部调用,可以实现MD5的加密,具体步骤如下:
1.在对象库中选择外部调用,选择“com.flagleader.util.MD5”,在子选项中选择“com.flagleader.util.MD5.getMD5ofStr({arg1})”;
2.在规
【Spark101】Scala Promise/Future在Spark中的应用
bit1129
Promise
Promise和Future是Scala用于异步调用并实现结果汇集的并发原语,Scala的Future同JUC里面的Future接口含义相同,Promise理解起来就有些绕。等有时间了再仔细的研究下Promise和Future的语义以及应用场景,具体参见Scala在线文档:http://docs.scala-lang.org/sips/completed/futures-promises.html
spark sql 访问hive数据的配置详解
daizj
spark sql hive thriftserver
spark sql 能够通过thriftserver 访问hive数据,默认spark编译的版本是不支持访问hive,因为hive依赖比较多,因此打的包中不包含hive和thriftserver,因此需要自己下载源码进行编译,将hive,thriftserver打包进去才能够访问,详细配置步骤如下:
1、下载源码
2、下载Maven,并配置
此配置简单,就略过
HTTP 协议通信
周凡杨
java httpclient http 通信
一:简介
HTTPCLIENT,通过JAVA基于HTTP协议进行点与点间的通信!
二: 代码举例
测试类:
import java
java unix时间戳转换
g21121
java
把java时间戳转换成unix时间戳:
Timestamp appointTime=Timestamp.valueOf(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:m
web报表工具FineReport常用函数的用法总结(报表函数)
老A不折腾
web报表 finereport 总结
说明:本次总结中,凡是以tableName或viewName作为参数因子的。函数在调用的时候均按照先从私有数据源中查找,然后再从公有数据源中查找的顺序。
CLASS
CLASS(object):返回object对象的所属的类。
CNMONEY
CNMONEY(number,unit)返回人民币大写。
number:需要转换的数值型的数。
unit:单位,
java jni调用c++ 代码 报错
墙头上一根草
java C++ jni
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000777c3290, pid=5632, tid=6656
#
# JRE version: Java(TM) SE Ru
Spring中事件处理de小技巧
aijuans
spring Spring 教程 Spring 实例 Spring 入门 Spring3
Spring 中提供一些Aware相关de接口,BeanFactoryAware、 ApplicationContextAware、ResourceLoaderAware、ServletContextAware等等,其中最常用到de匙ApplicationContextAware.实现ApplicationContextAwaredeBean,在Bean被初始后,将会被注入 Applicati
linux shell ls脚本样例
annan211
linux linux ls源码 linux 源码
#! /bin/sh -
#查找输入文件的路径
#在查找路径下寻找一个或多个原始文件或文件模式
# 查找路径由特定的环境变量所定义
#标准输出所产生的结果 通常是查找路径下找到的每个文件的第一个实体的完整路径
# 或是filename :not found 的标准错误输出。
#如果文件没有找到 则退出码为0
#否则 即为找不到的文件个数
#语法 pathfind [--
List,Set,Map遍历方式 (收集的资源,值得看一下)
百合不是茶
list set Map遍历方式
List特点:元素有放入顺序,元素可重复
Map特点:元素按键值对存储,无放入顺序
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身
解决SimpleDateFormat的线程不安全问题的方法
bijian1013
java thread 线程安全
在Java项目中,我们通常会自己写一个DateUtil类,处理日期和字符串的转换,如下所示:
public class DateUtil01 {
private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public void format(Date d
http请求测试实例(采用fastjson解析)
bijian1013
http 测试
在实际开发中,我们经常会去做http请求的开发,下面则是如何请求的单元测试小实例,仅供参考。
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import
【RPC框架Hessian三】Hessian 异常处理
bit1129
hessian
RPC异常处理概述
RPC异常处理指是,当客户端调用远端的服务,如果服务执行过程中发生异常,这个异常能否序列到客户端?
如果服务在执行过程中可能发生异常,那么在服务接口的声明中,就该声明该接口可能抛出的异常。
在Hessian中,服务器端发生异常,可以将异常信息从服务器端序列化到客户端,因为Exception本身是实现了Serializable的
【日志分析】日志分析工具
bit1129
日志分析
1. 网站日志实时分析工具 GoAccess
http://www.vpsee.com/2014/02/a-real-time-web-log-analyzer-goaccess/
2. 通过日志监控并收集 Java 应用程序性能数据(Perf4J)
http://www.ibm.com/developerworks/cn/java/j-lo-logforperf/
3.log.io
和
nginx优化加强战斗力及遇到的坑解决
ronin47
nginx 优化
先说遇到个坑,第一个是负载问题,这个问题与架构有关,由于我设计架构多了两层,结果导致会话负载只转向一个。解决这样的问题思路有两个:一是改变负载策略,二是更改架构设计。
由于采用动静分离部署,而nginx又设计了静态,结果客户端去读nginx静态,访问量上来,页面加载很慢。解决:二者留其一。最好是保留apache服务器。
来以下优化:
java-50-输入两棵二叉树A和B,判断树B是不是A的子结构
bylijinnan
java
思路来自:
http://zhedahht.blog.163.com/blog/static/25411174201011445550396/
import ljn.help.*;
public class HasSubtree {
/**Q50.
* 输入两棵二叉树A和B,判断树B是不是A的子结构。
例如,下图中的两棵树A和B,由于A中有一部分子树的结构和B是一
mongoDB 备份与恢复
开窍的石头
mongDB备份与恢复
Mongodb导出与导入
1: 导入/导出可以操作的是本地的mongodb服务器,也可以是远程的.
所以,都有如下通用选项:
-h host 主机
--port port 端口
-u username 用户名
-p passwd 密码
2: mongoexport 导出json格式的文件
[网络与通讯]椭圆轨道计算的一些问题
comsci
网络
如果按照中国古代农历的历法,现在应该是某个季节的开始,但是由于农历历法是3000年前的天文观测数据,如果按照现在的天文学记录来进行修正的话,这个季节已经过去一段时间了。。。。。
也就是说,还要再等3000年。才有机会了,太阳系的行星的椭圆轨道受到外来天体的干扰,轨道次序发生了变
软件专利如何申请
cuiyadll
软件专利 申请
软件技术可以申请软件著作权以保护软件源代码,也可以申请发明专利以保护软件流程中的步骤执行方式。专利保护的是软件解决问题的思想,而软件著作权保护的是软件代码(即软件思想的表达形式)。例如,离线传送文件,那发明专利保护是如何实现离线传送文件。基于相同的软件思想,但实现离线传送的程序代码有千千万万种,每种代码都可以享有各自的软件著作权。申请一个软件发明专利的代理费大概需要5000-8000申请发明专利可
Android学习笔记
darrenzhu
android
1.启动一个AVD
2.命令行运行adb shell可连接到AVD,这也就是命令行客户端
3.如何启动一个程序
am start -n package name/.activityName
am start -n com.example.helloworld/.MainActivity
启动Android设置工具的命令如下所示:
# am start -
apache虚拟机配置,本地多域名访问本地网站
dcj3sjt126com
apache
现在假定你有两个目录,一个存在于 /htdocs/a,另一个存在于 /htdocs/b 。
现在你想要在本地测试的时候访问 www.freeman.com 对应的目录是 /xampp/htdocs/freeman ,访问 www.duchengjiu.com 对应的目录是 /htdocs/duchengjiu。
1、首先修改C盘WINDOWS\system32\drivers\etc目录下的
yii2 restful web服务[速率限制]
dcj3sjt126com
PHP yii2
速率限制
为防止滥用,你应该考虑增加速率限制到您的API。 例如,您可以限制每个用户的API的使用是在10分钟内最多100次的API调用。 如果一个用户同一个时间段内太多的请求被接收, 将返回响应状态代码 429 (这意味着过多的请求)。
要启用速率限制, [[yii\web\User::identityClass|user identity class]] 应该实现 [[yii\filter
Hadoop2.5.2安装——单机模式
eksliang
hadoop hadoop单机部署
转载请出自出处:http://eksliang.iteye.com/blog/2185414 一、概述
Hadoop有三种模式 单机模式、伪分布模式和完全分布模式,这里先简单介绍单机模式 ,默认情况下,Hadoop被配置成一个非分布式模式,独立运行JAVA进程,适合开始做调试工作。
二、下载地址
Hadoop 网址http:
LoadMoreListView+SwipeRefreshLayout(分页下拉)基本结构
gundumw100
android
一切为了快速迭代
import java.util.ArrayList;
import org.json.JSONObject;
import android.animation.ObjectAnimator;
import android.os.Bundle;
import android.support.v4.widget.SwipeRefreshLayo
三道简单的前端HTML/CSS题目
ini
html Web 前端 css 题目
使用CSS为多个网页进行相同风格的布局和外观设置时,为了方便对这些网页进行修改,最好使用( )。http://hovertree.com/shortanswer/bjae/7bd72acca3206862.htm
在HTML中加入<table style=”color:red; font-size:10pt”>,此为( )。http://hovertree.com/s
overrided方法编译错误
kane_xie
override
问题描述:
在实现类中的某一或某几个Override方法发生编译错误如下:
Name clash: The method put(String) of type XXXServiceImpl has the same erasure as put(String) of type XXXService but does not override it
当去掉@Over
Java中使用代理IP获取网址内容(防IP被封,做数据爬虫)
mcj8089
免费代理IP 代理IP 数据爬虫 JAVA设置代理IP 爬虫封IP
推荐两个代理IP网站:
1. 全网代理IP:http://proxy.goubanjia.com/
2. 敲代码免费IP:http://ip.qiaodm.com/
Java语言有两种方式使用代理IP访问网址并获取内容,
方式一,设置System系统属性
// 设置代理IP
System.getProper
Nodejs Express 报错之 listen EADDRINUSE
qiaolevip
每天进步一点点 学习永无止境 nodejs 纵观千象
当你启动 nodejs服务报错:
>node app
Express server listening on port 80
events.js:85
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE
at exports._errnoException (
C++中三种new的用法
_荆棘鸟_
C++ new
转载自:http://news.ccidnet.com/art/32855/20100713/2114025_1.html
作者: mt
其一是new operator,也叫new表达式;其二是operator new,也叫new操作符。这两个英文名称起的也太绝了,很容易搞混,那就记中文名称吧。new表达式比较常见,也最常用,例如:
string* ps = new string("
Ruby深入研究笔记1
wudixiaotie
Ruby
module是可以定义private方法的
module MTest
def aaa
puts "aaa"
private_method
end
private
def private_method
puts "this is private_method"
end
end