-
Java GC算法
对象判定算法1、引用计数法给对象添加一个引用计数器,每当一个地方引用它时,计数器的值就加1,当引用失效时,计数器的值就减1,计数器为0的对象就是不可能再被使用,但是很难解决对象之间相互循环引用的问题2、可达性分析法通过一系列的称为’GC Roots’的对象作为起点,从这些节点开始向下搜索,搜索所走的路径称为引用链,当一个对象到GC Roots没有任何引用链相连,从GC Roots到这个对象不可达,则证明此对象不可用可作为GC Roots的对象包括 虚拟机栈中(栈帧中的本地变量表)...…
-
Java 垃圾收集器
GC算法垃圾收集器垃圾收集算法的具体实现,包含所有的收集器如下图7种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用,虚拟机所处的区域,则表示它是属于新生代收集器还是老年代收集器1、Serial收集器是一个单线程新生代收集器,在进行垃圾收集时,会暂停其他所有的工作线程,直到它收集结束,工作过程如下与其他收集器的单线程相比,优点是简单高效,对于限定单个CPU的环境,没有线程交互的开销,常用于运行在Client模式下的虚拟机2、ParNew收集器是Serial收集器的...…
-
JVM常用工具
jps 虚拟机进程状况工具命令格式jps [ options ] [ hostid ]jps -ljps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名其他选项jstat 虚拟机统计信息监视工具可以显示本地或者远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据命令格式jstat [ option vmid [interval[s|ms] [count]] ]如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进...…
-
Java中的CAS
在JDK 1.5之前Java语言是靠synchronized关键字保证同步,这会导致有锁锁机制存在以下问题: 在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。 一个线程持有锁会导致其它所有需要此锁的线程挂起。 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。 synchronized就是一种独占锁,独占锁是一种悲观锁,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一个更加有...…
-
Java内存区域
运行时数据区JVM所管理的内存包括以下运行时数据区域程序计数器线程私有,是一块较小的内存空间,相当与当前线程执行的字节码的的行号指示器,计数器的值就是字节码解释器执行的下一条指令,程序的循环、跳转、异常处理、线程恢复都要依赖这个计数器JVM的多线程是通过线程间的轮流切换来获取CPU的执行时间来实现的,一个CPU在一个时刻只能执行一个线程,所以当线程切换回来的时候要依靠计数器来找到之前线程执行的位置,每个线程都需要由一个单独的程序计数器,在内存中属于线程私有的当线程执行的是Java方法时,计...…
-
重建二叉树
源码链接题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。输入前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]输出 3 / \ 9 20 / \ 15 7分治, 递归二叉树的问题一般都是分治思想,递归去做。因为二叉树本身就是递归定义的。 前序遍历的第 1 个结点一定是二叉树的根结点 在中序遍历中,根结点把中序遍历序列分成了两...…
-
二维数组中的查找
源码链接题目描述在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]输出给定 target = 5,返回 true给定 targ...…
-
替换空格
源码链接题目描述请实现一个函数,把字符串 s 中的每个空格替换成”%20”。输入s = "We are happy."输出"We%20are%20happy."方法一: 借助辅助数组public String replaceBlank1(String s) { if (s == null) { return null; } StringBuilder stringBuilder = new StringBuilder(); char c = ' '; ...…
-
数组中重复的数字
源码链接题目描述在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。输入[2, 3, 1, 0, 2, 5, 3]输出2 或 3方法一: 先排序再遍历先排序,然后看相邻元素是否有相同的,有直接return。 不过很慢,时间O(nlogn)了,空间O(1),会修改原数组public int findRepeatNumber(int[] nums) { q...…
-
类的加载过程
类的加载过程加载 –> 验证 –> 准备 –> 解析 –> 初始化加载首先通过一个类的全限定名来获取此类的二进制字节流;其次将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;最后在java堆中生成一个代表这个类的Class对象,作为方法区这些数据的访问入口。总的来说就是查找并加载类的二进制数据 获取二进制字节流并没有规定必须从class文件中获取,怎么获取,所以有了从ZIP包中读取,例如war,jar,ear格式,从网络中获取,例如Applet,运行时...…