自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 收藏
  • 关注

原创 Java多线程与并发脑图

2022-01-05 20:27:58 205

原创 程序员书单

https://www.w3cschool.cn/booklist/booklist-58g93fhi.html

2021-08-10 18:24:20 74

原创 MYSQL内置函数

MySQL 字符串函数函数 描述 实例 ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码。 返回 CustomerName 字段第一个字母的 ASCII 码: SELECT ASCII(CustomerName) AS NumCodeOfFirstCharFROM Customers; CHAR_LENGTH(s) 返回字符串 s 的字符数 返回字符串 RUNOOB 的字符数 SELECT CHAR

2021-08-06 14:33:30 66

原创 SQL 连接(JOIN)

join用于把来自两个或多个表的行结合起来。INNER JOIN:返回两表的笛卡尔积中满足ON筛选条件的行;LEFT JOIN:将左表中不满足ON筛选条件的行(右表对应的值填NULL)添加到INNER JOIN的结果中;RIGHT JOIN:将右表中不满足ON筛选条件的行(左表对应的值填NULL)添加到INNER JOIN的结果中;OUTERJOIN:将左、右两表中不满足ON筛选条件的行都添加到INNER JO...

2021-08-06 14:16:36 57

原创 SQL用于各种数据库的数据类型

Microsoft Access 数据类型数据类型 描述 存储 Text 用于文本或文本与数字的组合。最多 255 个字符。 Memo Memo 用于更大数量的文本。最多存储 65,536 个字符。注释:无法对 memo 字段进行排序。不过它们是可搜索的。 Byte 允许 0 到 255 的数字。 1 字节 Integer 允许介于 -32,768 与 32,767 之间的全部数字。 2 字节 Long 允许介于

2021-08-06 11:17:28 227

原创 SQL查询语句执行顺序

SQL逻辑查询语句执行顺序(7) SELECT (8) DISTINCT <select_list>(1) FROM <left_table>(3) <join_type> JOIN <right_table>(2) ON <join_condition>(4) WHERE <where_condition>(5) GROUP BY <group_by_li

2021-08-06 11:13:00 720

原创 垃圾收集器

1、串行回收器 使用单线程进行独占式(暂停其他工作线程)的垃圾回收,对于并行能力较弱的计算机,串行回收器的专注性和独占性往往有更好的性能表现。根据作用堆空间的不同,分为新生代串行回收器和老年代串行回收器。 新生代串行回收器使用复制算法,逻辑处理高效且没有线程切换的开销,在单CPU或并发能力较弱的场合,它的性能表现可以超过并行回收器和并发回收器。是运行在client模式下的虚拟机默认的新生代垃圾收集器。 一次新生代串行回收器的工作输出日志如下所示。...

2021-07-27 16:41:51 49

原创 对象的可触及性

垃圾回收的基本思想是观察每一个对象的可达性,即从根节点开始是否可以访问到这个对象,如果可以,说明当前对象正在被使用,如果从所有的根节点都无法访问到某个对象,说明对象已经不再使用。一般来说,不可达的对象需要被回收,但此对象可能在某个条件下复活自己,如果这样,对此对象的回收就是不合理的。因此需要给出一个对象可触及性状态的定义,并规定在什么状态下才可以安全地回收对象。 可触及性包含以下3种状态。 可触及的:从根节点开始,可以到达这个对象; 可复...

2021-07-27 13:38:40 126

原创 垃圾回收算法

1、引用计数法(Reference Counting) 实现简单,为每个对象配备一个整型的引用计数器,只要有任何对象引用了该对象,该对象引用计数器的值加1,引用失效,则计数器的值减1。只要对象的引用计数器的值为0,该对象就不再被使用。 缺点是无法处理循环引用的情况,且每次引用产生和消除时,需要执行加法和减法操作,影响系统性能。因此Java回收器没有使用引用计数法。2、标记清除法(Mark-Sweep) 标记阶段,标记所有从根节点可达的对象,清除阶...

2021-07-27 09:39:30 61

原创 Java虚拟机参数

1、GC参数 -XX:+PrintGC,使用这个参数启动Java虚拟机后,遇到GC就会打印日志。 日志显示,一共进行了4次GC,GC前后的堆空间使用量分别为4MB左右和377KB,当前可用堆最大内存约为16MB,最后显示的是本次GC花费的时间。-XX:+PrintGCDetails,打印更详细的GC信息,还会使虚拟机在退出前打印堆的详细信息。系统经历了3次GC,第1次是新生代GC,新生代从回收前的8MB左右降低到1MB,整个...

2021-07-26 19:39:29 489

原创 Java虚拟机的基本结构

Java虚拟机的基本结构如下图所示: 类加载子系统负责从文件系统或网络中加载Class信息,加载的类信息存放于方法区。除了类信息,方法区还会存放运行时常量池信息,包括字符串字面量和数字常量(Class文件中常量池部分的内存映射)。 Java堆在系统启动的时候建立,几乎所有的Java对象都存放在Java堆中,堆空间是所有线程共享的。 Java的NIO库允许Java程序使用直接内存,直接内存是在Java堆外的、直接向系统申请的内存。访问直...

2021-07-26 14:43:12 254

原创 数字在Java虚拟机中的表示

1、整数在Java虚拟机中的表示 Java虚拟机中,整数有byte、short、int、long四种,分别表示8位、16位、32位、64位有符号整数。整数在计算机中使用补码表示,Java虚拟机也不例外。学习补码之前,必须先理解原码和反码。 原码,就是符号位加上数字的二进制表示。以int为例,第1位表示符号位(正数或负数),其余31位表示该数的二进制值。 10的原码:00000000 00000000 00000000 00001010...

2021-07-26 14:01:39 273

原创 字节码指令

Java虚拟机的指令由操作码(Opcode,代表某种特定操作的数字,长度为1个字节)和操作数(Operands,操作所需的参数)构成。由于Java虚拟机采用面向操作数栈而不是寄存器的指令集架构,所以大多数指令都只有操作码没有操作数。 由于限制了操作码的长度为1个字节,意味着指令集中的操作码总数不能超过256条。又由于Class文件放弃了编译后代码的操作数长度对齐,所以虚拟机在处理长度超过1个字节的数据时,必须在运行时重建数据的结构(如存储16位的无符号整数时,代码中应转变为...

2021-07-23 17:40:51 88

原创 类文件结构

1、虚拟机的中立特性 平台无关性:虚拟机提供商发布了各种可以在不同平台上运行的虚拟机,这些虚拟机统一运行一种与平台无关的程序存储文件即字节码文件。 语言无关性:虚拟机不和包括Java在内的任何语言绑定,只关联Class类文件这种特殊的二进制格式文件,任何语言都可以表示为Class类文件(如Groovy程序被groovyc编译器编译成Class文件)从而在虚拟机上运行。2、Class类文件结构 每个Class文件都唯一对应一个类或接口的定义信息,但类或...

2021-07-22 21:17:00 130

原创 调优案例分析与实战

1、高性能硬件上的程序部署策略 一个每天15万PV(Page View,页面浏览量)的在线类型文档网站,硬件升级前使用32位系统1.5GB的堆,用户感觉使用网站比较缓慢。升级为64位系统、4CPU、16GB物理内存的服务器后,管理员为了尽量利用硬件资源选用了64位的JDK,并将堆大小设置为12GB,使用一段时间后,发现网站经常不定期出现长时间失去响应的情况。 监控服务器运行服务状况后发现网站失去响应是由GC停顿导致的,虚拟机运行在Server模式,默认使用吞吐量优先收集器...

2021-07-20 19:37:07 85

原创 虚拟机性能监控与故障处理工具

JDK命令行工具 JDK的bin目录下的命令行工具(*.exe,如java.exe、javac.exe)的功能代码主要是在lib/tools.jar类库中实现的,其实是对tools.jar的一层薄封装。1、jps:虚拟机进程状况工具 JVM Process Status Tool可以列出正在运行的虚拟机进程,显示进程的LVMID(Local Virtual Machine Identifier,本地虚拟机ID)和主类(main()方法所在的类)的名称。 ...

2021-07-19 20:58:22 527

原创 内存分配与回收策略

对象的分配通常就是指在堆上分配(也可能经过JIT编译后间接地在栈上分配),主要分配在新生代的Eden区,如果启动了本地线程分配缓冲将按线程优先在TLAB上分配,也可能直接分配在老年代,分配的规则取决于使用的垃圾收集器的组合及虚拟机内存相关参数的设置。1、对象优先在Eden分配 大多数对象在新生代Eden区中分配,Eden区空间不够时虚拟机将发起一次Minor GC。2、大对象直接进入老年代 指定JVM运行时参数-Xms20M、-...

2021-07-16 17:20:59 78

原创 垃圾收集器常见参数

2021-07-15 17:22:19 75

原创 阅读GC日志

2.766: [GC (Allocation Failure) 2.766: [DefNew: 61826K->7616K(68800K), 0.0313370 secs] 92247K->38390K(221760K), 0.0314264 secs] [Times: user=0.07 sys=0.00, real=0.03 secs] 2.766 - GC发生的时间,值为从虚拟机启动以来经过的秒数; GC - 垃圾收集的停顿类型,Full GC代表...

2021-07-15 17:14:53 72

原创 垃圾收集器

1、Serial收集器 一个单线程收集器,只使用一条线程完成垃圾收集工作,必须暂停其他工作线程(Stop The World)直到收集工作完成。运行在client模式下的虚拟机默认的新生代收集器,对于限定单个CPU的环境来说,Serial收集器没有线程交互的开销,可以获得最高的单线程收集效率。在桌面应用场景中,分配给运行在client模式下虚拟机的内存至多一两百兆,停顿时间最多一百多毫秒,只要不频繁发生,应用是可以接受的。2、ParNew收集器 ...

2021-07-15 13:49:24 48

原创 HotSpot的算法实现

1、枚举根节点进行可达性分析时,在整个分析期间不可以出现对象引用关系变化的情况,因此必须停顿所有的Java执行线程(Sun称为“Stop The World”)。如果逐个检查GC Roots节点(包括方法区中的常量或类的静态属性、栈帧中的本地变量表中的属性)中的引用,会导致停顿时间过长,影响程序性能。HotSpot使用一组称为OopMap的数据结构来记录程序中的引用,类加载完成时,计算出对象内各偏移量上的数据类型,在JIT编译过程中,在特定的位置记录下栈和寄存器中哪些位置...

2021-07-13 21:08:05 121

原创 垃圾收集算法

1、标记-清除算法(老年代)缺点:标记和清除过程效率低;标记清除之后会产生大量不连续的内存碎片,导致无法分配给对象足够的连续内存从而提前触发下一次垃圾回收。2、复制算法(新生代)为了解决效率问题,将可用内存划分为大小相等的两块,每次只使用其中的一块,回收时将还存活的对象复制到另一块上面,再把已使用的内存清空。优点:每次只对半区进行回收,不存在内存碎片。缺点:可用内存只有原来的一半,对象存活率较高时需要较多的复制操作。...

2021-07-13 21:06:05 50

原创 方法区的回收

废弃常量的回收:与堆中对象的回收类似,没有被系统引用的常量池中的常量在必要的时候将会被回收。无用的类的回收:判定:该类的所有实例已经被回收;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有被引用,无法通过反射访问该类的方法。是否对无用的类进行回收,虚拟机提供了参数进行控制。...

2021-07-13 21:01:41 36

原创 对象的回收

在可达性分析算法中的不可达对象还要至少经历两次标记过程,才会真正被系统回收。第一次标记:对象在可达性分析后为不可达。筛选:筛选出没有覆盖finalize()方法且finalize()方法没有被虚拟机调用过的对象,放置在一个叫做F-Queue的队列,由虚拟机自动建立的、低优先级的Finalizer线程去执行对象的finalize()方法(任何一个对象的finalize()方法只会被系统自动调用一次)。第二次标记:由GC对F-Queue中的...

2021-07-13 21:00:31 76

原创 对象的引用

定义:如果reference类型的数据中存储的数值代表另一块内存的起始地址,称这块内存代表一个引用。缺陷:过于狭隘,对象在这种定一下只有被引用和没被引用两种状态,无法描述一些“食之无味,弃之可惜”的对象。扩展:强引用:如Object obj = new Object(),存在强引用的对象永远不会被回收。软引用:由SoftReference类实现,存在软引用的对象在系统发生内存溢出前才被回收...

2021-07-13 20:58:11 34

原创 对象是否存活判定方法

1、引用计数算法对象中添加一个引用计数器,每有地方引用它,计数器的值加1,若引用失效,则计数器的值减1,任何时刻计数器为0的对象就是不再被使用的对象。优点:实现简单,判定效率高。缺点:很难解决对象之间相互循环引用的问题。2、可达性分析算法以一系列称为GC Roots的对象(java栈中引用的对象、方法区中类静态属性和常量引用的对象、本地方法栈中引用的对象)作为起点向下搜索,走过的路径称为引用链,当一个对象到GC Roots没有任何引用链...

2021-07-13 20:56:10 51

原创 对象的访问

程序需要通过栈上的引用来访问操作堆上的具体对象,主要有两种访问方式。使用句柄:直接指针:

2021-07-13 20:53:53 44

原创 对象的内存分配

对象头:包括两部分信息,第一部分存储对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳等。另一部分是类型指针,指向对象类的元数据,确定对象是哪个类的实例。不是所有虚拟机都必须保留类型指针,因为查找对象元数据信息并不一定要经过对象本身。实例数据:程序中所定义的各种类型的字段内容(包括从父类继承下来的),存储顺序受虚拟机分配策略参数和字段在程序中定义的顺序影响。虚拟机默认的分配策略,相同宽度的字段分配到一起,父类中定义的字段出现在子...

2021-07-13 20:47:21 59

原创 对象的创建

对象在虚拟机中的创建过程:1、执行类加载检查检查new指令的参数能否在常量池中定位到一个类的符号引用,并检查这个符号引用的类是否已被加载、解析和初始化过。如果没有,先执行相应的类加载过程。2、分配内存对象所需内存的大小在类加载完成后便完全确定,从java堆中分配一块确定大小的内存出来,有两种分配方式,选择哪种方式由java堆是否规整决定,而java堆是否规整又由垃圾收集器是否带有压缩整理功能决定。指针碰撞:java堆内存规整,...

2021-07-13 20:45:50 46

原创 Java内存区域

本地直接分配内存:避免了在java堆和native堆中来回复制数据虚拟机运行时内存:线程共享内存:堆:存放对象实例。方法区(常量池:存放编译期生成的各种字面量和符号引用,也可以在运行时将常量放入池中,如String.intern()方法):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。线程隔离内存:java方法栈:生名周期与线程相同,描述ja...

2021-07-13 20:37:14 37

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除