0%

一、Full GC 与 Minor GC

  • Minor GC 表示新生代GC:指发生在新生代的垃圾收集动作,因为Java对象大多都具备朝生熄灭的特性,所以Minor GC会比较频繁,一般速度也比较快。

  • Full GC(Full GC/Major GC) 表示老年代GC:指发生在老年代的GC,出现了Full GC经常会伴随至少一次的Minor GC(但非绝对的,在Parallel Scanvenge收集器的收集策略里就有直接进行Full GC的策略选择过程)。Full GC的速度一般会比Minor GC慢10倍以上。

Java虚拟机的内存分配主要遵循对象优先分配在Eden区,大对象和长期存活的对象分配在老年代、动态对象年龄判定以及空间分配担保策略。下面我们分别介绍这些策略。

阅读全文 »

在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是虚拟机的类加载机制。

在Java语言里面,类的加载、连接和初始化过程都是在程序运行期间完成的,也就是具有运行期动态加载和动态连接的特点。

阅读全文 »

以下是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器可以配合使用。

  • 单线程与并行(多线程):单线程指的是垃圾收集器只使用一个线程进行收集,而并行使用多个线程。
  • 串行与并发:串行指的是垃圾收集器与用户程序交替执行,这意味着在执行垃圾收集的时候需要停顿用户程序;并发指的是垃圾收集器和用户程序同时执行。除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行。
阅读全文 »

一、JDK 命令行工具

Java的bin目录下有很多命令行工具,比如我们熟悉的“java.exe”和“javac.exe”,下面我们将介绍一些用于监视虚拟机和故障处理的工具,主要如下表所示:

jps:虚拟机进程状况工具

jps工具可以列出正在运行的虚拟机进程,并显示虚拟机执行主类的名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。

阅读全文 »

本系列文章摘抄自MySQL索引背后的数据结构及算法原理

本系列文章以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,我们将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引暂不讨论。

阅读全文 »

本系列文章摘抄自MySQL索引背后的数据结构及算法原理,基于本文,本人对此进行了一些修改和补充。

MySQL的优化主要分为结构优化(Scheme optimization)和查询优化(Query optimization)。本文讨论的高性能索引策略主要属于结构优化范畴。本文的内容完全基于前面两篇文章的理论基础,实际上一旦理解了索引背后的机制,那么选择高性能的策略就变成了纯粹的推理,并且可以理解这些策略背后的逻辑。

阅读全文 »

首先我们先来看一个题:给定一个字符串str,返回str中最长回文子串的长度。比如str = “123”,其中的最长回文子串为”1”、”2”、”3”,所以返回1。又比如str = “abc1234321ab”,其中的最长回文子串为”1234321”,所以返回7。

面对字符串”a131b”,我们寻找字符串中回文子串的最直观的想法也许是在遍历字符串的过程中,以当前字符为中心,向两边“扩”来对比两边的字符是否相等,然后记录回文子串长度。比如当前遍历到的字符为a,只有右边有字符,所以回文子串”a”的长度为1;当遍历到的字符为1时,左右两边的字符分别为’a’和’3’不相等,所以回文子串”1”的长度为1;当遍历到的字符为3时,左右两边的字符都为’1’,记录下长度,然后继续向两边比较,此时‘a’和’b’不相等,所以回文子串”131”的长度为3。。。

阅读全文 »

什么是单调栈

从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈单调递减栈

  • 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小
  • 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大
模拟单调栈的数据push和pop

模拟实现一个递增单调栈:

现在有一组数10,3,7,4,12。从左到右依次入栈,则如果栈为空入栈元素值小于栈顶元素值,则入栈;否则,如果入栈则会破坏栈的单调性,则需要把比入栈元素小的元素全部出栈。单调递减的栈反之。

  • 10入栈时,栈为空,直接入栈,栈内元素为10。
  • 3入栈时,栈顶元素10比3大,则入栈,栈内元素为10,3。
  • 7入栈时,栈顶元素3比7小,则栈顶元素出栈,此时栈顶元素为10,比7大,则7入栈,栈内元素为10,7。
  • 4入栈时,栈顶元素7比4大,则入栈,栈内元素为10,7,4。
  • 12入栈时,栈顶元素4比12小,4出栈,此时栈顶元素为7,仍比12小,栈顶元素7继续出栈,此时栈顶元素为10,仍比12小,10出栈,此时栈为空,12入栈,栈内元素为12。

伪代码如下:

1
2
3
4
5
6
7
8
stack<Integer> st;
for (遍历这个数组) {
while (栈不为空 && 栈顶元素小于当前元素) {
栈顶元素出栈;
更新结果;
}
当前数据入栈;
}
题目描述

给定一个不含有重复值的数组 arr,找到每一个 i 位置左边和右边离 i 位置最近且值比 arr[i] 小的位置。返回所有位置相应的信息。

输入描述:

第一行输入一个数字 n,表示数组 arr 的长度。
以下一行输出 n个数字,表示数组的值。

输出描述:

输出n行,每行两个数字 L 和 R,如果不存在,则值为-1,下标从0开始。

示例1

输入
7
3 4 1 5 6 2 7

输出
-1 2
0 2
-1 -1
2 5
3 5
2 -1
5 -1

阅读全文 »