减少GC开销的5个编码技巧

  categories:资料  author:

来源:互联网

在 这篇文章中,我们来了解一下让代码变得高效的五种技巧,这些技巧可以使我们的垃圾收集器(GC)在分配内存以及释放内存上面,占用更少的CPU时间,减少 GC的开销。当内存被回收的时候,GC处理很长时间经常会导致我们的代码中断(又叫做”stop the world”)。

背景

GC用来处理大量的短期的对象的分配(试想打开一个web页面,一旦页面被加载之后,被分配内存的大部分对象都会被废弃)。

GC使用一个被称作”新生代”堆空间来完成这件事情。”新生代”是用来存放新建对象的堆内存。每一个对象都有一个”age”(存储在对象的头信息 中),用来定义存放很多没有被回收的垃圾集合。一旦一个确定的”age”到达,对象就会被复制到堆中的另一块空间,这个空间被称作”幸存者空间”或者”老 年代空间”。(译者注:实际上幸存者空间位于新生代空间中,原文有误,不过这里暂时按照原文来翻译,更详细的内容请点击成为JavaGC专家Part I – 深入浅出Java垃圾回收机制)

虽然这样很有效,但是还是有很大代价的。减少临时分配的数量确实可以帮助我们增加吞吐量,尤其是在大规模数据的环境下,或者资源有限制的app中。

下面的五种代码方式可以更加有效的利用内存,并且不需要花费很多的时间,也不会降低代码可读性。

1、避免隐式的String字符串

String字符串是我们管理的每一个数据结构中不可分割的一部分。它们在被分配好了之后不可以被修改。比如”+”操作就会分配一个链接两个字符串的新的字符串。更糟糕的是,这里分配了一个隐式的StringBuilder对象来链接两个String字符串。

例如:

a = a + b;// a and b are Strings

编译器在背后就会生成这样的一段儿代码:

StringBuilder temp =newStringBuilder(a).

temp.append(b);

a = temp.toString();// 一个新的 String 对象被分配… 阅读全文

WordPress的Action加载顺序

  categories:资料  tags:  author:

写WordPress代码时需要不停的与hooks(actions and filters)打交道,filter就像茶壶的过滤嘴,茶壶在哪它就在哪,顺序问题不那么重要。而action是一种行为,比如掀起壶盖和盖上壶盖之间 就可以放一个action,在这个action里可以放茶叶,不掀起壶盖是不可以放茶叶的,所以actions执行的顺序很重要。

 

钩子Hooks

钩子是让一段代码与另一段代码做交互的方法。它们是插件、主题与WordPress内核做交互的基础,当然WordPress内核里也广泛使用了。

钩子有两种:Actions和Filters。使用它们,你必须写一个回调函数,然后将它注册到WordPress关联到特定action或filter。

Filters让你可以在WordPress运行的时候修改一段数据的值。传入给回调函数的变量修改后被返回。它们是独立工作的,不会影响到函数外部的东西。

Actions则相反,允许你增加或修改WordPress的运行。回调函数会运行在WordPress运行到特定点的时候,可以做一些任务,比如:输出显示给用户、插入数据到数据库。

WordPress提供了许多钩子供你使用,你也可以自定义一些供其他开发者来修改你的插件或主题。

 

Actions

Actions钩子提供了函数一种方法可以让其他函数挂靠上来,然后额外的代码就可以在WordPress内核、插件、主题运行到特定点的时候执行了。

它们通过调用add_action()函数来工作,传入两个参数:你要挂靠的钩子名称、要运行的回调函数。比如:

<?php add_action( ‘init’, ‘do_some_stuff’ ); ?>

以上语句中,自定义do_some_stuff()函数会在WordPress运行init操作的时候被调用。

可以去代码参考的hook部分查看更多可用的action。如你经验丰富,对WordPress内核十分熟悉,可以直接去源代码里找合适的action。

示例

如果你想为Loop修改MySQL查询语句,你可以挂靠到pre_get_posts操作上。比如,你可以将指定CPT包含到搜索中:

<?php
function search_filter( $query ) {
    if ( ! is_admin() 
阅读全文

WordPress中wp_enqueue_script加载JavaScript

  categories:资料  tags:  author:

在 WordPress 中加载 JavaScript 最好使用 wp_enqueue_script() 函数以减少问题提高效率

WordPress 本身以及主题和插件通常需要加载一些 JavaScript 来实现某些特殊功能。为了最大限度地保证兼容性,不至于出现 JavaScript 失效的情况,所以一般在页头加载 JavaScript 文件。但是根据 Yahoo 开发者论坛的建议,加载 JavaScript 应该尽量在页尾以提高页面的显示(响应、渲染)速度。本文根据作者的使用经验介绍几个相关插件,并说明如何在某些特殊页面仍然在页头加载 JavaScript。

 

下面先简单介绍几个相关的优化 JavaScript 的 WordPress 插件及特点,然后演示如何处理一些特殊情况。

一. 优化JavaScript的WordPress插件

我曾经用过 WP Minify、Autoptimize、JavaScript to Footer这三个插件,下面一一介绍其特点。

1. WP Minify

这个插件将 Minify 引擎整合到 WordPress

阅读全文

介绍几个JS和CSS压缩合并插件

  categories:资料  tags:  author:

由于添加各种功能的代码和 wordpress插件 ,会导致JS和CSS增多,影响了wordpress博客的加载速度。虽然可以用代码来对JS和CSS进行压缩合并,可是对初学者不是那么简单,很容易出错。因此介绍几个JS 和CSS 压缩合并插件,方便初学者进行优化。

Better WordPress Minify

Better WordPress Minify 是将Minify引擎集成到wordpress博客上,一旦被启用,它将合并和压缩所有的 JS 和 CSS 文件,从而降低网页的加载时间。

Better WordPress Minify插件使用很简单。安装并启用插件后,会自动压缩合并你的JS和CSS文件。当然你可以在设置页面中,进行如下更细致的设置。

  • 删除不必要的空格与空行。
  • 合并多个CSS或JavaScript文件。
  • 自动缩小的JS文件。
  • 自动缩小CSS文件。
  • 并提供gzip压缩。
  • 缩小代码bloginfo()样式表?
  • 缩小网址。
  • 缓存目录。

30453013_1

 

 

常用Maven插件介绍

  categories:资料  tags:  author:

Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由 maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main/java/目录下的主源码,testCompile目标用来编译位于 src/test/java/目录下的测试源码。

用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段 (lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目 标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。

认识上述 Maven插件的基本概念能帮助你理解Maven的工作机制,不过要想更高效率地使用Maven,了解一些常用的插件还是很有必要的,这可 以帮助你避免一不小心重新发明轮子。多年来Maven社区积累了大量的经验,并随之形成了一个成熟的插件生态圈。Maven官方有两个插件列表,第一个列 表的GroupId为org.apache.maven.plugins,这里的插件最为成熟,具体地址 为:http://maven.apache.org/plugins/index.html。第二个列表的GroupId为 org.codehaus.mojo,这里的插件没有那么核心,但也有不少十分有用,其地址为:http://mojo.codehaus.org /plugins.html。

部分插件列表

Core plugins
clean
compiler
deploy
failsafe
install
resources
site
surefire
verifier

Packaging types/tools
ear
ejb
jar
rar
war
app-client/acr
shade
source… 阅读全文

Storm高级原语Trident API 综述

  categories:资料  tags:  author:
本文翻译自Storm wiki中的Trident API,部分地方加入了笔者自己的理解。

“Stream”是Trident中的核心数据模型,它被当做一系列的batch来处理。在Storm集群的节点之间,一个stream被划分成很多partition(分区),对流的操作(operation)是在每个partition上并行进行的。注:

①“Stream”是Trident中的核心数据模型:有些地方也说是TridentTuple,没有个标准的说法。

②一个stream被划分成很多partition:partition是stream的一个子集,里面可能有多个batch,一个batch也可能位于不同的partition上

Trident有五类操作(operation):

1、Partition-local operations,对每个partition的局部操作,不产生网络传输

2、Repartitioning operations:对数据流的重新划分(仅仅是划分,但不改变内容),产生网络传输

3、Aggregation operations:聚合操作

4、Operations on grouped streams:作用在分组流上的操作

5、Merge、Join操作

Partition-local operations

对每个partition的局部操作包括:function、filter、partitionAggregate、stateQuery、partitionPersist、project等。

Functions

一个function收到一个输入tuple后可以输出0或多个tuple,输出tuple的字段被追加到接收到的输入tuple后面。如果对某个 tuple执行function后没有输出tuple,则该tuple被过滤(filter),否则,就会为每个输出tuple复制一份输入tuple的 副本。假设有如下的function:

public class MyFunction extends BaseFunction {
public void execute(TridentTuple tuple, TridentCollector collector) {… 阅读全文

Mybatis MapperScannerConfigurer自动扫描

  categories:java资料  tags:,   author:

Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring

Mybatis在与Spring集成的时候可以配置 MapperFactoryBean来生成Mapper接口的代理. 例如

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean 创建的代理类实现了 UserMapper

阅读全文

Spring配置文件location的几种设置方法

  categories:资料  tags:  author:

spring 中location设置方法, 通过在网络搜索, 发现有下面几个方法。 另外具体的参数值, 也可以有决定路径, 相对路径等区分, 见后面

1.默认location

默认会去加载WEB-INF下的applicationContext.xml文件,如果该文件不存在,则会抛出以下的异常。

org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/applicationContext.xml]

2. web.xml中通过servlet name自定义

通过以下的定义,会去加载WEB-INF下面的test-servlet.xml作为spring的配置文件

<servlet>
<servlet-name>test</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>test</servlet-name>… 阅读全文

我们需要教小孩子编程?

  categories:资料  author:

现在的大多数学校,大多没有设置编程类课程。对此,我真心不能认同。所以,当“sheknows”网站要求我写点关于教小孩子写代码的内容时,我觉得这是一个好机会。

20141119095033486
我们生活在一个数字时代,手机和平板电脑已经成为了孩子们生活中的一部分。有的甚至已经习惯于在电脑上玩类似于Minecraft之类的游戏了。除了阅读、写作和算术,现在的孩子还需要学会如何写计算机程序,而不仅仅只会使用它们。

编码(计算机编程)是一种用于创造的艺术,其内容包罗万象,从计算机游戏和手机app乃至改善医疗的计算机模型统统囊括在内。不仅如此,随着我们下一代的 长大,编码会像阅读和写作一样成为最基本能力之一,不管他们以后选择的是什么职业。

1. 编程是一种基本能力,不要让你的孩子落后在起跑线上

计算机是目前增长最快的行业之一,也是薪资水平最高的职业之一。仅在美国,计算机岗位的薪水就比平均水平高75%以上。预计到2020年,此行业会新增超 过10万个就业岗位,计算机技能的重要性可见一斑。所以我们又怎么能不将编码作为一个必要的技能呢?

——Heather Carey,MassTLC教育基金会的执行董事,也是两个已经在学习写代码的男孩(一个4岁,一个8岁)的母亲。

2.编程指的不是上网和玩游戏

Sharon的女儿以前一提起写代码,脑子里就出现“一些穿着邋里邋遢的游戏狂呆坐在电脑前”的场景。后来她的大女儿,在卡内基梅隆大学读生物专业时,注 意到计算生物学家在研究项目中的重要作用之后,渐渐转变了这种想法。而她的小女儿,立志想当一名外交大使,在意识到写代码会成为基本生活技能之后,也开始编码,并渐渐乐在其中。

——Sharon Wienbar,科技创业投资人和两个女儿的母亲(16岁和19岁)。

3.编程充满创意和乐趣

Jon 10岁的儿子,可以花上几小时用Scratch微调试游戏(Scratch是专为孩子写的编程语言)。“我儿子真的非常喜欢这个,这非常锻炼他的创造能力!”

Scratch一开始先让孩子们玩游戏,然后,如果他们有什么地方不喜欢,例如有怪物他们闯不过去,他们完全可以自己的意愿改动代码帮助过关,可以让怪物 减少能力或者直接pass怪物。他们也可以重新调试别人写的代码,加入自己的设置。“这就像艺术一样在创作。”孩子们不觉得自己是在写枯燥的代码,而是在 创造一些有意思的东西,享受编程的乐趣,他们玩得非常开心。

——Jon Woodstock博士,《Help Your Kids with Computer Coding 》的作者和两个小程序员(一个10岁男孩和一个8岁女孩)的父亲。

4.编程有助于建立自信心

Lisa 9岁的孩子学习成绩并不好,但是在编程上,赢得了教室里其他孩子的掌声。

有的孩子天生不善于读书,但是编程让他们能从另一个方面展示自己,把握自己的命运。在编码世界中,没有什么规定的路径,也没有什么“正确的答案”,他们完全可以按照自己的想法去解决问题,从而建立自信心。

——Lisa Morales-Hellebo,纽约时装技术实验室的创始人,也是一个9岁孩子(从4岁半就开始编程)的母亲。… 阅读全文

SpringMVC访问静态资源的三种方式

  categories:资料  tags:  author:

如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题。

如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg的访问也就被拦截了。

<!-- Processes application requests -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

为了可以正常访问静态文件,不要找不到静态文件报404。

方案一:激活Tomcat的defaultServlet来处理静态文件

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

要配置多个,每种文件配置一个

要写在DispatcherServlet的前面, 让defaultServlet先拦截,这个就不会进入Spring了,我想性能是最好的吧。

Tomcat, Jetty, … 阅读全文



快乐成长 每天进步一点点