- 博客(12)
- 收藏
- 关注
原创 多线程与高并发--《Volatile、Cas、ReentrantLock、AQS下的部分类联合讲解》
一、volatile作用保证线程可见性:堆内存是所有线程共享里面的内存,除此之外,每个线程都有自己的专属区域,如果共享内存里有一个值,当我们线程要去访问这个值,会将这个值copy一份当自己的工作空间,对这个值进行改变。改完之后马上写回去,但什么时候去检查有没有新的值无法控制。加了volatile就可以保证线程里面发生的改变在线程之间是可见的。底层是采用了MESI缓存一致性协议。禁止指令重排序:cpu为了提升效率,执行一条指令会并发的执行,每次写都会被线程度读到,加了volatile,cpu就会按着顺序
2020-12-01 17:17:09 140
原创 多线程与高并发--《线程基本概念》
一、基本概念进程:硬盘有一个程序叫QQ.exe,这是一个程序,这个程序是一个静态概念,双击启动,登录进去,这叫一个进程。进程相对于程序来说是一个动态的概念。线程:作为一个进程里面最小的执行单元他就叫线程,一个程序里不同的执行路径就叫一个线程。二、创建线程几种方式new Thread().start();new Thread(Runnable).start();Executors.newCachedThreadPool();(或者FutureTask+Callable)三、线程的几种状态
2020-11-19 22:12:43 110
原创 学习记录--《日志分析与JVM参数总结》
一、日志分析CMSjava -Xms20M -Xmx20M -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC com.xx.xx.TestXms:堆大小PrintGCDetails :打印GC的详细信息UseConcMarkSweepGC :启动CMS[GC (Allocation Failure) [ParNew: 6144K->640K(6144K), 0.0265885 secs] 6585K->2770K(19840K), 0.0
2020-11-18 21:13:18 118
原创 学习记录--《垃圾回收算法》
一、CMS大方面有4阶段ps: 这里需要解释一下,本来有6个阶段,其中有两个准备阶段第一个阶段:initial mark初始标记第二个阶段:concurrent mark并发标记第三个阶段:remark重新标记第四个阶段:concurrent sweep并发的回收这里有两个并发阶段,只要在JVM看到concurrent这个,就说明是我的垃圾回收线程和我的工作线程在一块工作。第一个阶段:通过GCRoots找到跟对象(此过程STW,但是时间很短)第二阶段:并发标记会发生很多次,而且在并发的
2020-11-18 20:50:48 103
原创 学习记录--《JVM调优第三章》
一、定位观察JVM问题执行java -Xms200M -Xmx200M -XX:+PrintGC com.zyh.jvm.gc.T15_FullGC_Problem01top命令观察到问题:内存不断增长 CPU占用率居高不下top -Hp 观察进程中的线程,哪个线程CPU和内存占比高jps定位具体java进程jstack 定位线程状况,重点关注:WAITING BLOCKEDjstat -gc 动态观察gc情况 / 阅读GC日志发现频繁GC / arthas观察 / jconsole/jvis
2020-11-18 14:31:02 157
原创 学习记录--《JVM调优第二章》
一、写在开头补充几个知识点Perm Generation和Metaspace区别1.前者:命令指定大小,但是不可再修改,可能会溢出,字符串常量在1.7放在永久代。2.后者:不设置,受限于物理内存,字符串常量在1.8放在堆二、系统CPU经常100%,如何调优CPU100%那么一定有线程在占用系统资源找出哪个进程cpu高(top)该进程中的哪个线程cpu高(top -Hp)导出该线程的堆栈 (jstack)查找哪个方法(栈帧)消耗时间 (jstack)工作线程占比高 | 垃圾回收线程占
2020-11-16 10:08:54 96
原创 学习记录--《JVM调优第一章》
一、常见垃圾回收器组合参数设定:(1.8)-XX:+UseSerialGC = Serial New (DefNew) + Serial Old小型程序。默认情况下不会是这种选项,HotSpot会根据计算及配置和JDK版本自动选择收集器-XX:+UseParNewGC = ParNew + SerialOld这个组合已经很少用(在某些版本中已经废弃)-XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old-XX:+UseParall
2020-11-11 20:48:59 220
原创 学习记录--《GC和GC Tuning》
一、垃圾概念没有引用执行的任何对象都叫做垃圾。二、java和C++对垃圾处理的区别java:只管扔垃圾就行,自动处理GC处理垃圾开发效率高,执行效率低C++:手动处理,但会产生问题忘记回收,内存泄漏回收多次非法访问开发效率低,执行效率高三、如何定位垃圾引用计数(Reference Count)后面会说RC有一个引用指向一个对象,头部有个数字,有几个指向他就写几,当变为0,就是垃圾。无法解决的问题:循环引用A->B->C,形成一种闭环,大家都是1,对于RC来说
2020-11-11 15:35:38 681
原创 java运行时数据区和常用指令
写在文章开头一道面试题(下面去分析)public static void main(String[] args){ int i = 1; i = i++; //i = ++i; System.out.println(i);}i的输出结果分别是多少????一、java运行时的数据区(不要与JMM内存模型搞混)PC 程序计数器存放指令位置虚拟机的运行,类似于这样的循环:while( not end ) { 取PC中的位置,找到对应位置的指令; 执行该指令; PC ++
2020-11-10 14:35:28 157
原创 学习记录--关于对象创建相关问题
一、请解释一下对象的创建过程1.loading(例:new A();把A的class去load到内存)2.class linking1.varification(校验)2.preparation(类的静态变量设默认值)3.resolution(解析)3.class initializing(类的静态变量设初始值,同时执行静态语句块)4.申请对象内存5.成员变量赋默认值6.调用构造方法1.成员变量顺序赋默认值2.执行构造方法语句二、对象在内存中的布局观察虚拟机配置的命令:java
2020-11-09 21:18:37 116
原创 学习记录-- MESI+Cache Line+CPU乱序+Volatile及Synchronize实现细节
1.MESI概念MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议。MESI协议中的状态:CPU中每个缓存行(caceh line)使用4种状态进行标记(使用额外的两位(bit)表示):M: 被修改(Modified)该缓存行只被缓存在该CPU的缓存中,并且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它
2020-11-09 15:21:49 305
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人