摘要: 首先介绍一下重排序和内存屏障。 重排序分为两种 编译器重排序:有一段代码 由于现代CPU采用多级流水线设计,可以同时执行多条语句,因此上述代码执行过程中,b=2可以直接放入到流水线,而a=a+1必须等a=a/2.0完成以后才能放入流水线。为了提高代码执行效率,编译器会把代码改成 。这就是编译器重排序 阅读全文
posted @ 2018-04-14 17:43 破凡 阅读(239) 评论(0) 推荐(0)
摘要: 无论程序语言如何千变万化,他们都深深地根植于目前的计算机体系结构。 左图是intel CPU的三级高速缓存设计,由于高速缓存对程序员基本不可见,因此可以抽象为右图。 缓存的设计 首先还是先谈谈左图。 1. L1 cache分为两部分,i cache存储指令(只读),d cache存储数据(可读可写) 阅读全文
posted @ 2018-04-14 17:42 破凡 阅读(445) 评论(0) 推荐(0)
摘要: jinfo [ flags] pid 显示该进程的java设置,包括系统参数、虚拟机设置VM flags和启动参数Command line,加上 flags后只显示后两种 jmap heap pid 显示使用了哪种垃圾收集器,heap有关的设置是什么,heap各个区域的使用量和使用率。图中显示新生代 阅读全文
posted @ 2017-03-26 19:01 破凡 阅读(163) 评论(0) 推荐(0)
摘要: JVM中垃圾回收的内存区域主要指堆。虽然HotSpot对方法区也会进行垃圾回收,但是不在JVM的规范里。通过垃圾回收调优,尽可能减少垃圾回收的次数和时间,是我们的目标。 垃圾收集器需要完成两部分工作:判断对象是否存活和回收内存。 判断对象是否存活 JVM从所有GCRoot对象出发,遍历他们引用的对象 阅读全文
posted @ 2017-02-09 03:14 破凡 阅读(187) 评论(0) 推荐(0)
摘要: JVM的调优主要集中在内存上,包括内存大小和垃圾回收。因此了解JVM的内存模型是非常有必要的。 JMM由以下五个部分组成: 1. 方法区,所有线程的共享区域,保存已加载的类,常量,静态变量,又称为永久代。这个区域内存耗尽会报java.lang.OutOfMemoryError: PermGen fu 阅读全文
posted @ 2017-02-08 22:36 破凡 阅读(927) 评论(0) 推荐(0)