Java并发编程及虚拟机
文章平均质量分 85
Java并发编程及虚拟机学习
BoringError
字节跳动后端工程师 | 持续学习,保持敬畏
展开
-
JVM学习(1)-虚拟机内存区域划分以及内存溢出
Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途以及创建和销毁的时间,有些区域会随着虚拟机进程的启动而存在,有的区域会依赖线程的创建和结束而建立和销毁。理解Java虚拟机内存区域的划分,会对对象的分配、内存的分配、堆栈溢出异常有进一步的了解。原创 2019-05-12 16:30:43 · 781 阅读 · 0 评论 -
JVM学习(2)-JVM内存模型与内存分配相关
一、Java虚拟机内存模型相关1.JVM内存区域JVM内存区域可分为线程私有和线程共享两个大部分,其中线程私有的包括:程序计数器、JVM栈、本地方法栈;而线程共享的包括:Java堆、方法区。TIP:JDK 1.8中,去除了方法区,以直接内存中的元空间取代。2.每一块内存区域的作用1.程序计数器程序计数器是一块很小的内存区域,其中存储的是当前线程所执行到的子节码行号;子节码指示器通过改...原创 2019-12-02 23:01:13 · 305 阅读 · 0 评论 -
JVM学习(3)-垃圾回收相关
文章目录1.如何判断对象是否死亡2.如何判断一个常量是废弃常量3.如何判断一个类是废弃类4.不可达对象一定会被回收吗5.四种引用类型的作用是什么1.强引用(StrongReference)2.软引用(SoftReference)3.弱引用(WeakReference)4.虚引用(PhantomReference)6.垃圾回收算法有哪些7.每种垃圾回收算法的垃圾收集方式及优缺点1.标记-清除算法2....原创 2019-12-02 23:06:42 · 249 阅读 · 0 评论 -
JVM学习(4)-垃圾收集器
文章目录1.Serial垃圾收集器2.ParNew垃圾收集器3.Parallel Scavenge垃圾收集器4.Serial Old垃圾收集器5.Parallel Old垃圾收集器6.==CMS垃圾收集器==7.==G1垃圾收集器==1.Serial垃圾收集器Serial垃圾收集器是最早出现的新生代收集器。作用域:新生代使用算法:复制算法线程数:单线程特点:在垃圾收集的过程中,由于是...原创 2019-12-02 23:16:58 · 303 阅读 · 0 评论 -
JVM学习(5)-类加载过程与双亲委派机制
文章目录1.为什么Java可以实现一次编写,到处运行2.Class的类文件结是怎么样的3.类加载介绍4.类加载的过程5.类加载过程中每一步都做了什么1 加载2 验证3 准备4 解析5 初始化6.类加载器的作用是什么7.有哪些类加载器8.什么是双亲委派机制9.为什么要使用双亲委派机制10.如何判断两个类是否相等1.为什么Java可以实现一次编写,到处运行Java中,JVM可以理解的代码就叫做字...原创 2019-12-02 23:21:51 · 374 阅读 · 0 评论 -
JVM学习(6)-JVM工具以及GC调优策略
文章目录一.JVM工具一.命令行工具1.jps2.jstat3.jinfo4.jstack5.jmap6.jhat二.图形化工具1.JConsole2.VirtualVM二.GC调优策略1.什么是GC调优2.GC调优原则2.常用的JVM启动参数3.GC调优策略无需GC调优的情况1.将对象尽可能分配到新生代2.将大对象分配到老年代3.合理设置新生代转移到老年代的年龄Thanks一.JVM工具一....原创 2019-12-11 17:33:16 · 642 阅读 · 4 评论 -
JVM学习(7)-G1垃圾收集器介绍
文章目录一.简单介绍二.垃圾回收区域变化三.如何保证在预测时间内完成垃圾收集四.垃圾收集的过程1.初始标记2.并发标记3.重新标记4.筛选回收Thanks一.简单介绍官方文档描述:The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machine...原创 2019-12-28 16:58:04 · 747 阅读 · 0 评论 -
JVM学习(8)-Java中的四种引用总结
JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为Strong强引用、Soft软引用、Weak弱引用、Phantom虚引用四种(引用强度逐渐减弱),它们被用来标识对象在GC过程中的生命周期,使得虚拟机更合理地根据内存的大小和对象作用选择是否回收掉这些引用。原创 2020-01-27 22:03:11 · 435 阅读 · 0 评论 -
Java并发编程(12)-AQS及其组件介绍
文章目录一.AQS相关1.什么是AQS?2.AQS的核心原理是什么?3.使用AQS实现一个互斥锁4.AQS定义了哪两种对资源的共享方式?1.==Exclusive(独占)==:只有一个线程能够获取到该资源,如ReentrantLock。对于独占锁,又可分为公平锁和非公平锁:2.==Share(共享)==:可以有多个线程获取到该资源,如Semaphore、CountDownLatch、CyclicB...原创 2019-11-24 00:27:18 · 407 阅读 · 0 评论 -
Java并发编程(11)-使用ReentrantLock与Condition实现生产者-消费者队列
Condition在Java并发编程中是一个十分常用的接口,被称为条件变量,常与显式锁和可重入锁一起使用,它可以在某些条件下使线程进行休眠或者唤醒,本文将以实现生产者-消费者模式的队列作为demo让大家对条件变量 有初步的了解。原创 2018-11-08 20:40:39 · 742 阅读 · 0 评论 -
Java并发编程(9)-CountDownLatch
文章目录一、什么是闭锁二、CountDownLatch类介绍2.1、什么是CountDownLatch2.2、构造方法2.3、主要方法三、使用闭锁完成并发测试本文将介绍什么是闭锁,在java中的闭锁实现:CountDownLatch类及其常用方法等,最后给出了一个使用闭锁模拟线程并发的demo,用以简单地测试任务是否为线程安全。一、什么是闭锁闭锁(Latch)是在并发编程中常被提及的概...原创 2018-11-05 17:45:32 · 292 阅读 · 0 评论 -
Java并发编程(8)-Semaphore
文章目录一、Semaphore信号量1.1、什么是信号量1.2、信号量在并发编程中的作用二、Semaphore类简单解读2.1、构造方法解读2.2、常用方法解读三、简单程序解读一、Semaphore信号量1.1、什么是信号量以一个停车场是运作为例。为了简单起见,假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的...原创 2018-11-02 15:02:05 · 613 阅读 · 1 评论 -
Java并发编程(1)-线程安全基础入门知识
Java并发编程第一篇博客,主要讲解线程的安全性,有无状态类是什么,以及原子性,原子操作,竞争操作,复合操作机制,最后讲解锁机制,使用内部锁以及内部锁的解读。原创 2018-10-20 22:14:59 · 1958 阅读 · 3 评论 -
Java并发编程(2)-线程安全之共享对象解读
在上一篇关于线程安全概述的文章中提到过,编写正确的并发程序的关键在于对共享的、可变状态的变量进行访问管理,上一篇着重讲解使用同步来避免多个线程在同一时间访问同一数据;这一篇将讲解共享和发布对象的技术,使多个线程能够安全地访问他们。>本文内容均总结自《Java并发编程实践》第三章 共享对象 章节的内容 ,详情可以查阅该书。原创 2018-10-21 18:10:11 · 421 阅读 · 0 评论 -
Java并发编程(4)-同步容器和并发容器
Java平台的类库包含了一个并发构造块的丰富集合,本篇将介绍在并发编程中十分常用的两种容器类,一是同步容器,二是并发容器,它们在某些特定的场合中可以用来替代我们常用的集合类,比如在高并发和多线程请求的情况下。> 本篇总结自《Java并发编程实践》第五章 构造块 章节的内容,详情可以阅读该书。原创 2018-10-24 21:53:21 · 372 阅读 · 0 评论 -
Java并发编程(7)-ThreadPoolExecutor的饱和策略
文章目录一、ThreadPoolExecutor的饱和策略1.1、什么是饱和策略1.2、Abort策略1.3、.CallerRuns策略1.4、Discard策略1.5、DiscardOldest策略二、ThreadPoolExecutor的扩展方法本文将介绍ThreadPoolExecutor的饱和策略以及ThreadPoolExecutor的扩展方法;当线程充满了ThreadPool的有...原创 2018-10-31 23:45:00 · 1611 阅读 · 0 评论 -
Java并发编程(5)-Executor线程调度框架的使用
文章目录一、Executor线程调度框架1.1、什么是线程调度框架1.2、Executors1.3、Executor1.4、ExecutorService1.5、ScheduledThreadPoolExecutor二、各类线程池2.1、newFixedThreadPool2.2、newCachedThreadPool2.3、newScheduledThreadPool2.4、newSingleT...原创 2018-10-27 12:25:17 · 583 阅读 · 0 评论 -
Java并发编程(6)-线程池总结
在上文中已经写过Executor线程调度框架的使用及几种线程池,它们是整个Java并发编程的核心内容;本文将继续讲解和Executor一样重要的自定义线程池,它能让我们自己去定义一个多线程的执行者拥有的线程核心数、最大线程数、空闲线存活时间等。>本篇总结自《Java并发编程实践》第八章 应用线程池 ,以及相关博客,想要更加深入了解的同学建议阅读该书。原创 2018-10-30 22:12:37 · 203 阅读 · 0 评论 -
Java并发编程(10)-显式锁和读写锁
在Java5.0之前,用于调节共享对象访问的机制只有synchronized和volatile。Java5.0之后提供了新的选择:**ReentrantLock,即显式锁**。显式锁与之前提过的synchronized的同步互斥 机制不太一样,ReentrantLock并不作为内部锁机制的替代,而是当内部锁机制有局限时可供选择的高级特性。> 本文总结自《Java并发编程实践》 第十三章 显式锁 。原创 2018-11-06 14:13:25 · 332 阅读 · 0 评论 -
Java并发编程基础-Java内存模型、volatile关键字与指令重排序及happens-before原则
Java并发编程实战学习笔记目录1.什么是Java内存模型?它和JVM内存模型有什么区别?2.Java内存模型有哪些组成部分?3.volatile关键字的作用?4.什么是指令重排序5.指令重排序必须满足什么条件6.指令重排序会对多线程造成影响吗7.什么是happens-before关系8.happens-before和as-if-serial语义之间的区别...原创 2018-06-06 19:10:21 · 2746 阅读 · 0 评论 -
Java并发编程(3)-如何构造线程安全应用
到目前为止,前两篇文章已经介绍了线程安全与同步的基础知识。但是我们并不希望为了获得线程安全而去分析每次内存访问;而希望线程安全的组件能够以安全的方式组合成更大的组件或者程序。这一篇将介绍一些构造线程安全类的通用模式,这些模式让类更容易成为线程安全类。> 本篇总结自《Java并发编程实践》第四章 组合对象 章节的内容 ,详情可以查阅该书。原创 2018-10-22 22:53:18 · 303 阅读 · 0 评论