JVM 内存与垃圾回收篇-5-直接内存
直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内容,它是Java堆外的、直接向系统申请的内存区间
来源于NIO,通过存在堆中的DirectByteBuffer操作的Native内存
通常,访问直接内存的速度会优于Java堆。即读写性能高
出于性能考虑,读写频繁的场合可能会考虑使用直接内存
Java的NIo库允许Java程序使用直接内存,用于数据缓冲区
直接内存也可能导致OOM
由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存
缺点
分配回收成本较高
不受JVM内存回收管理
直接内存大小可以通过MaxDirectMemorysize设置
如果不指定,默认与堆的最大值-Xmx参数值一致
JVM 内存与垃圾回收篇-4-对象实例化内存布局与方法定位
对象实例化对象的创建方式
使用new关键字
最常见的方式
Xxx的静态方法
XxxBuilder/XxxFactory的静态方法
Class的newInstance()
反射的方式,只能调用空参的构造器,权限必须是public
Constructor的newInstance(Xxx)
反射的方式,可以调用空参、带参的构造器,权限没有要求
使用clone()
不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
使用反序列化
从文件中、网络中获取一个对象的二进制流
第三方 Objenesis
对象的创建步骤
1.判断对象对应的类是否加载、链接、初始化
虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量地中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。
如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。
如果没有找到文件,则抛出ClassNotFoundException ...
MySQL高级篇-6-索引的数据结构
WHY 索引索引是存储引擎用于快速找到数据记录的一种数据结构,MySQL进行数据查找时,首先看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全表扫描,直到找到符合的记录。创建索引目的是减少磁盘I/O次数,加快查询速度
索引及其优缺点 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构
索引是在存储引擎中实现的,因此每种存储引擎的索引不一定完全相同,并且每种索引引擎不一定支持所有索引类型。同时,存储引擎可以定义未每个表的最大索引数和最大索引长度。所有索引引擎支持每个表至少16个索引,总索引长度至少为256字节
优点
提高数据检索的效率,降低 数据库的IO成本
通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性
在实现数据的 参考完整性方面,可以 加速表和表之间的连接,即对于有依赖关系的子表和父表联合查询时, 可以提高查询速度。
在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗
缺点
创建索引和维护索引要耗费时间,并 且随着数据量的增加,所耗费的时 ...
数据结构-8-暴力递归
Hanoi
1234567891011121314151617public void process(int index, String from, String to, String other) { if (index == 1) { // base case 如果仅剩一个盘子,则直接放到to位置 System.out.println("将" + index + "从" + from + "移动到" + to); } else { // i - 1, from -> other process(index - 1, from, other, to); // i, fom -> to System.out.println("将" + index + "从" + from + "移动到" + to); //i - 1, o ...
JUC-2-CompletableFuture
Future接口
Future接口(FutureTask实现类)提供一种异步并行计算的功能(获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕)
如果主线程需要执行耗时的计算任务,可以通过future把这任务放到异步线程中执行,主线程继续处理其他任务或者先行结束,再通过future获取计算结果。它可以为主线程开一个分支任务,专门为主线程处理耗时和费力的复杂业务
Future接口常用实现类FutureTask异步任务
多线程
有返回值
异步任务
优点:future + 线程池异步多线程任务配合,能显著提高程序的执行效率
缺点:
get()阻塞:一旦调用get()方法求结果,如果计算没有完成容易导致程序阻塞;
isDone轮询:
轮询的方式会耗费CPU资源,而且不一定能及时得到计算结果
如果想要异步获取结果,通常会以轮询的方式去获取结果,尽量不要阻塞
结论:Future对于结果的获取不是很友好,只能通过阻塞或轮询的方式得到任务的结果
CompletableFuture对Future的改进
回顾Future
get()方法在Future ...