07 2020 档案
摘要:常见的垃圾收集器分为串行、吞吐量优先和响应时间优先三种。 串行:Serial 设置参数为 -XX:+UseSerialGC = Serial + SerialOld,Serial分为两种,Serial工作在新生代,使用复制算法;SerialOld工作在老年代,采用标记整理算法。 假设有4核CPU运行
阅读全文
摘要:这篇随笔梳理一下Java并发编程的一些基础概念。包括同步异步、进程线程、并发并行。 同步和异步是指方法的调用,我们用一张图来形容: 同步方法一旦调用后,调用者必需等方法执行完毕后才能进行后续的行为; 异步方法一旦被调用则会立即返回,调用者可以继续后面的行为,异步方法一般会在另外一个线程中执行;如果异
阅读全文
摘要:为了保证顺序性,每一个包都有一个 ID。在建立连接的时候,会商定起始的 ID 是什么,然后按照 ID 一个个发送。假设A发给B的数据流由一个500 000字节的文件组成,MSS为1000字节。数据流的首字节ID为0,那么TCP会将这个文件分为500个报文段,每一个报文段的首部序号字段中分别为0、10
阅读全文
摘要:TCP协议同样是运输层的协议,掌握TCP重点要关注这几个问题:顺序问题、丢包问题、连接维护、流量控制、拥塞控制。先解析下TCP报文段结构,相比于UDP要复杂很多。 首先还是两个端口号,对应着具体的应用进程。 序号指的是包的序号,为了解决包乱序问题。 发出去的包应该有确认,如果接收方没有收到就应该重新
阅读全文
摘要:运输层位于网络层之上,网络层提供了主机之间的逻辑通信;而运输层为运行在不同主机上的应用进程之间提供了逻辑通信。从应用程序角度看,通过逻辑通信,运行不同进程的主机好像直接相连一样。应用进程使用运输层提供的逻辑通信功能来发送报文,无需考虑承载这些报文的物理基础设施的细节,就像我们知道的透明传输。 UDP
阅读全文
摘要:数据链路层主要关注三个问题: 这个包是发给谁的?谁应该接收? 大家都在发,会不会产生混乱?有没有谁先发、谁后发的规则? 如果发送的时候出现了错误,怎么办? 数据链路层也称为MAC(Medium Access Control)层,即媒体访问控制。控制在往媒体上发数据的时候,谁先发、谁后发的问题,防止顺
阅读全文
摘要:JDK1.8中StringTable的底层类似于HashTable,由数组和链表实现,数组又称为桶数组。比如有这样一段代码: public class Demo4 { public static void main(String[] args) { int i = 0; System.out.pri
阅读全文
摘要:学习JVM的时候经常会遇到各种常量池,不同版本的JDK它们的存储位置也不同,这篇随笔就整理下几种常见的常量池,以JDK1.8为主。先看一张存储示意图,里面涉及1.8和1.6。 常量池是存储在方法区中的,比如我们有这样一段代码: public class Demo { public static vo
阅读全文
摘要:IP地址是一个网卡在网络世界里的通讯地址,相当于我们家里的门牌号码。这样类比的话,很显然ip地址是唯一的。在windows系统中,我们可以使用 ipconfig 命令查看本机的ip地址相关信息: 图中 10.17.191.222就是本机ip地址,地址的大小为32bit,这个地址被分为四个部分,也就是
阅读全文
摘要:我们知道堆中存放的是对象,对象不被引用就会被垃圾收集回收掉。但是如果对象一直存在强引用,那么就会一直存活,当存活对象达到一定数量时,就会把堆内存占满,从而发生堆内存溢出错误。比如有这样一段代码:逻辑是每次都往集合中添加一个字符串对象,然后字符串进行一次拼接。 public class Demo1 {
阅读全文
摘要:当栈内存中栈帧过多或者栈帧过大,对于第一个原因,每调用一次方法就会在栈中分配一个栈帧。虽然栈帧用完内存就会自动回收,如果调用的方法之间执行的时间长,就有可能出现,最典型的场景就是方法递归调用。比如我们有个代码: 1 public class Demo { 2 // 记录方法调用次数 3 public
阅读全文
摘要:比如我们有运行这样一个程序: 了解多线程的小伙版都知道,这段代码不会有打印结果,因为发生了死锁。我们在服务器上运行试试,没有输出,对应的进程是 32752。 使用 “jstack 32752”排查,后面的信息显示 “发现死锁”,在线程1的第29行,等待对象A锁,这就和我们的代码对应起来了。
阅读全文
摘要:线上项目运行时,出现问题不像在本地那么容易排查,经常需要借助日志、或者一些工具来找出问题。cpu被占满我们经常会遇到。比如我们有这样一段代码: 1 public Class Demo1_16 { 2 3 public static void main(String[] args) { 4 5 new
阅读全文
摘要:只能生成一个实例的类是实现了Singleton(单例)模式的类型。实现单例模式的代码比较短,在面试中经常被提及,这篇随笔介绍几种常见的实现方式。 1.饿汉模式 这种实现方式优点是没有加锁,执行效率高、线程安全的;但是对象在类加载的时候就会被创建,容易产生垃圾对象,正常情况下使用这种方式来创建单例。具
阅读全文
摘要:这篇文章我们关注一个问题:Java程序是怎么进入JVM并执行的?经常写Java程序的小伙伴应该都听说过类加载机制,在《深入理解Java虚拟机》里周老师已经讲的很清楚了,这篇随笔把之前的笔记以及一些总结重新梳理一下。前面我们已经知道 .java文件经过编译后变成Class文件,JVM加载的是字节码文件
阅读全文
摘要:这篇文章我们主要关注这些问题::Java程序执行完后,堆中的对象什么时候被回收?如何回收? 堆又叫做 “GC堆" 由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代,比例是1:2;再细致一点新生代内部又划分为Eden区、Survivor区,比例为8:1。下图显示了堆的结
阅读全文
摘要:以前学JVM的时候看过《深入理解Java虚拟机》,当时看的很模糊也记了些笔记,更像是为了应付面试。事实是确实把笔记都背上了,春招找实习的时候,内存管理、类加载、垃圾回收三连背一遍。后来自己做项目的时候,涉及到JVM的部分还是不怎么理解,最近重读了上面的书并且看了一些技术大佬的专栏,用博客记录下自己学
阅读全文