Java强化之线程池
Java强化之线程池一、什么是线程池线程池其实就是一种多线程处理形式,处理过程中可以将任务添加到队列中,然后在创建线程后自动启动这些任务。这里的线程就是我们
前面学过的线程,这里的任务就是我们前面学过的实现了Runnable或Callable接口的实例对象;
二、为什么使用线程池使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有线程进行统一的管理和控制,从而提高系
统的运行效率,降低系统运行压力;当然了,使用线程池的原因不仅仅只有这些,我们可以从线程池自身的优点上来进一步了解线程池的好处;
三、使用线程池有哪些优势线程和任务分离,提升线程重用性;
控制线程并发数量,降低服务器压力,统一管理所有线程;
提升系统响应速度,假如创建线程用的时间为T1,执行任务用的时间为T2,销毁线程用的时间为T3,那么使用线程池就免去了T1和T3的时间;
四、线程池应用场景1.网购商品秒杀
2.云盘文件上传和下载
3.12306网上购票系统等
只要有并发的地方、任务数量大或小、每个任务执行时间长或短的都可以使用线程池;只不过在使用线程池的时候,注意一下设置合理的线
程池大 ...
Java强化之泛型
Java强化之泛型一、什么是泛型1.背景:JAVA推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发ClassCastException异常。
2.概念:Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全监测机制,该机制允许我们在编译时检测到非法的类型数据结构。泛型的本质就是参数化类型,也就是所操作的数据类型被指定为一个参数。
3.好处:类型安全
消除了强制类型的转换
4.类型:E - Element (在集合中使用,因为集合中存放的是元素)T - Type(表示Java 类,包括基本的类和我们自定义的类)K - Key(表示键,比如Map中的key)V - Value(表示值)N - Number(表示数值类型)? - (表示不确定的java类型)S、U、V - 2nd、3rd、4th types
二、泛型类、接口1.泛型类(1)使用语法类名<具体的数据类型> 对象名 = new 类名<具体的数据类型> ...
JVM内存与垃圾回收篇第17章垃圾回收器
第 17 章 垃圾回收器1、GC 分类与性能指标1.1、垃圾回收器概述与分类
垃圾回收器概述
垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。
从不同角度分析垃圾收集器,可以将GC分为不同的类型。
Java不同版本新特性
语法层面:Lambda表达式、switch、自动拆箱装箱、enum
API层面:Stream API、新的日期时间、Optional、String、集合框架
底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池位置变化
按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。
串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。
和串行回收相反,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式,使用了“Stop-the-World”机制。
适用场景
在诸如单CPU处理器或者较小的应用内存等硬 ...
JVM内存与垃圾回收篇第16章垃圾回收相关概念
第 16 章 垃圾回收相关概念1、System.gc() 的理解1.1、System.gc() 方法
System.gc() 方法
在默认情况下,通过System.gc()者Runtime.getRuntime().gc() 的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。
然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(不能确保立即生效)
JVM实现者可以通过System.gc() 调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。
在一些特殊情况下,如我们正在编写一个性能基准,我们可以在运行之间调用System.gc()
代码示例:手动执行 GC 操作
代码示例 1
代码
123456789101112131415161718192021222324/** * @author shkstart shkstart@126.com * @create 2020 14:49 */public class SystemGCTest { ...
JVM内存与垃圾回收篇第15章垃圾回收相关算法
第 15 章 垃圾回收相关算法1、标记阶段:引用计数器1.1、标记阶段的目的
垃圾标记阶段:判断对象是否存活
在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。
只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。
那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。
判断对象存活一般有两种方式:引用计数算法和可达性分析算法。
1.2、引用计数算法
方式一:引用计数算法
引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性。用于记录对象被引用的情况。
对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。
优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
缺点:
它需要单独的字段存储计数器,这样 ...
JVM内存与垃圾回收篇第14章垃圾回收概述
第 14 章 垃圾回收概述1、垃圾收集面试题
回顾 JVM 学习路线
关于垃圾收集
Java 和 C++语言的区别,就在于垃圾收集技术和内存动态分配上,C语言没有垃圾收集技术,需要我们手动的收集。
垃圾收集,不是Java语言的伴生产物。早在1960年,第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。
关于垃圾收集有三个经典问题:
哪些内存需要回收?
什么时候回收?
如何回收?
垃圾收集机制是Java的招牌能力,极大地提高了开发效率。如今,垃圾收集几乎成为现代语言的标配,即使经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,对垃圾收集提出了新的挑战,这当然也是面试的热点。
瞅瞅大厂面试题
蚂蚁金服
你知道哪几种垃圾回收器,各自的优缺点,重点讲一下CMS和G1?
JVM GC算法有哪些,目前的JDK版本采用什么回收算法?
G1回收器讲下回收过程GC是什么?为什么要有GC?
GC的两种判定方法?CMS收集器与G1收集器的特点
百度
说一下GC算法,分代回收说下
垃圾收集策略和算法
天猫
JVM ...
JVM内存与垃圾回收篇第13章StringTable
第 13 章 StringTable1、String 的基本特性1.1、String 概述
String 的概述
String:字符串,使用一对 “” 引起来表示
12String s1 = "mogublog" ; // 字面量的定义方式String s2 = new String("moxi"); // new 对象的方式
String声明为final的,不可被继承
String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小
string在jdk8及以前内部定义了final char[] value用于存储字符串数据。JDK9时改为byte[]
为什么 JDK9 改变了 String 的结构
官方文档
http://openjdk.java.net/jeps/254
为什么改为 byte[] 存储?
String类的当前实现将字符存储在char数组中,每个字符使用两个字节(16位)。
从许多不同的应用程序收集的数据表明,字符串是 ...
JVM内存与垃圾回收篇第12章执行引擎
第 12 章 执行引擎1、执行引擎概述
执行引擎位置
执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器
1.1、执行引擎概述
执行引擎概述
执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息。
那么,如果想要让一个Java程序运行起来,执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令才可以。简单来说,JVM中的执行引擎充当了将高级语言翻译为机器语言的译者。
1.2、执行引擎工作过程
执行引擎工作过程
执行引擎在执行的过程中究竟 ...
JVM内存与垃圾回收篇第11章直接内存
第 11 章 直接内存1、直接内存概述
直接内存
不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。
直接内存是在Java堆外的、直接向系统申请的内存区间。
来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存
通常,访问直接内存的速度会优于Java堆。即读写性能高。
因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。
Java的NIO库允许Java程序使用直接内存,用于数据缓冲区
代码示例
代码
1234567891011121314151617181920212223242526/** * IO NIO (New IO / Non-Blocking IO) * byte[] / char[] Buffer * Stream Channel * * 查看直接内存的占用与释放 * @author shkstart shkstart@126.com * @create 2020 0:22 */public class BufferTes ...
JVM内存与垃圾回收篇第10章对象的实例化内存布局与访问定位
第 10 章 对象的实例化内存布局与访问定位1、对象的实例化
大厂面试题
美团:
对象在JVM中是怎么存储的?
对象头信息里面有哪些东西?
蚂蚁金服:
二面:java对象头里有什么
对象实例化
1.1、对象创建的方式
对象创建的方式
new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法
Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public
Constructor的newInstance(Xxxx):反射的方式,可以调用空参的,或者带参的构造器
使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone方法
使用序列化:序列化一般用于Socket的网络传输
第三方库 Objenesis
1.2、对象创建的步骤
从字节码看待对象的创建过程
代码
123456789/** * @author shkstart shkstart@126.com * @create 2020 17:16 */public c ...