linux中搭建java开发环境

JDK安装

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载对应jdk版本,比如 jdk-7u80-linux-x64.tar.gz。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 执行下面命令安装JDK
tar -xvf jdk-7u80-linux-x64.tar.gz -C /usr/local
cd /usr/local
mv jdk1.7.0_79/ jdk

# 设置环境变量
vim /etc/profile

export JAVA_HOME=/opt/java/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# 使配置文件生效
source /etc/profile

执行java -version命令,测试一下是否安装成功。

Tomcat安装

1
2
3
4
5
6
7
8
9
10
# 解压
mkdir -p /opt/tomcat
tar -xvf apache-tomcat-6.0.10.tar.gz -C /opt/tomcat/

# 创建一个链接
ln -s /opt/tomcat/apache-tomcat-6.0.10 /opt/tomcat/tomcat6.0

cd /opt/tomcat/tomcat6.0/bin

./startup.sh

再打开浏览器测试一下,输入http:localhost:8080,猫的页面出来,说明安装成功了。


自动化部署脚本

JDK:https://github.com/Wasim37/deployment-scripts/tree/master/java
Tomcat:https://github.com/Wasim37/deployment-scripts/tree/master/tomcat

自定义二维码

二维码不一定是单调的黑白格子,也可以很丰富。

最近用到的二维码在线生成网站:

我给”星空博客”网站生成的二维码:

二维码——wangxin123.com

查看更多

TWaver 2D+GIS+3D的试用和在线Demo

TWaver 2D for HTML5试用下载:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twaver-html5-5.4.7.zip

TWaver GIS for HTML5试用下载:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twavergis-html5-5.4.7.zip

TWaver 3D for HTML5试用下载:
各种在线3D Demo:
http://idc.servasoft.com:8081/twaver-html5-3d/
三维机房、变电站、会议室等都在里面。

TWaver 3D for HTML5(SDK/引擎)的试用下载(这个里面有上面在线demo的源代码)
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twaver-html5-3d-2.2.0.zip
文档
http://doc.servasoft.com/twaver-document-center/twaver-html5-3d-v2/

TWaver Make(模型库)的下载链接和文档:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twaver-make-1.4.zip
文档
http://doc.servasoft.com/twaver-document-center/twaver-make/

TWaver Doodle(编辑器)的下载:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twaver-doodle-1.4.zip
文档
http://doc.servasoft.com/twaver-document-center/twaver-doodle/

TWaver 2D for Java试用下载:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twaver-java-4.6.3.zip

TWaver GIS for Java试用下载:
http://download.servasoft.com/dl/twaver/sssyuwyeriUR/k/twavergis-java-4.5.6.zip

示例图片

Druid

Druid是阿里巴巴的开源项目,它在监控、可扩展性、稳定性和性能方面,相对于其他数据库连接池都有较明显的优势

网站

官网介绍:https://github.com/alibaba/druid/wiki/常见问题
阿里巴巴开源项目Druid负责人温少访谈:http://www.iteye.com/magazines/90
配置方法如下:http://blog.csdn.net/pk490525/article/details/12621649

问题

实践遇到的问题:官网下载 druid-1.0.17.jar,引入并配置好相关文件后,启动报了一个警告

图片1

查看源码如下
图片2

原因:应该是mysql驱动太老了,因为下载的druid-1.0.17.jar是16年最新发布的,去mysql官网下载最新jar包后,问题解决

运行结果

启动后项目,http://localhost:8080/ichargerclouds/druid/index.html
监控页面运行如下:

图片3

JVM性能调优

最近因项目存在内存泄漏,故进行大规模的JVM性能调优,现把相关知识进行归纳总结

一、JVM内存模型及垃圾收集算法

1.内存模型

根据Java虚拟机规范,JVM将内存划分为:

  • 年轻代(New):年轻代用来存放JVM刚分配的Java对象
  • 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代
  • 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。

其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配。
Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。

New又分为几个部分:

  • Eden:Eden用来存放JVM刚分配的对象
  • Survivor1
  • Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。

2.垃圾回收算法

垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:

  • Serial算法(单线程)
  • 并行算法
  • 并发算法

JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。

稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。

还有一个问题是,垃圾回收动作何时执行?Full GC影响较大,应尽可能不进行Full GC

  • 当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC
  • 当年老代满时会引发Full GC,Full GC将会同时回收年轻代、年老代
  • 当永久代满时也会引发Full GC,会导致Class、Method元信息的卸载

另一个问题是,何时会抛出OutOfMemoryException,并不是内存被耗空的时候才抛出

  • JVM98%的时间都花费在内存回收
  • 每次回收的内存小于2%

满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印Heap Dump。

查看更多

使用Post方法模拟登陆爬取网页

最近弄爬虫,遇到的一个问题就是如何使用post方法模拟登陆爬取网页。下面是极简版的代码:

查看更多

DelayQueue使用

假设现有如下的使用场景:
a) 关闭空闲连接。服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之。
b) 缓存。缓存中的对象,超过了空闲时间,需要从缓存中移出。
c) 任务超时处理。在网络协议滑动窗口请求应答式交互时,处理超时未响应的请求。

笨办法是,使用一个后台线程,遍历所有对象,挨个检查。
但对象数量过多时,存在性能问题,检查间隔时间不好设置,间隔时间过大,影响精确度,多小则存在效率问题。而且做不到按超时的时间顺序处理。

这场景,使用DelayQueue最适合了。
Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。
该队列的头部是延迟期满后保存时间最长的Delayed元素(即最想优先处理的元素)。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。
当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。
即使无法使用take或poll移除未到期的元素,也不会将这些元素作为正常元素对待。例如,size方法同时返回到期和未到期元素的计数。此队列不允许使 null元素。

查看更多

countDownLatch和cyclicBarrier

《 Effecit In Java 》说过,从java 1.5发现版本开始, 就不建议使用wait和notify,它们使用比较困难,可以使用更高级并发工具来替代。

图片1

图一所说的同步器是指那些能使线程等待另一个线程的对象,常用的有cyclicBarrier和倒计数锁存器CountDownLatch和semaphore。

CountDownLatch

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。它的倒计数类似于AutomicInteger的getAndDecrement()。但它还有另一个主要作用类似于 wait和notify。

查看更多

AtomicInteger的使用

JDK API 1.7相关介绍

可以用原子方式更新的 int 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicInteger 可用在应用程序中(如以原子方式增加的计数器),并且不能用于替换 Integer。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。

图片1

查看更多

开博这件事

本人有点懒,不太喜欢用脑子刻意去记一些东西。
但是东西多了易忘,怕忘,所以工作中逐渐养成了记录的习惯。
我用的是有道云,那里按类别记录了我最近几年的工作所得。
可是随着内容增多,慢慢发现了一个问题:有些知识记下了,仍然不是你的。

我知道记录能给我带来巨大好处,白底黑字会不断的通过视觉刺激来提醒我它的存在
让我不必花大力气去刻意记忆曾经所学所想,而只需腾出精力对所记内容进行补充完善。

可惜行动总跟不上思维的节奏,稍有懈怠,记录便纯粹为了记录而记录。
在微信公众号上看到一篇技术文章,有时觉得挺好,随手就记录到了有道云。
可大多时候,这个过程没有思考,没有总结,好像就只是看了一个故事。

孔子有云: 学而不思则罔,思而不学则殆。
当你记录的某个知识点,后期不断查看却还总是模棱两可的时候,就要反思了。

然后我就想到了开博这件事,开博意味着公开,公开意味着分享。
分享会让我不可避免的去思考和总结,去写出让人眼前一亮的东西。

最近在云栖社区看了一篇文章,里面谈到程序员怎么提升自身价值,程序员的影响力一般体现在:

1
2
3
4
5
6
7
8
9
10
对内:
在小组内部你技术最牛,小伙伴们有各种疑难杂症解决不了的时候都会想到你。
产品对你非常有信心,给你的需求你都能高度。
你经常主动给小伙伴们分享新技术、新东西,小伙伴知道的你都知到,小伙伴不知道的你也知道。

对外:
你参与过知名产品的架构开发,对外参加分享会。
你是某个牛逼开源组件的作者。
你写过某方面技术类书。
你的博客比较有名,有很多粉丝。

看起来很难,但是知道目标了,怎么做就明确很多了。
文章的建议大致是,挑战各种疑难杂症,经常总结;多回头整理项目代码,沉淀公用组建;多读书,提高视野;经常写博客,总结梳理知识;多画思维导图、技术图谱,把知识都串起来;

所以我希望开博对我是一个好的开端。教是最好的学,积极分享,大家共勉。