- 博客(72)
- 收藏
- 关注
原创 java基础:知道fail-fast,你知道fail-safe吗?
在Collection集合中,有线程安全和线程不安全这2大类的版本。对于线程不安全的类,并发情况下可能会出现fail-fast情况;而线程安全的类,可能出现fail-safe的情况。fail-fast快速失败当遍历一个集合对象时,如果集合对象的结构被修改了,就会抛出ConcurrentModificationExcetion异常。以ArrayList的源码为例,讲解一下fail-fast的机制1、modCount protected transient int modCount = 0;
2021-02-03 21:48:38
207
1
原创 【常见算法系列】你真正了解java中的堆吗?
看到堆,我们想到堆排序,以及延伸k个最大值和K个最小值;而在java中优先队列(PriorityQueue)很好实现了堆
2021-01-19 14:32:51
152
1
原创 工作了才知道:应该懂得这些网络知识
Http和Https的区别HTTP(超文本传输协议)被用于在Web浏览器和网站服务器之间,以明文方式传递信息,不提供任何方式的数据加密,因此使用HTTP协议传输隐私信息(如:银行卡号、密码等支付信息)非常不安全。在HTTP的基础上加入了SSL(Secure Sockets Layer)协议,SSL依靠SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。从而诞生了HTTPS(安全套接...
2018-10-12 21:09:01
703
原创 java虚拟机系列:虚拟机字节码执行引擎
java虚拟机的执行引擎都是一致的:输入字节码文件,处理过程是字节码解析的等效过程,输出的是执行结果。过程##### 运行时栈帧结构栈帧(Stack Frame)是用于虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟栈(Virtual Machine Stack)的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态链接和方法返回地址等信息。每一个方法从调研开始至执行的过程,...
2018-09-24 22:04:24
215
原创 java虚拟机系列:java虚拟机类加载机制
类加载机制:虚拟机把描叙类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。类加载的时机类加载的生命周期包含:加载、验证、准备、解析、初始化、使用、卸载。其中,验证、准备、解析3个部分称为链接。虚拟机对于类的初始化阶段严格规定了有且仅有只有5种情况如果对类没有进行过初始化,则必须对类进行“初始化”!遇到new(实例化对象)...
2018-09-24 10:03:52
190
原创 java虚拟机系列:我们聊一聊类文件结构
Class文件是一组8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部都是程序运行的必要数据,没有空隙存在。当遇到需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储的,...
2018-09-21 22:37:05
1262
1
原创 java虚拟机系列:对内存溢出的思考
jvm内存溢出JVM管理的几个内存区域分为:方法区:用于存储JAVA类信息、常量、静态变量。这个区域也可以发生垃圾回收,比如当一些类不在被引用时JVM可以卸载这个类,不过这种回收动作很少发生。另外所有线程都共享方法区,因此线程对方法区的访问被设计为线程安全的。虚拟机栈:JAVA虚拟机栈是线程私有的,每当启动一个新线程时,JVM都会为它分配一个JAVA虚拟机栈。每当线程调用方法时,JVM都会...
2018-09-18 12:34:57
5034
原创 java基础:枚举类型的原理,你真的了解吗?
枚举实现原理package com.own.learn.jdk.enum1;public enum Day { MONDAY("monday"), TUESDAY("TUESDAY"), WEDNESDAY("WEDNESDAY"),
2018-09-14 19:26:47
172
原创 并发编程篇:还怕面试官问你-volatile原理吗?
CPU的术语定义 volatile是轻量级的synchronized,比之执行成本更低,因为它不会引起线程的上下文切换,它在多处理器开发中保证了共享变量的“可见性”,“可见性”的意思是当一个线程修改一个变量时,另外一个线程能读到这个修改的值。volatile的定义和原理Java语言规范第三版中对volatile的定义如下: java编程语言允许线程访问共享变量,为了确保共享变量能被准...
2018-09-14 12:34:41
11642
2
原创 并发编程篇:synchronized的使用以及原理
synchronized的三种应用方式synchronized关键字最主要有以下几种应用方式java对象头在JVM中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅...
2018-09-09 15:29:22
12881
5
原创 java基础:Aop的代理研究
Spring AOP两种实现机制是什么?如果是有接口声明的类进行AOP 时,spring调用的是java.lang.reflection.Proxy 类来做处理如果是没有接口声明的类时, spring通过cglib包和内部类来实现在AOP,权限控制,事务管理等方面都有动态代理的实现。JDK本身有实现动态代理技术,但是略有限制,即被代理的类必须实现某个接口,否则无法使用 JDK自带...
2018-09-09 11:20:20
500
原创 java基础:说说,Java泛型
特性泛型只在编译阶段有效public class GenericTest1 { public static void main(String[] args) { ArrayList<String> strings = new ArrayList<>(); ArrayList<Double> doubles ...
2018-08-31 21:26:24
192
原创 java虚拟机系列:垃圾收集器
垃圾收集器是垃圾回收算法(标记-清除算法、复制算法、标记-整理算法、火车算法)的具体实现,不同商家、不同版本的JVM所提供的垃圾收集器可能会有很在差别. 图中展示了7种不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;而它们所处区域,则表明其是属于新生代收集器还是老年代收集器:新生代收集...
2018-08-19 15:43:41
15861
3
原创 git fork后如何更新
git fork后如何保持与源项目的更新:首先保证本地仓库的upstream是源项目的URL,若没有则添加:git remote add upstream URL然后利用fetch和merge合并upstream的master分支:git fetch upstreamgit merge upstream/master此时本地的master分支就更新至upstream的...
2018-08-10 09:46:19
6428
原创 java虚拟机系列:垃圾回收算法
GC需要完成三件事:1,哪些内存需要回收?2:什么时候回收?3:如何回收? Java内存运行时区域的各部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着入栈和出栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的,因此这几个区域的内存分配和回收都具备确定性,在这几个区域内就不需要过多考虑回收的问题,因为方法结束...
2018-08-05 15:16:42
13454
4
原创 java虚拟机系列:java虚拟机内存模型
java内存模型,分为程序计数器,虚拟机栈,本地方法栈,java堆,java栈。根据受访的权限不同设置,可以分为线程共享和线程私有。线程共享指可以允许所有的线程共享访问的一类内存区域,包括堆内存区,方法区,运行的常量池。程序计数器(Program Counter Register)在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通...
2018-08-02 14:39:25
6292
原创 java虚拟机系列:如何使用jstack
语法 [@82995c215909 ~]$ jstack -h Usage: jstack [-l] (to connect to running process) jstack -F [-m] [-l] (to connect to a hung process) jstack [-m] [-...
2018-07-25 20:17:30
344
原创 java虚拟机系列:jhat虚拟机堆栈转存快照分析工具
用法jhat -h Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <f
2018-07-25 20:04:32
634
1
原创 java虚拟机系列:如何使用jmap
jmap作用,获取dump文件,查询finalize执行队列,java堆栈以及类加载器统计。显示堆栈信息[@82995c215909 /opt/logs]$ jmap -heap 12527 Attaching to process ID 12527, please wait… Debugger attached successfully. Server compiler detec...
2018-07-24 20:38:50
1067
原创 java虚拟机系列:如何使用jinfo命令
jinfo 用法➜ ~ jinfo --helpUsage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo...
2018-07-19 20:08:42
1035
原创 java虚拟机系列:jstat命令使用
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数] 查看远端的: [protocol:][//]lvmid[@hostname[:port]/servername] 类加载统计:[@c9db8f728f0d /opt/logs]$ jstat -class 237Loaded B...
2018-07-14 17:02:20
5111
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人