随笔分类 -  Java

Arrays.sort源代码解析
摘要:Java Arrays.sort源代码解析 Java Arrays中提供了对所有类型的排序。其中主要分为Primitive(8种基本类型)和Object两大类。 基本类型:采用调优的快速排序; 对象类型:采用改进的归并排序。一、对于基本类型源码分析如下(以int[]为例): Java对Primitive(int,float等原型数据)数组采用快速排序,对Object对象数组采用归并排序。对这一区别,sun在>中做出的解释如下: The sort operation uses a slightly optimized merge sort algorithm that is f... 阅读全文

posted @ 2013-09-15 21:33 liangzh123 阅读(407) 评论(0) 推荐(0)

HashMap原理
摘要:1. HashMap概述HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。2. HashMap的数据结构在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。3. HashMap的存取 HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程: 1、 当调用 阅读全文

posted @ 2013-09-15 21:21 liangzh123 阅读(255) 评论(0) 推荐(0)

Java堆、栈和常量池
摘要:1,对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,如果是运行期(new出来的)才能确定的就存储在堆中。对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。如以下代码:Java代码 String s1 = "china"; String s2 = "china"; S 阅读全文

posted @ 2013-06-21 15:17 liangzh123 阅读(393) 评论(0) 推荐(0)

Java多线程内存模型
摘要:Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的并发效果。在此之前,主流程序怨言(如C/C++等)直接使用物理硬件(或者说操作系统的内存模型),因此,会由于不同的平台上内存模型差异,导致程序在一套平台上并发完成正常,而在另一套平台上并发访问却经常出错,因此经常需要针对不同的平台来编写程序。Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variable)与java编程中所说的变量 阅读全文

posted @ 2013-06-21 15:14 liangzh123 阅读(462) 评论(0) 推荐(0)

JVM内存分配策略
摘要:Java堆,分配对象实例所在空间,是GC的主要对象。分为新生代(Young Generation/New),老年代(Tenured Generation/Old)新生代又划分成 Eden Space, From Survivor, To Survivor对象的内存分配,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。新生代 阅读全文

posted @ 2012-07-03 19:34 liangzh123 阅读(1357) 评论(0) 推荐(0)

JVM垃圾收集器
摘要:垃圾收集器就是收集算法的具体实现,不同的虚拟机会提供不同的垃圾收集器。并且提供参数供用户根据自己的应用特点和要求组合各个年代所使用的收集器。本文讨论的收集器基于Sun Hotspot虚拟机1.6版。 下图中展示了jdk1.6中提供的6种作用于不同年代的收集器,两个收集器之间存在连线的话就说明它们可以搭配使用。没有最好的收集器,也没有万能的收集器,只有最合适的收集器。从Serial收集器到Parallel收集器,再到CMS收集器, G1收集器,用户线程的停顿时间在不断缩短,但是仍然没有办法完全消除。1. Serial收集器单线程收集器,使用复制收集算法,收集时会暂停所有工作线程(我们将这件事情称 阅读全文

posted @ 2012-07-02 21:04 liangzh123 阅读(988) 评论(0) 推荐(1)

JVM垃圾收集算法
摘要:1,标记-清除(Mark-Sweep):算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象(如果对象在进行根搜索后发现没有与GC Roots相连接的引用链,对象将会被标记)。它是最基础的收集算法,因为后续的收集算法都是基于这种思路并对其缺点进行改进而得到的。它的主要缺点有两个:一个是效率问题,标记和清除过程的效率都不高;另外一个是空间问题,标记清除之后会产生大量不连续的内存碎片,空间碎片太多可能会导致,当程序在以后的运行过程中需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。如下图:2,复制算法(Copying): 阅读全文

posted @ 2012-06-30 21:40 liangzh123 阅读(330) 评论(0) 推荐(0)

JVM判断对象存活的算法
摘要:引用计数算法(reference counting):垃圾收集的早期策略。一个对象被创建时,为该对象分配一个引用计数器。当有地方引用它时,计数加1。当一个对象的引用超过了生存期或者被设置一个新的值时,引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集的时候,它引用的任何对象计数值减1。在这种方法中,一个对象被垃圾收集后可能导致后续其他对象的垃圾收集行动。此算法实现简单,判断效率高;但很难解决对象之间的相互循环引用,如,A对象有一个对B对象的引用,B对象又反过来引用A对象,除此之外这两个对象无任何引用,但引用计数都不会为0,无法回收它们。(因此JVM未使用此算法)。另外 阅读全文

posted @ 2012-06-30 20:16 liangzh123 阅读(430) 评论(0) 推荐(0)

JVM运行时数据区
摘要:1,程序计数器(Program Counter Register)是一块较小的内存空间,在线程启动时创建,线程私有。可以看做是当前线程所执行的字节码的行号指示器。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。此内存区域是唯一一个在Java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。2,虚拟机栈(Stack):线程私有,生命周期与线程相同;虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存 阅读全文

posted @ 2012-06-30 16:10 liangzh123 阅读(343) 评论(0) 推荐(0)

svn简单使用
摘要:库管理员的工作:从Tigris.org下载svn服务器并安装;完成后在命令行执行svn help会出现:执行svnadmin help出现:建库:执行svnadmin create svnrepo会在当前目录下产生文件夹svnrepo,它就是新建的svn库。对库设置权限:把svnrepo/conf/svnserve.conf中的#password-db = passwd(指定从哪查找可访问库的用户)注释去掉,再svnrepo/conf/passwd里面设置用户名和密码。启动服务器:svnserve –d –r svnrepo //d表示deamon,后台运行;r表示root身份。在eclips 阅读全文

posted @ 2012-06-26 20:54 liangzh123 阅读(335) 评论(0) 推荐(0)

导航