- 浏览: 36902 次
- 性别:
- 来自: 北京
最新评论
-
clearity:
793059909 写道jconsole也是向上趋势,但内存是 ...
Java中的内存泄露 -
793059909:
jconsole也是向上趋势,但内存是先减少再增加,一直没有泄 ...
Java中的内存泄露
文章列表
MongoDB:聚集和分组例子
- 博客分类:
- No SQL
在本文章中,会演示MongoDB使用聚集函数对文档进行分组的用法。
1.测试数据
网站主机域名列表的JSON格式文件
website.json
{ "_id" : 1, "domainName" : "test1.com", "hosting" : "hostgator.com" }
{ "_id" : 2, "domainName" : "test2.com", "hosting" : ...
Java8 lambda表达式例子
- 博客分类:
- Java 8
//Before Java 8:
new Thread(new Runnable() {
@Override public void run() {
System.out.println("Before Java8, too much code for too little to do"); } }).start();
//Java 8 way:
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!" ...
JDK7发布两年多后,Java8终于来到了我们面前,我们对很多它的特性期待好久了。其中lambda表达式
是我们谈论最多的一项,但是这个特性还远不是现在的主流,Java8带来了新的stream实现类,实现了
Collections元素的并行处理。可以通过指定条件来过滤集合元素。如果集合是有序的,可以通过集合元素的属性
进行排序。也可以使用常用的功能编程函数,也就是map和reduce。stream类提供诸如mapToInt()、mapToLong()和
处理集合元素的map函数。在当前例子中,我们会列出使用java8 stream来处理集合元素。Stream类的使用也不只限于
Col ...
你是否希望在java中转换对象到字节流的时候让性能赶得上本地C++代码的处理速度?
如果使用标准的java序列化机制的话性能会使你大失所望。Java序列化
的实现是为其他需要服务而不是为了尽快和紧凑的序列化对象。
为什么我们需要快速和紧凑的序列化?首先系统很多都是分布式的,这就要求高校的在
服务节点之间进行状态通信。状态信息是被包装成对象形式的。从调优过的大多数系统中
可以得出开销主要在用于状态传输的字节缓存的序列化上。现在也有不少协议和机制可以
解决这个问题。你可以使用低效的协议比如Java序列化、XML或者JSON。也可以选择使用二进制协议,
这样可以快速和有效的多, ...
复杂的东西从来不讨人喜欢。处理内存泄露、线程死锁和GC调优这些问题在过去是很痛苦的。
这三种问题所带来的性能问题是最难重现的,可能带来的是无休息的bug修复。
尽管性能调优需要很好的洞察力,下面是LinkedIn工程师 ...
Java8下字符串的流式处理
- 博客分类:
- Java 8
public static void main(String[] args) {
"hey duke".chars().forEach(c -> System.out.println((char)c));
}
并行版本的实现不保证字符的顺序(会有额外的开销)
public static void main(String[] args) {
"hey duke".chars().parallel().forEach(c -> System.out.println((char) ...
Java8下数据列表导出CSV
- 博客分类:
- Java 8
import java.util.ArrayList;
import java.util.List;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
import org.junit.Test;
public class CSVStreamTest {
@Test
public void listToString() {
List<String> mascots = new ArrayList<>();
...
概述
硬件事务内存有能力提供多线程并发访问数据结构的需要,并可以通过缓存一致性协议
来避免数据冲突的发生。HTM(硬件事务内存)旨在为你提供更细粒度锁的扩展性以及简单的粗粒度
加锁操作,并且性能与无锁操 ...
Java的集合类库是最常用的类库之一。栈的后进先出机制可以在很多地方派上用场,比如,表达式预估/语法解析,验证和解析XML,还原文本编辑器的内容,web浏览器的页面访问记录等等。下面是一些关于栈的知识。
Q.Java中有什么后入先出的实现可以使用?
A.向量是栈的传统实现并且Java文档中规定使用Deque来代替是因为提供了更好的后进先出的操作支持。Deque的实现通常都比Stack的要好。J2SE5引入了Queue接口,并且加入了实现Queue接口的Deque。Deque接口应该被读作“deck”而不是“de-queue”,并且在从queue中移除元素也不会被认为是dequeue ...
多线程与阻塞队列
- 博客分类:
- Concurrent
Q.怎么去实现使用独立的进程去生成奇偶数,然后另一个线程打印出奇偶数之和?
A.可以通过多线程以及BlockingQueue来实现。队列是先进先出的数据结构。
阻塞队列有以下特性
1.线程从空队列中获取时,只有在其他线程往队列中放入有效数据后才会返回,否则阻塞
2.线程往一个已满队列中放数据时,只有其他线程取出数据腾出空间,或者其他线程清空了队列以后才会添加成功,否则阻塞
下面是奇偶数生成类
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurre ...
Q:当有人说程序运行的很慢的时候,他指的是什么?
A:他通常所指的是两个性能属性中的一个 -- 延迟/扩展性。延迟是描述完成给定任务所需的时间长短,然而扩展性描述的是当负载增加时对性能是如何影响的。构建高性能 ...
使用Builders代替构造器创建不可变对象
- 博客分类:
- 优化实践
本篇将拿构造器来和使用builder设计模式比较着解释应该如何创建不可变对象
使用此种方式可以使你的代码更具有可读性,首先,让我们来看下如果使用如下的接收三个BigDecimal类型参数的构造器来构建的CashBalance对象是多么的不优雅。然后我们会在看下使用builder模式是怎样让你的代码更简洁的。
当下次你在面试中被问及设计模式的时候,你可以拿这个实现来和使用很频繁的工厂模式和单例模式做个比较。这篇文章还设计到其他两个重要的概念(不可变性和线程安全)
import java.math.BigDecimal;
/**
* 因为不可变,所以是线程安全 ...
场景1:web服务通过http请求数据,将请求对象放在内部的队列中,并且有一个单独的工作线程从队列中取请求对象进行处理.比如,一个交易系统创建一个购买订单并放入队列中,这时一个独立的消费线程获取订单信息并且将发送给证券交易所,这是一个典型的生产者消费者场景.
场景2:如果之前的条件未知信号量可以用来创建工作线程,这是因为信号量可以在0许可的情况下创建,并在一系列的释放以后运行.比如,如果你想递归的遍历内部文件夹并利用生成的若干线程将html类型的文件转移到目标文件夹中,然后可以通过调用release方法调用递增许可数量, 单独的处理线程需要在开始处理这些文件之前获取足够的许可才可以进 ...
现实场景下我们可以借助java.util.concurrent包下的以下几个类做到更好。
1.CountDownLatch(闭锁)
2.CyclicBarrier(关卡)
以下有一些具体的现实场景可以使以下的类派上用场。
场景:主线程创建三个数据库连接,并且在主线程中为每个连接分配三个子线程。主线程必须等待子线程执行完成并且所有的数据库连接关闭后才能退出,所以,我们应该怎么去实现呢?
方案:因为我们已经知道了线程的具体数量,所以我们可以使用CountDownLatch(闭锁)。CountDownLatch可以在主线程中使用去实现等待子线程的功能。当前Co ...
适用场景:
你需要从数据库加载股票交易的安全代码并且考虑到性能进行了缓存。这些安全代码需要每30分钟刷新一次。在这里缓存数据需要一个单独的写线程进行生成和刷新,并且被若干读进程进行读取。这种情况下,你又要如何来保证你的读写方案做到良好的扩展和线程安全呢?
解决方案:java.util.concurrent.locks包提供了可以并行执行的写锁以及被单个线程独占的写锁的实现。这个ReadWriterLock(读写锁)接口包含了一对关联的锁,一个只读锁和一个写锁。其中readLock()(读锁)可以被多个进行读操作的 ...