JVM之类加载过程
[TOC]
JVM之类加载过程一个类型从被加载到虚拟机内存中开始,到卸载到内存中为止,他的整个生命周期将会经历加载(Loading)、验证(Verification)、准备(Preoaration)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)七个阶段,其中验证、准备和解析三个部分统称为连接(Linking)。
加载(Loading)这里得加载是指类加载过程中的第一步,而不是指类加载的整个过程,在这个阶段,虚拟机需要完成三件事。(在虚拟机中,类与加载它的类加载器一起构成其唯一性!)
通过一个类的全限定名来获取定义此类的二进制字节流。
需要注意的是这里的二进制字节流并不是只能从Class文件中获取,这就衍生很多的可能,其中比较常见的有:
从ZIP压缩包中获取,这成为了日后JAR、EAR、WAR格式的基础
从网络中获取,这种场景最典型的就是Web Applet
运行时计算生成,这种场景使用的最多的是动态代理技术
由其他文件生成,典型的场景就是JSP应用,由JSP文件生成对应的Class文件
从数据库中读取,这种场景 ...
JVM之Java垃圾收集算法
[TOC]
JVM之Java垃圾收集算法标记清除算法分为两部分:“标记”和“清除”。首先标记出所有需要回收的对象,在标记完成之后,统一回收掉所有被标记的对象;也可以反过来,标记存活的对象,统一回收未标记的对象。标记过程就是对象是否属于垃圾的判定过程。
标记清除算法有两个主要的缺点:
执行效率不稳定,如果Java堆中包含大量对象,而且大部分都是需要回收的,这是就必须进行大量的标记清除动作,导致标记和清除这两个过程的执行效率都随着对象数量的增长而降低。
内存空间碎片化的问题,标记清除之后会有大量不连续的内存碎片,空间碎片太多可能会导致之后程序在运行时需要分配较大对象时无法找到足够的连续内存而不得不提前触发另一次垃圾收集动作。
算法执行过程如图:
标记复制算法又称复制算法。该算法将内存分为两块相等大小的区域,每次使用一块,一块内存使用完之后,就将存活的对象复制到另一块内存区域上,然后将这一整块已经使用过的内存给整体清理掉。复制算法虽然解决了标记清除算法产生碎片化空间的问题,但是他也有两个缺点:
因为复制算法是复制的存活对象,如果存活的对象占大多数,就会有一大笔复制对象的开支
复制算法 ...
JVM之Java对象的存活判定与对象引用
[TOC]
JVM之Java对象的存活判定与对象引用对象的存活判定在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就 是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对 象)了。
判定对象存活的方法有引用计数算法和可达性分析算法。
引用计数算法定义:在对象中添加一个引用计数器,每当有一个地方 引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可 能再被使用的。
它的原理简单,判定效率也比较高,但一般不会使用这个算法来作为判定对象是否存活的依据,因为它有很多额外的情况需要考虑,需要配合大量额外处理才能保证正确地工作,如单纯的引用计数算法不能解决对象之间互相引用的之间循环引用的问题。
可达性分析算法这个算法的基本思路就是通过 一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过 程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连, 或者用图论的话来说就是从GC Roo ...
JUC之Java内置锁的核心原理
[TOC]
JUC之Java内置锁的核心原理 Java内置锁是一个互斥锁,这就意味着最多只有一个线程能够获 得该锁,当线程B尝试去获得线程A持有的内置锁时,线程B必须等待或 者阻塞,直到线程A释放这个锁,如果线程A不释放这个锁,那么线程B 将永远等待下去。
Java中每个对象都可以用作锁,这些锁称为内置锁。线程进入同 步代码块或方法时会自动获得该锁,在退出同步代码块或方法时会释 放该锁。获得内置锁的唯一途径就是进入这个锁保护的同步代码块或 方法。
Java对象结构Java对象(Object实例)结构包括三部分:对象头、对象体和对齐字节。
结构如下:
对象头 对象头包括三个字段,第一个字段叫作Mark Word(标记字),用于存储自身运行时的数据,例如GC标志位、哈希码、锁状态信息等。
第二个字段叫作Class Pointer(类对象指针),用于存放方法区Class对象的地址,虚拟机通过这个指针来确定这个对象是哪个类的实例。
第三个字段叫作Array Length(数组长度)。如果对象是一个Java数组,那这个字段必须要有,用于记录数组长度的数据;如果对象不是 ...
Linux常用命令
Linux常用命令
ls 列出当前文件夹中的所有文件
cd 进入到home目录
cd + .. 向上移动一个级别
cd + 目录 进入到指定目录
cp + file.txt + new_file.txt 复制file文件
rm + file.txt 删除file文件
rm -rf 删除文件夹及里面的内容
pwd 查看当前所在文件路径
mv + file.txt + asd/ 将file文件移动到asd文件夹下
mv test Test 将文件夹test名称修为Test
mv test Test/ 将文件夹移动到Test文件夹下
mkdir images/ 创建images文件夹
ps -ef | grep java 查看java进程
nohup java -jar irrigation-1.0-SNAPSHOT.jar >consoleMsg.log 2>&1 & 在后台启动jar包,并将日志输出到consoleMsg.file文件中
kill -9 4314 杀死4314进 ...
Java使用DFA算法实现敏感词过滤
Java使用DFA算法实现敏感词过滤DFA,全称 Deterministic Finite Automaton 即确定有穷自动机。
其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号;DFA算法的核心是建立了以敏感词为基础的许多敏感词树。
对于一个敏感词来说,他把一个词拆分成一个个单独的字,对每一个字加上了一个状态,来区分是否是一个敏感词的末尾。来看一个例子:
123456789101112131415161718192021222324252627282930/*{日= * {本= * {人={isEnd=1}, * 鬼= * {子={isEnd=1}, * isEnd=0}, * isEnd=0}, * isEnd=0}, * * 大= * { ...
Data-time类
Data-time类###常用类概述###
Instant类
Instant类对时间轴上的单一瞬时点建模,可以用于记录应用程序中的事件时间戳,在之后学习的类型转换中,均可以使用Instant类作为中间类完成转换
Duration类
Duration类表示秒或纳秒时间间隔,适合处理较短的时间,需要更高的精确性
Period类
表示一段时间的年、月、日
LocalDate类
是个不可变的时间日期对象,表是日期,通常被视为年月日
LocalTime类
是个不可变的时间日期对象,代表一个时间,通常被看作是小时、秒,时间表示为纳秒精度
LocalDateTime类
是一个不可变的日期时间对象,代表日期时间,通常被认为年月日时分秒
ZoneDateTime类
是具有失去的日期时间的不可变表示,此类存储所有时间和日期字段,精度为纳秒,时区为区域偏移量,用于处理模糊的本地日期时间
###now方法在日期/时间类的使用###
Date-Time API中的所有类均生成不可变实例,它们是线程安全的,并且这些类不提供公共构造函数,也就是说没办法通过new的方式直 ...
io流
[TOC]
io流概念
文件:保存数据的地方
文件流:文件在程序中是以流的形式来操作的
类FileInputStream—字节输入流public static void tes1() throws IOException {//字节输入流
//创建字节输入流对象
FileInputStream file=new FileInputStream("D:\\QQ\\3054897093\\FileRecv\\数据结构\\图书.txt");
int result;//接受读取的数据
/*
* read()方法每次读取一个字节,没有数据返回-1
* read(char[] c)每次读取字节数组大小的数据,不够则读取剩余的数据
*/
while((result=file.read())!=-1){
System.out.print((char)result);//将读取到的数据转换为字符输出
}
byte[] c=new byte[100];
...