自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Lucy_Leezhi

关注jvm和算法

  • 博客(65)
  • 收藏
  • 关注

原创 Scala Hello World

现在开始学习Scala。 在Ubuntu系统安装完jdk和Scala后,在shell 上执行scala 命令即可进入到scala 解释器 。 这里先来个hello world。 在解释器输入println(“Hello World”) 下面简单记录一下解释器常见用法:当计算器使用。 这里有两点需要说明。 scala 解释器可以当作工业级的计算器使用,各种计算操作都可以实现。 每一

2016-08-29 10:11:17 532

原创 SQL Server 数据库中SQL优化的一次记录

最近公司的报表系统中有一个SQL 执行需要消耗40分钟,开发人员的机器上有相同数据量的数据库,仅仅执行2分钟就可以了。 这个SQL的功能是在数据库的某张表上进行递归计算,取出一个树状结构。鉴于开发人员的机器上只需要2分钟,因此我们推断服务器的数据库肯定有问题。因此我们查看了服务器和本机的执行计划,执行计划都是一样的,但是在两台机器上,执行某一步时,一个消耗的时间很长,本机执行却很短。执行路径都是索

2016-06-28 22:15:54 420

原创 Spark RDD 编程实例

Spark 最核心的概念就是RDD:弹性分布式数据集。RDD 是Spark 操作数据的一种抽象,本质是分布式数据集合。这种集合被分为多个分区,这些分区运行在集群的不同节点上。我们在Spark的shell 上执行的命令,会在每个分区上执行,最后将执行结果汇总起来就得到我们需要的结果。 根据是否需要立即计算,我们把RDD操作分为两种:转换操作和行动操作。 转换操作的RDD命令,并不会立即进行计算,而

2016-06-28 21:09:11 1617

原创 Spark,Hello World

首先下载Spark并解压缩到/apphome目录,/apphome/spark-1.6.1-bin-hadoop2.6 进入到这个目录后执行如下命令:bin/spark-shell Spark 启动成功。来实现第一个例子:在spark shell 中依次输入如下命令:val lines = sc.textFile("README.md")lines.count()lines.first()

2016-06-27 20:43:51 448

原创 关于程序语言的选择学习 java/python/scala

在spark 平台的开发上,目前支持java,python,scala三种语言,我一直考虑,看是使用哪一种语言比较适合我。 我使用java已经有6年了,对java了解很多,包括多线程,JVM,java的源代码也学习过很多等,在java的平台上也一直在做开发。 对于python来说,我很早以前就看过一点Python,了解一些,python语言的哲学是:one way to do it。一种方法做一

2016-06-27 20:35:17 1328

原创 Hello,Spark

最近一直想研究一下大数据Hadoop, 但是用了整整一个周末,也没发现合适的资料,还在京东了买了两本书,按照书上的说明,最后环境搭建失败了,估计是hadoop 对技术要求太高了。所以我就换到Spark上来研究一下。之前安装过python,因为启动PySpark 需要使用python。但是启动时,却遇到错误,先在这里记录问题修复的过程,然后再说Spark的hello world。这里启动的错误是:

2016-06-26 14:32:33 396

原创 Ubuntu 安装python 2.7.11

都说Ubuntu LTS 版本默认安装了python 2.7 版本,但是我在shell 执行python 果断直接提示找不到python。因此就准备安装一个,安装的原因是为了后续学习spark。 安装python 可费劲了。这里记录下来供学习和参考。安装GCC 首先要用root账号登录并在Ubuntu shell 上执行如下命令来更新软件仓库的URL。 apt-get update 其次执行

2016-06-26 13:53:27 18204 2

原创 Ubuntu 安装Redis

Redis 是一个key/value 类型的数据库,它将数据都存放在内存中,因此操作速度非常快。数据持久化有两种方式:数据存放内存中,redis定期将数据刷新到磁盘文件中。也就是RDB。数据直接写到磁盘文件中。也就是AOF。关于这两种方式,各有优缺点,前者适合备份以及恢复,但是容灾性能并不好,如果机器down掉的话,可能会损失好几分钟的数据。后者的话,即使机器down掉,最多损失1秒的数据。在

2016-06-19 11:46:52 484

原创 Ubuntu 安装jenkins

首先在jenkins官网上下载jenkins.war包。下载后,将war包上传到jerry/webapps目录下,并在此目录中新建文件jenkins.xml,文件完整内容如下:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.o

2016-06-11 21:02:28 676

原创 Ubuntu 安装jetty

在jetty 官方网站上下载jetty 9.39 版本的tar包。下载后将此包上传到/apphome目录。 使用root登录Ubuntu,运行tar -xvf /apphome/jetty-distribution-9.3.9.v20160517.tar.gz 命令,然后在root的Home目录会发现多了个jetty-*的文件夹。然后执行 mv jetty-* /etc/jetty 将此文件夹内

2016-06-09 02:17:09 1977

原创 Ubuntu 安装JDK

首先在网上下载JDK,进官网下载,选择linux 64位。下载后解压缩并将目录名改为java 将这个解压缩后的文件夹上传到ubuntu的/usr/lib/jvm/目录下。因为是FTP上传,所以需要将java/bin目录下的权限添加一个x权限。执行命令:chmod 700 /usr/lib/jvm/java/bin/*然后执行vi ~/.profile 来编辑该文件,在该文件末尾添加: expor

2016-06-09 01:09:45 336

原创 Ubuntu 安装FTP

在Ubuntu 上安装FTP服务器 首先更新软件清单,执行命令:apt-get update 下载vsftpd,执行命令:apt-get install vsftpd启用本地账户登录,执行vi /etc/vsftpd.conf 来编辑配置 注释#anonymous_enable=YES 取消注释local_enable=YES write_enable=YES启用root登录FTP 执行

2016-06-09 00:21:44 489

原创 Ubuntu Server的安装配置

安装虚拟机: 首先在Ubuntu 网站上下载Ubuntu Server 64 bit版本的ISO软件。然后用vmware创建一个新的虚拟机,选择安装Ubuntu,输入账号密码后,即可进入自动安装(这里的账号不能输入root)。安装结束后,你就可以直接输入刚才安装过程中的账号密码了。我们这里是appadmin。更改root密码: 输入账号密码登录后,遇到的第一个问题就是root账号的密码多少?

2016-06-08 23:35:16 373

翻译 Java虚拟机结构--堆栈

2.5. Run-Time Data Areas The Java Virtual Machine defines various run-time data areas that are used during execution of a program. Some of these data areas are created on Java Virtual Machine start-

2016-04-10 11:04:21 1348

翻译 Java虚拟机结构--数据类型

最近在甲骨文官网上看到一篇不错的文章:Java虚拟机规范。全英文的,虽然是英文,但是写的非常不错,因此为了锻炼英语和对java有更深入的理解,现在开始对这篇文章进行学习和翻译,这里采用原文加译文的方式来记录,并且只是节选其中部分段落。 原文网址:http://docs.oracle.com/javase/specs/jvms/se8/html/我写这一篇博客Java虚拟机结构是上文中的第二章,也就

2016-04-09 20:49:44 691

原创 ForkJoin 源码分析之ForkJoinPool的执行

之前说到ForkJoinPool的初始化,以及Task定义的方式,现在说说这个task是怎么启动的。从我们一般写代码的话,只会这样写一句:mainPool.invoke(task);就是调用了mainPool的invoke()方法,但是这个方法做了些什么呢?看如下代码: public <T> T invoke(ForkJoinTask<T> task) { Thread t = Th

2016-04-07 20:55:27 2811

原创 ForkJoin源码分析之Task

上一次分析了ForkJoinPool构造时做了哪些工作,现在看一下这个框架的task是怎么玩的。task有一个顶层设计的接口就是ForkJoinTask,有两个类继承了这个接口,分别是RecursiveTask,RecursiveAction。区别就是一个任务有返回值一个任务没有返回值。看看两个task的定义:public abstract class RecursiveTask<V> extend

2016-04-05 22:30:12 1321 1

原创 ForkJoin 源码分析之ForkJoinPool

之前有学习过这个框架的使用,稍微回顾一下:初始化一个ForkJoinPool定义task或action使用pool来执行task或action这里初始化ForkJoinPool 采用如下方法:public final static ForkJoinPool mainPool = new ForkJoinPool();首先分析一下初始化做了些什么。public ForkJoinPool() {

2016-04-04 20:55:06 3233

原创 Quartz源码分析之Scheduler

Scheduler是Quartz框架中的调度器,主要负责调度job的执行,监控job的状态,添加删除job等,算是Quartz框架的核心。 Scheduler由Scheduler工厂获取,这个工厂又通过Scheduler仓库来获取具体的对象。工厂的具体实现是StdSchedulerFactory类,代码逻辑如下: 构造方法:public StdSchedulerFactory() {}构造方法是

2016-03-27 21:07:09 485

原创 Quartz源码分析之Trigger

Trigger用于记录job的启动时间,失效日期,描述,是否删除等信息。我们使用的代码调用如下:Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger","group1").startAt(runTime).build();先看Trigger的定义:public enum TriggerState { NONE, NOR

2016-03-24 21:11:53 563

原创 Quartz源码分析之Job

Quartz首当其冲就是Job类,这个接口主要描述了需要执行job的逻辑,所有的job都要实现Job接口。 Job接口定义如下:void execute(JobExecutionContext context) throws JobExecutionException;之所以定义一个execute方法来所有的job来实现,是因为这样可以被框架来统一调用。JobDetail接口,用于

2016-03-23 22:29:24 525

原创 Quartz源码分析之HelloWorld示例

Quartz是一个定时任务执行的框架,其中组件众多,如果想知道其原理真不知道该怎么样开始,因此这里就先写一个示例,从这个示例我们挨个来分析其每个对象的作用,最后再来看各个组件的关系。 先写一个main类:package com.lenovo.bgjob;import java.util.Date;import org.quartz.JobBuilder;import org.quartz.Job

2016-03-23 22:15:35 301

原创 线程池源码分析以及原理

线程池的作用有如下两个:在多线程程序中,线程的创建和销毁有很高的代价,因此线程池来分担这一部分性能的损耗。就是说线程池使用场景之一就是当线程的创建和销毁所消耗的时间远大于线程执行任务所消耗的时间。在并发编程实践中提到,单线程程序的缺点就是串行执行效率低,单纯的多线程呢,没法管理多线程的数量。因此折中方式就是线程池了。换句话说,线程池可以广泛的使用在多线程程序中。线程池的原理是一个线程池对象管理

2016-03-20 17:30:59 406

原创 Java Timer&TimerTask源码分析

这个定时执行任务的类是个单线程的,具体使用可以参考之前的文章。现在看看实现原理。字段:private final TaskQueue queue = new TaskQueue();private final TimerThread thread = new TimerThread(queue);定义了一个TaskQueue.以及一个TimerThread. 这个TaskQueue是一个Timer

2016-03-19 15:20:13 461

原创 Java CopyOnWriteArrayList 源码分析

CopyOnWrite 的意思是写时拷贝,从网上的资料来看。看一下这个类的字段:域字段transient final ReentrantLock lock = new ReentrantLock();private volatile transient Object[] array;lock是对象锁,下面一个array是存放数据的数组。构造函数public CopyOnWriteArrayList

2016-03-17 22:18:08 284

原创 自动部署中Tomcat被异常卡死的处理办法

在工作中自开发了一套java系统,这个系统的功能是通过quartz定时生成报表,用户通过登录系统来查看报表。IBM公司也有这样一个系统。 在开发这个系统的时候为了满足快速迭代的要求,需要实现自动打包部署的功能,因为我用jenkins作为部署平台来实现。jenkins按照如下方法思路进行:先用jenkins自带功能到代码服务器抓取代码。调用maven进行编译。调用ant脚本进行备份部署包和修改

2016-03-16 23:02:58 19598

原创 Java ConcurrentHashMap 源码分析(2)

继续分析这个类的具体操作。上一次分析到这个类的操作实际上都是用的segment中的接口。先看put方法 final V put(K key, int hash, V value, boolean onlyIfAbsent) { HashEntry<K,V> node = tryLock() ? null : scanAndLockForPut(

2016-03-15 22:42:32 295

原创 Java ConcurrentHashMap 源代码分析

之前分析过HashMap,Hashtable的源代码,前者不支持多线程环境,但是如果使用了的话,在一定情况下会导致死锁,以后会分析。后者支持并发,但是每次只能有一个线程来操作。也就是说,这个锁是锁定了整个数组。 鉴于这种情况,Doug Lea 就想出了使用分段锁技术,网上也有一些资料叫做锁分离技术。 原理是这样的,先构造一个ConcurrentHashMap对象,这个对象中有很多个段对象(seg

2016-03-14 22:24:29 360

原创 Java HashMap&Hashtable 源代码分析

Java中List是使用数组来实现,这种实现方式有利于查找元素,但是在插入元素时非常复杂,因为需要移动其他元素,如果使用LinkList,这种方法查找很麻烦,需要遍历这个列表,但是插入却又很复杂。因此出现了HashMap的结构。这种结构使用LinkList来实现,但是定位下标时,用hash函数来实现,这样可以快速查找到需要的元素。还是从基本的字段看起。static final int DEFAULT

2016-03-13 15:10:29 286

原创 Java ArrayList&Vector 源代码分析

ArrayList 对象继承了AbstractList对象,这就是说,ArrayList可以使用迭代器来操作,但是有一点要注意,上一次我们看AbstractList源代码时,知道这个迭代器是快速失败的,也就是说他记录了修改的次数,因此在实现这个ArrayList的添加操作时,我们也需要随时更新这个操作记录。也就是如下这个变量。protected transient int modCount = 0;

2016-03-13 09:53:36 408

原创 Java AbstractList 源代码分析

AbstractList是一个抽象容器,其中有很多abstract方法便于子类实现。这个类主要实现了迭代器功能和定义了一系列容器的操作接口。 迭代器是一个内部类,这个内部类有三个字段:int cursor = 0;int lastRet = -1;int expectedModCount = modCount;第一个可以理解为游标,用于标识数组元素的第一个下标。 第二个也可以理解为游标,但是

2016-03-12 10:51:29 903

原创 Java InputStream&FileInputStream 源代码分析

在java输入流中,InputStream是一个抽象接口,主要实现了read(byte b[],int off,int len)方法,这个方法的实现依赖于read()抽象方法,也就是说,read主要还是依赖于子类的实现。这个方法主要作用是从文件中读取字节数,将其放入到byte数组中。看一下这个方法的实现:public int read(byte b[], int off, int len) thro

2016-03-12 09:39:51 665

原创 Java File and FileSystem 源代码分析

Java File对象表示的是系统中一个文件或者文件夹,有几个关键字段:static private FileSystem fs = FileSystem.getFileSystem();private String path;public static final char separatorChar = fs.getSeparator();其中第一个字段是文件系统对象,表示操作系统的文件系统

2016-03-05 14:37:16 1142

原创 Java StringBuilder & StringBuffer 源代码分析

从资料来看都知道从操作效率比较的话,StringBuilder > StringBuffer >String. 原因是为什么呢? StringBuilder 不是线程安全的,StringBuffer 是线程安全的,String是不可变的,操作起来会创建新对象。 下面来看看源代码的分析, 首先StringBuffer和StringBuilder都继承自AbstractStringBuilder

2016-03-04 20:23:12 277

原创 Java String 源代码分析

String类的字段主要有下面几个: final char value[], 字符数组主要用于存放字符 final int offset,字符数组的第一个元素下标 final int count,字符数组中元素的数量统计 int hash,字符串的hash值 构造函数如果我们平时这样定义数组,那么会得到一个空的字符数组,并且是不可变的。 String str = new String()

2016-03-03 22:00:28 307

原创 Java多线程之Fork/Join

Java中并行计算的框架就是Fork/Join,这个框架的原理是将一个很大的任务分解成无数个小任务,完成每个小任务后,将其计算结果再合并处理,得到任务的最终答案。 首先,这个框架有一个核心的线程池ForkJoinPool,这个线程池实现了工作窃取算法,这个名气很专业,其实就是当一个工作线程完成了属于自己的任务后,再去主动寻找其他线程还没完成的任务,这样就可以提高CPU利用率。这个线程池一般在任务中

2016-03-02 21:56:27 425

原创 排序算法之冒泡排序

冒泡排序应该是最简单的排序算法了。 先说如果有一个数组,int array[] = {43,24,12,56,48,96,100,35,29}; 需要我们升序排列,那么最简单的想法就是说,我们将最大的元素排到最后边。第二大元素排到倒数第二,依次这样算下去就可以,这个过程其实就叫冒泡了….看看具体代码逻辑怎么样呢?有多少个元素,我们就要检查多少次。这个是没问题的。第一次检查,我们把最大的元素依次

2016-03-01 23:20:07 232

原创 Java多线程之Executor框架(2)

在Thread,Runnable传统方式实现多线程执行的时候,默认这些线程是没有返回值的,如果需要返回值怎么处理,这里需要用到Executor框架的Callable接口,这个接口和Thread,Runnable语义相同。具体使用的方法是Callable接口实现任务逻辑,将此接口传递给FutureTask,FutureTask可以取得这个接口的返回值。 代码示例如下:package com.leno

2016-03-01 22:43:45 301

原创 Java多线程之Executor框架(1)

说这个多线程框架前,先来说下为什么会有这个框架。到目前为止,有了多线程并发执行,使用Thread,Runnable来实现,性能有很大提升,但是这样有一个问题,线程的数量不是无限制的,和CPU,堆,栈,jvm,操作系统都有关系。我们自己的代码来管理这些线程,很容易出错。其次,使用Thread来实现时,它是没有返回值的。如果有返回值该怎么处理。这些等等都是Thread,Runnable这些实现所要考虑

2016-03-01 10:49:06 296

原创 关于深入学习Java的方式和理解

目前把Java多线程核心技术一书学完了,最后两章是单例模式以及线程组的学习,这两章有时间再慢慢看。后面就主要学习一些偏理论的Java编程并发实践一书,主要包括线程队列等内容,内存模型,以及JVM原理部分。这一部分过了后,就会开始分析锁Lock,以及常用Java对象的源代码。完了后就会开始分析一些常用框架的代码。 个人理解学完这些,才算是对java有了一些理解,才能真正开始做项目,才能保证代码的质量

2016-02-28 22:19:20 205

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除