随笔分类 - Java
摘要:最近在看>,看到性能调优jmap部分,故整理记录。jmap用来显示Java进程的内存映射jmap主要有两个常用的选择:-heap和-histo选项:-heap(堆视图)使用-heap选项时,jmap会抓取进程当前的堆快照。在输出结果中能看到构成Java进程堆内存的基本构成(年轻代,老年代...),和它们的参数可以看到SurvivorRatio = 8,表示survivor区占用1/8的Eden内存,即一个survivor区占用1/10的新生代内存,但是我们可以看到上面的截图并不满足,这是为什么呢?这是因为-XX:SurvivorRatito这个参数会被忽略当开启了-XX:+UseAdap
阅读全文
摘要:第4章主要介绍如何构造线程安全类。在设计线程安全类的过程中,需要包含以下三个基本要素:找出构成对象状态的所有变量。找出约束状态变量的不变性条件。建立对象状态的并发访问管理策略。构造线程安全类常采用的技术如下:实例封闭 当一个对象被封装到另一个对象中时,能够访问被封装对象的所有代码路径都是已知的。与对象可以由整个程序访问的情况相比,更易于对代码进行分析。通过将封闭机 制与合适的加锁策略结合起来,可以确保以线程安全的方式来使用非线程安全的对象。 对象一般可以封闭在三种地方:封闭在类的一个实例中,例如作为类的一个私有成员。封闭在某个作用域内,例如作为一个局部变量。封闭在线程内,例如在某个线程中将对象
阅读全文
摘要:1.同步包括两方面:原子性和可见性。2.可见性:因为在多线程程序中,如果没有采用正确的同步,有些线程就会得到失效数据。Java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对于非volatile类型的long和double变量,JVM允许将64位的读操作或写操作分解为两个32位的操作。当读取一个非volatile类型的long变量时,如果对该变量的读操作和写操作在不同的线程中执行,那么很可能会读取到某个值的高32位和另一个值的低32位。即使不考虑失效数据问题,在多线程程序中使用共享且可变的long和double等类型的变量也是不安全的,除非用关键字volatile来声明它们,或者用
阅读全文
摘要:1. 促进进程和线程出现的原因,是要解决以下问题: 资源利用率 公平性 便利性2. 进程: 操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄以及安全证书等。进程之间可以通过一些粗粒度的通信机制来交换数据,包括:套接字,信号处理器,共享内 存,信号量以及文件等。3. 线程:线程允许在同一个进程中同时存在多个程序控制流。线程会共享进程范围内的资源,例如内存句柄和文件句柄,但每个线程都有各自的程序计数器,栈以及局部变量等。线程也被称为 轻量级的进程,在大多数现代操作系统中,都是以线程为基本的调度单位。4. 线程的优势 可以发挥多处理器的强大能力:多线程程...
阅读全文
摘要:生产者-消费者模式是以缓冲区为协作的桥梁,生产者只需要负责生产,并把生产的消息放入缓冲区,不用管有多少生产者和消费者,而消费者只需要负责取出缓冲区里的消息来消费,也不需要管有多少消费者和生产者。而BlockingQueue很好的解决了如何将一个线程收集的消息传递给另一线程用于处理的问题,并且不需要考虑同步问题。下面为代码的实现: 1 /** 2 * 3 */ 4 package bells; 5 6 import java.util.Arrays; 7 import java.util.List; 8 import java.util.concurrent.ArrayBlockingQ...
阅读全文
摘要:今天重新翻阅Thanking in java。发现通过类字面常量获得Class对象的引用和Class.forName()方式有些区别。特记录下。1.Class.forName(String className): 这种方式要注意className必须使用全限定名(即包含完整的包名)2.类字面常量 比如:FancyToy.class 这样做的优点是:1.编译器会对其进行检查,不需要置于try语句块中。所以更简单,更安全。 2.根除了对forName()方法的调用,故更高效。 类字面常量不仅可以应用于普通的类,也可以应用于接口,数组,以及基本数据类型。 另外对于基本数据类...
阅读全文

浙公网安备 33010602011771号