
java性能优化
文章平均质量分 75
翁英健啊
博客用来打脸
展开
-
Java并发编程:volatile关键字解析
一个原子操作(atomic operation)是个不能分割的整体,没有其它线程(thread)能够中断或检查正在原子操作中的变量。一个原子(atomic)类型就是一个原子操作可用的类型,它可以在基本上没有锁(lock)的情况下做到线程安全(thread-safe)。java.util.concurrent.atomic包就是提供原子操作的类的小工具包,支持在单个变量上解除锁定的线程安全编程。转载 2015-07-22 23:52:23 · 1168 阅读 · 0 评论 -
聊聊并发——ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Concurren转载 2015-09-06 13:16:37 · 1049 阅读 · 0 评论 -
致敬disruptor:CAS实现高效(伪)无锁阻塞队列实践
目录[hide]1引言2RingBuffer实现3CAS与乐观并发控制4两阶段发布5使用场景6Benchmark引言在多线程开发中,我们常常遇到这样一种场景:一些线程接受用户请求,另外一些线程处理这些请求,之所以把接受请求和处理请求的逻辑分开,一方面是出于资源调度的考虑(用户请求也许很多,但这些请求涉及的资源很少),另一方面也可能是异步响应的需求。这种场景存在于NIO的转载 2015-09-06 12:59:28 · 2566 阅读 · 0 评论 -
OpenJDK与HashMap……放心地教这个老家伙一些新(非堆!)技巧
OpenJDK的非堆JDK增强提议(JDK Enhancement-Proposal,JEP)试图标准化一项基础设施,它从Java6开始,只能在HotSpot和OpenJDK内部使用。这种设施能够像管理堆内存那样管理非堆内存,同时避免了使用堆内存所带来的一些限制。对于上百万短期存在的对象/值来说,堆内存工作起来是很好的,但是如果你想要增加一些其他的需求,如几十亿的对象/值的话,假若你想避免持续增加转载 2015-09-08 22:12:24 · 2054 阅读 · 0 评论 -
jvm参数设置
堆设置-Xms:初始堆大小-Xmx:最大堆大小-XX:NewSize=n:设置年轻代大小-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个原创 2015-08-27 12:45:00 · 982 阅读 · 0 评论 -
根据应用程序设置JVM参数(三)-优化老年代大小
接着前面的,现在来计算老年代的日志图:1.假如没有FullGc,如何计算老年代需要多少时间装满?(不看第一条和最后一条数据,分析)通过MinorGc计算每次老年代的增量老年代的增量 = 堆的总量 - 新生代的剩余量(souvivor区)这样可以得到几乎每次minorGc老年代增加85m空间,而minorGc每4秒一次。老年代的原创 2015-08-28 15:12:59 · 2701 阅读 · 0 评论 -
根据应用程序设置JVM参数(二)-优化新生代大小
一、还是接着上一篇的讲:继续贴上一次运行的日志数据分析:1.看频率,可以发现基本上是4秒进行一次Gc2.看耗时,可以发现基本上是需要0.037秒当前的虚拟机设置为:堆:1600M年轻代:600M年老代:1000M二、优化需求1:要求MinorGc的响应时间小于0.02秒分原创 2015-08-28 14:22:44 · 7889 阅读 · 0 评论 -
根据应用程序设置JVM参数(一)-设置堆、新生代、老年代、持久代大小
一、根据程序的运行状况查看其活跃的数据量①、活跃的数据:1.应用程序运行于稳定状态时,老年代占用的java堆大小2.应用程序运行于稳定状态时,永久代占用的java堆大小其实就是FullGc后这2个数据的大小②、动手测试:1.测试代码:public class A { int[] storage = new int[102400]; int[]原创 2015-08-27 17:29:24 · 16546 阅读 · 0 评论 -
JVM命令行选项及GC日志
一、设置参数在使用eclipse编译器的时候,可以采用以下的运行方式来设置虚拟机的参数:具体参数的设置:这里先以打印回收时间,回收信息为例二、打印信息解释:三、一些常用的jvm参数-XX:+PrintGCTimeStamps:打印此次垃圾回收距离jvm开始运行的所耗时间-XX:+Pr原创 2015-08-27 15:29:40 · 8234 阅读 · 3 评论 -
HashMap,Hashtable以及ConcurrentHashMap的比较(源码)
一、概述以前学习的时候应该都知道HashMap以及Hashtable:HashMap是线程不安全的,Hashtable是线程安全的。这里就一源代码的角度看看为什么Hashtable是线程安全的,以及另外一个线程安全的ConcurrentHashMap与Hashtable的比较。小提示:在Ecilpse中可以用ctrl+shitf+T查找类,这样就容易查看源代码了。原创 2015-08-25 23:36:59 · 2311 阅读 · 2 评论 -
Java并发编程:Lock
在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文先从synchronize转载 2015-08-25 20:20:50 · 562 阅读 · 0 评论 -
ConcurrentHashMap源码(二)--initTable
在ConcurrentHashMap的put方法中,第一次添加元素的时候table是空的(使用空的构造函数),就会执行initTable方法。下面就来看一下jdk8是怎么初始化这个table的,如何保证并发不出问题。关于unsafe.compareAndSwap的用法,可以参见我以前的博客 AtomicInteger分析--自实现无锁并发。private原创 2015-08-26 15:44:46 · 1704 阅读 · 0 评论 -
java_NIO入门教程
在开始之前关于本教程新的输入/输出 (NIO) 库是在 JDK 1.4 中引入的。NIO 弥补了原来的 I/O 的不足,它在标准 Java 代码中提供了高速的、面向块的 I/O。通过定义包含数据的类,以及通过以块的形式处理这些数据,NIO 不用使用本机代码就可以利用低级优化,这是原来的 I/O 包所无法做到的。在本教程中,我们将讨论 NIO 库的几乎所有方面,从高级的概念性转载 2015-08-25 19:45:26 · 932 阅读 · 0 评论 -
AtomicInteger分析--自实现无锁并发
前两天面试被问到“不用锁实现一个多线程并发访问不会造成资源共享问题的方法”当时我就傻眼了,不用锁怎么做。想到android中有一个looper就说了用队列,不过这答案并不是面试官满意的,也对,用队列不也要用到锁吗?这几天看了编程思想上的共享资源那节,以及好多博客上对volatile与Atomic*类的描述,算是懂了一些了,感觉收获很大。关于原子性,可视性,有序性这里就不说了原创 2015-07-23 11:26:07 · 2777 阅读 · 0 评论 -
JVM原理和优化
JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.1.创建JVM装载环境和配置2.装载JVM.dll3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例4.调用JNIEnv实例装载并处理class类。在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.JVM是J转载 2015-07-10 20:24:13 · 1041 阅读 · 1 评论 -
LocalThread分析
LocalThread源码分析:一、首先看看LocalThread是干嘛的外面能够看到的方法就以下四个:get() protected T initialValue() 。 void remove() void set(T value) 可以猜测这是一个管理集合的类。二、再看看里面的一些方法1.构造方法:空的,那就不管2.getpubli原创 2015-07-22 11:19:20 · 6320 阅读 · 1 评论 -
聊聊并发——深入分析ConcurrentHashMap
术语定义术语英文解释哈希算法hash algorithm是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。哈希表hash table根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地转载 2015-09-06 13:27:01 · 864 阅读 · 1 评论