- 博客(25)
- 收藏
- 关注
原创 垃圾收集器与内存分配策略
概述在 Java 运行时,其中程序计数器,虚拟机栈,本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而执行着出栈入栈的操作,每一个栈帧中分配多少内存基本是在类结构确定下来就已知了,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了,而 Java 堆和方法区则不一样,一个接口中的多个实现类需要的...
2019-06-12 15:02:44
140
原创 JVM 类加载器
类的加载器就是负责类的加载职责,对于任意一个 class,都需要由加载它的类加载器和这个类本身确立其在 JVM 中的唯一性,任何一个对象的 class 在 JVM 中只存在唯一的一份JVM 内置的三大类加载器JVM 中提供了三大内置的类加载器,不同的类加载器负责不同的类加载到JVM 内存之中,并且它们之间严格遵守父委托机制根类加载器介绍根加载器又称为 Bootstrap 类启动器,该类加...
2019-05-28 19:58:01
167
原创 volatile 关键字详细介绍
本文将通过 Java 内存模型,CPU 缓存模型入手讲解 volatile 关键字的使用和原理初识 volatile 关键字public class VolatileFoo { final static int MAX = 5; static volatile int init_value = 0; public static void main(String[] a...
2019-05-28 19:56:02
169
原创 类的加载过程
类的加载过程ClassLoader 的主要职责就是负载加载各种 class 文件到 JVM 中,ClassLoader 会尝试加载并且在 JVM 中生成这个类的各个数据结构,然后使其分布在 JVM 对应的内存区域中类的加载过程简介类的加载过程一般分为加载,连接,初始化三个阶段加载阶段:主要负责查找并加载二进制数据文件,生成一个代表这个类的 Class 对象连接阶段验证:主要确保类...
2019-05-27 20:27:37
116
原创 Hook 线程以及捕获线程执行异常
Hook 线程以及捕获线程执行异常本文中,将介绍如何获取线程在运行时期的异常信息,以及如何向 Java 程序注入 Hook 的过程获取线程运行时异常public void setUncaughtExceptionHandler(UncaughtExceptionHandler eh)public UncaughtExceptionHandler getUncaughtExceptionHa...
2019-05-26 16:49:27
365
原创 Exception 和 Error
Exception 和 ErrorJava语言在设计之初就提供了相对完善的异常处理机制,本文 主要对比的讲述 Exception 和 Error,以及实践中的选择java中异常层次结构Exception 和 Error 都是继承 Throwable 类,在Java中只有 Throwable 类型的实例才能被抛出 (throw) 或者捕获 (catch),它是异常处理机制的基本组成类型Exc...
2019-05-26 15:52:16
185
原创 ThreadGroup 详细讲解
ThreadGroup 详细讲解在初识线程文章中,我们多次提到 ThreadGroup 的概念,在创建线程的时候如果没有显示指定 ThreadGroup , 那么新的线程会加入与父线程相同的 ThreadGroup 中,在本文中,将详细讲解有关 ThreadGroup 的知识1. ThreadGroup 与 Thread在Java程序中,默认情况下,新的线程都会加入到 main 线程所在的 ...
2019-05-26 10:44:29
814
原创 线程安全与数据同步
本文,我们主要将探讨如何在安全的前提下高效的共享数据数据同步synchronized关键字This monitor 和 Class monitor的详细介绍程序死锁的原因和诊断数据同步首先我们来看一个数据不一致的例子public class TicketWindowRunnable implements Runnable { private int index = 1;...
2019-05-25 23:12:15
169
1
原创 线程间的通信
多个线程实现互斥访问资源时会互相发送信号或等待信号,比如线程等待数据到来的通知,线程收到变量修改的通知等,本文将通过一些案例分析java提供的原生通信API,以及这些通信机制背后的内幕同步阻塞与异步非阻塞同步阻塞消息处理假如这样一个系统功能,客户端提交Event到服务器,服务器接受到客户请求之后开辟线程处理,经过复杂计算后返回给客户端分析这个系统,发现:同步Event提交,客户端等待...
2019-05-25 20:17:49
137
原创 Thread API 详细介绍
本文将从常用的Thread API 角度讲解线程相关的操作和用法线程sleep,yield线程优先级,获取线程ID,设置线程上下文加载器线程的interrupt,join如果关闭一个线程线程sleepsleep 是一个静态方法,有两个重载方法,一个需要传入毫秒数,另外一个继续毫秒数也需要纳秒数public static void sleep(long millis, int n...
2019-05-23 23:22:27
1001
原创 深入理解Thread构造函数
Java 中提供了丰富的构造函数,在本文中,将介绍每一个构造函数,以及分析一些可能你未关注的细节线程的命名在构造线程的时候可以为线程起一个特殊意义的名字,有利用实际问题的排查和线程跟踪线程的默认命名 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } p...
2019-05-23 19:19:14
1255
原创 认识线程
目录结构如何快速启动线程线程的生命周期关于start方法的剖析Runnable 的引入如何快速启动线程创建一个线程类(Thread),重写Thread中Run方法启动新的线程,只有调用了Thread的start方法,才代表派生了一个新的线程,否则Thread和普通的Java对象没有任何区别,start方法是一个立即返回的方法,不会让程序陷入阻塞线程的生命周期每一个...
2019-05-23 15:57:22
86
原创 ArrayList容器
继承体系,实现双端队列,内部是链表结构ArrayList中关键字段说明private static final int DEFAULT_CAPACITY = 10; //默认初始化的容量为10 private static final Object[] EMPTY_ELEMENTDATA = {}; //空数组实例private...
2019-05-22 16:34:26
180
原创 Java内存模型与线程
内存模型特定的操作协议下,对特对的内存或高速缓存进行读写访问的过程抽象Java虚拟机规范中试图定义一种Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下达到一致的内存访问效果Java内存模型的主要目标是定义程序中各个变量(包括实例字段,静态字段和构成数组的对象元素,不包括局部变量与方法参数)的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样...
2019-05-21 20:53:43
88
原创 晚期(运行期)优化
概述Java程序最初通过解释器进行解释执行,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码",为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT编译器)为何HotSpot 虚拟机要使用解释器和编译器并存的架构为何HotSpot 虚拟机要实现两个不同的即时编译器程...
2019-05-20 15:14:46
87
原创 早期(编译器)优化
编译过程大致分为3个步骤,分别是:解析与填充符号表过程插入式注解处理器的注解处理过程分析与字节码生成过程解析与填充符号表解析主要包括词法分析和语法分析两个步骤词法分析将源代码的字符流转变为标记集合,单个字符是程序编写过程的最小元素,而标记则是编译过程中最小元素,关键字,变量名,字面量,运算符都可以成为一个标记(Token)语法分析是根据Token序列构造抽象语法树的过程,抽象语法树...
2019-05-20 12:11:32
274
原创 leetcode 22. 括号生成
描述给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。示例给出n = 3,生成结果为:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]思路方法一:回溯法总共有2*n个位置,每个位置有开或者闭括号两种选择判断每个位置是否能放开,闭括号如果开括号超过n,则后续位置不能再放开括号如果...
2019-04-03 13:00:38
79
原创 leetcode 5. 最长回文子串
描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。思路方法一:动态规划定义dp[i][j]来表示字符串s[i]…s[j]的字串是否属于回文子串;dp[i][j] = (Si == Sj && dp[i+1][j-1])Note...
2019-04-02 23:10:03
74
原创 leetcode 8. 字符串转换整数 (atoi)
描述请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可...
2019-04-02 16:48:52
92
原创 leetcode 3. 无重复字符的最长子串
描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例输入: “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。解决方案方法一 :滑动窗口依次遍历字符串,动态的维护一个滑动窗口取窗口的left与当前字符在Map集合中value的最大数将...
2019-04-02 09:12:58
56
原创 leetcode 2. 两数相加
描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -&g...
2019-04-01 23:35:59
66
原创 leetcode 1:两数之和
描述给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。示例给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]解决方案方法...
2019-04-01 22:52:18
59
原创 二叉树的迭代遍历
前序遍历遍历顺序: 先根节点,然后左孩子,最后右孩子 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList(); if(root == null) return l...
2019-03-12 14:37:18
88
原创 链表删除
题目描述请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。现有一个链表 – head = [4,5,1,9],它可以表示为:示例输入: head = [4,5,1,9], node = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -&amp;amp;gt; 5 -&amp;amp;gt; 9.思路介绍因为...
2019-03-02 12:56:46
309
原创 链表
链表常见的数据结构,在删除和添加操作上具有良好的性能,但只能通过指针依次进行查找Java中实现public class ListNode { int val; ListNode next; ListNode(int x) { thsis.val = x; }}算法中常见的技巧快慢指针,维护两个不同移速的指针为空判断,注意在调用...
2019-03-01 13:15:17
103
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人