- 博客(82)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 jvm深度学习(3):java方法的运行与虚拟机栈
方法的执行虚拟机栈是线程运行 java 方法所需的数据,指令、返回地址。其实在我们实际的代码中,一个线程是可以运行多个方法的。 比如:这段代码很简单,就是起一个 main 方法,在 main 方法运行中调用 A 方法,A 方法中调用 B 方法,B 方法中运行 C 方法。我们把代码跑起来,线程 1 来运行这段代码, 线程 1 跑起来,就会有一个对应 的虚拟机栈,同时在执行每个方法的时候都会打包成一个栈帧。 比如 main 开始运行,打包一个栈帧送入到虚拟机栈。执行main方法执行A(
2020-07-18 17:35:09
265
原创 网络协议和Netty(9):Http的报文结构及一个完整Http请求的过程
前言:作为一个程序员,刚刚接触前端知识的时候,就特别好奇,http是怎么通过一个url将报文从客户端传送到服务端?今天我终于知道了,不知道有没有和我一样好奇的读者。提问:http的一个请求经历了一个什么样的过程?Http协议HTTP(Hyper Text Transfer Protocol) 中文是超文本传输协议,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。HTTP 协议HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答
2021-08-21 09:19:34
802
2
原创 网络协议和Netty(8):常用网络抓包工具TCPDUMP的使用
前言:Wireshark虽然好用,但是一般生成环境是Linux环境,而TCPDUMP作为Linux网络服务器,便成为了我们抓包的首选。通常我们在生产环境会用TCPDUMP抓包,导出数据后,用Wireshark导入分析。简介:tcpdump 可以抓所有层的数据,功能十分强大,tcpdump Linux 作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump 是 Linux 中强大的网络数据采集分析工具之一。用简单的话来定义 tcpdump,就是:dump the traf
2021-08-04 22:16:22
682
原创 网络协议和Netty(7):常用的网络抓包工具 Wireshark
前言:前面三次握手和四次挥手用的抓包工具就是Wireshark,本节主要介绍其简单的使用,不用死记硬背,知道大概的使用方法就行,至于命令搞个专门记录命令的文档记录,用的时候直接用就好了。提问:为什么要抓包?解答:1、定位网络问题;2、分析接口数据;3、学习网络协议,使用抓包工具分析网络数据更直观。大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准确、更方便,如以下场景:1、你发送数据给后台,但后台没有收到,可以对接口进行抓包分析,看是后台处理有问题,还是没有
2021-08-01 18:05:53
3911
原创 网络协议和Netty(6):大白话说四次挥手和用一个数据库关闭连接的例子进行说明
前言:和三次挥手不一样,第一次接触四次挥手的概念的时候,已经有些懵懂,没有再闹出笑话。毕竟经历了“高规格的礼仪”洗礼,有了些警惕性,哈哈。好了不废话了,言归正传。前面说完建立连接时所需要的三次握手的前因后果,这次来说一说,关闭连接时的四次挥手。提问:什么是四次挥手?为什么关闭连接时需要四次挥手?四次挥手介绍:概述:四次挥手就是TCP关闭时,客户端和服务端共发送四次数据包来确认连接的断开。这个发起端即可以是服务端也可以是客户端,调用close方法,发送关闭请求。图示:
2021-07-31 16:11:08
361
原创 网络协议和Netty(5):三次握手漏洞-SYN洪泛攻击
前言:三次握手的机制决定这个漏洞的必然存在。提问:什么是洪泛攻击?洪泛攻击我们先回忆以下,正常情况下的三次握手:正常的三次握手,在每次握手的时候,数据包中都会包含己方IP和对端IP,这样对端应答时根据数据包对端的IP,进行准确的应答。例如上图第一次握手时,客户端请求时,会在数据包中包含客户端IP,服务端第二次握手,根据客户端的IP,准确进行第二次握手。那么问题来了,假如客户端在第一次握手时,所传输的IP是个虚拟IP会怎么样?如图:上图就是 SYN 洪泛攻..
2021-07-25 09:54:04
668
4
原创 网络协议和Netty(4):大白话说三次握手及用一个数据库连接解释三次握手
前言:想起了第一次听说“三次握手”概念的时候。那时候刚到北京,朋友傲娇的跟我讲,我花了两天我终于搞懂了三次握手。当时对网络一无所知的我,还以为是啥新的礼仪方式,心中感叹,帝都人民的热情,握手还要三次。说到半途才搞清楚,原来是TCP创建连接的礼仪。后面空闲的时候,经常从网上找些找些资料,接触“三次握手”。用网友经典的打电话例子,浅浅的理解。时间推移,由浅入深。大概所有人都跟我一开始有同样以下的这个问题:提问:为啥TCP建立连接需要进行三次握手?三次握手...
2021-07-24 18:54:21
2367
11
原创 网络协议和Netty(3):TCP/IP协议层级结构间消息的传输
TCP/IP 协议族Transmission Control Protocol/Internet Protocol 的简写,中译名为传输控制协议/因特网互联协议,是 Internet 最基本的协议、Internet 国际互联网络的基础,由网络层的 IP 协议和传输层的 TCP 协议组成。协议采用了 4 层的层级结构。然而在很多情况下,它是利用 IP 进行通信时所必须用到的协议群的统称。也就是说,它其实是个协议家族,由很多个协议组成,并且是在不同的层, 是互联网的基础通信架构。TCP/IP
2021-07-22 21:14:37
325
9
原创 网络协议和Netty(2):地址和端口
前言:本篇只是介绍常见 IP地址和MAC地址以及端口的定义,在网络通讯中的作用。此知识点,只做了解即可。地址常见的地址无非就是MAC地址和IP地址。MAC地址MAC 地址全称叫做媒体访问控制地址,也称为局域网地址(LAN Address),MAC 位址,以太网地址(Ethernet Address)或物理地址(Physical Address)。MAC地址是由设备制造商制造时设置在设备内部的(常见的网卡),故MAC地址与网络无关,也与接入何种网络无关。MAC 地址共 48 位(6.
2021-07-18 19:44:14
1644
1
原创 网络协议和Netty(1)OSI模型和TCP/IP模型
前言:本章节主要讲述:1)计算机的网络体系结构,包括有OSI七层模型的简单描述和TCP/IP模型及其特点和差别;2)简单介绍下平时常见的IP和端口号的定义及在网络通讯中所扮演的角色和作用;3)TCP和UDP区别OSI七层模型七层模型,亦称OSI(Open System Interconnection),是一个七层的、抽象的模型体,不仅包括一系列抽象的术语或概念,也包括具体的协议。他是由国际标准化组织(ISO)和国际电报电话咨询委会(CCITT)联合制定的开放系统互连参考模型,为开放式互连信息系统
2021-07-17 20:02:31
299
原创 jvm深度学习(18):类加载器和双亲委派机制
类加载器前面说过类加载,而执行这个任务的就是类加载器,类加载主要做五件事:加载、验证、准备、解析、初始化。JDK为我们提供了三层类加载器分别是:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extention ClassLoader)、应用程序类加载器(Application ClassLoader)。除了这三种还有自定义类加载器(Custom ClassLoader),支持一些个性化的扩展功能。启动类加载器Bootstrap ClassLoader,他处..
2020-08-09 09:32:53
217
原创 jvm深度学习(17):类加载过程及触发类初始化的场景验证
前言:你可以不知道JVM的内存结构,但你一定要记住类加载,因为面试他真的会问,而且他确实对我们编码能力提升确实有帮助。鄙人尽量用简单的话,让各位看官憋尿。一个类的醉生梦死 千言万语不如一张图生动...
2020-08-02 00:25:39
394
原创 jvm深度学习(16):JVM之自动装箱拆箱
JVM之自动装箱拆箱提问:jvm中如何进行进行装箱拆箱操作?装箱拆箱先写个示例代码:package com.imooc.firstappdemo.jvm;public class TofuCaiInteger { public static void main(String[] args) { int icount = 8; Integer integerCount = 19; icount = icount * in..
2020-07-30 19:45:52
504
原创 jvm深度学习(15):JVM之异常处理机制try、catch、finally
提问:异常在JVM是怎么处理的? 如果写了try{}catch(){}finally{},又是怎么执行的?代码的真理永远存在于字节码show code1:package com.imooc.firstappdemo.jvm;public class TofuCaiExection { public static void main(String[] args) { int i = 0; }}反汇编:主要看 红框内main...
2020-07-30 17:58:27
427
原创 jvm深度学习(14):GC 常用参数
GC 常用参数-Xmn -Xms -Xmx –Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用 TLAB,默认打开-XX:+PrintTLAB 打印 TLAB 的使用情况-XX:TLABSize 设置 TLAB 大小-XX:+DisableExplicitGC 启用用于禁用对的调用处理的选项 System.gc()-XX:+PrintGC 查看 GC 基本信息-XX:+PrintGCDetails 查看 GC 详细信息-XX:+PrintHeapAtGC 每次一次 GC
2020-07-29 17:14:02
431
原创 jvm深度学习(13):简述低延迟的垃圾回收器,怎样读GC日志
低延迟的垃圾回收器 传统的垃圾回收器一般情况下 内存占用、吞吐量、延时 只能同时满足两个。但是现在的发展,延迟这项的目标越来越重要。所以就有低延迟的垃圾回 收器。Eplison JAVA11新的垃圾回收器,是一个“不干活”的垃圾回收器,负责堆的管理与布局、对象的分配、与解释器的协作、与编译器的协作、与监控子系统协作等职责,主要用于需要剥离垃圾收集器影响的性能测试和压力测试。ZGC 有类似于 G1 的 Region,但是没有分代。标志...
2020-07-29 17:10:17
210
原创 jvm深度学习(12):G1中的技术细节、安全点与安全区域
G1 中的技术细节前言:前面在JVM中常见的垃圾回收器章节对G1有过详细的描述。我们知道G1为了解决STW问题,使用了“化整为零”的思想。将堆内存分割小块的region,每个region根据需要,可以是Eden区或者Survivor或者老年代区。G1根据区域的不同,用不同的策略进行垃圾回收。问题 虽然这种“化整为零”很好的解决了STW问题,但是随着内存区域的颗粒化,再加上G1内存区域的不固定(回收前Eden,但由于都处于强引用,回收不了,直接变为Survivor,更有甚者...
2020-07-28 00:04:27
522
原创 jvm深度学习(11):GC并发标记之三色标记及漏标问题
三色标记概念叙述 在三色标记法之前有一个算法叫Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是 0,如果 发现对象是可达的就会置为 1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后,会将未被标记的对象统一清理,再次把所有的标记位设置成 0方便下次清理。 这个算法最大的问题是 GC 执行期间需要把整个程序完全暂停,不能异步进行 GC 操作。因为在不同阶段标记清扫法的标志位 0 和 1 有不同的含义...
2020-07-27 22:56:26
4364
5
原创 jvm深度学习(10):JVM 中常见的垃圾回收器
前言: 在新生代中,每次垃圾回收时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成回收。 而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。以下是各垃圾回收器之间的关系:注意:图中CMS与Serial无关系,已打马赛克。Oracle 官方也有对应英文解释 https://docs.oracle.com/en/java/javase/13/gctuning/ergonomics.h
2020-07-25 23:25:47
627
原创 jvm深度学习(9):垃圾回收机制及算法
垃圾回收基础知识什么是 GC?Java 与 C++等语言最大的技术区别:自动化的垃圾回收机制(GC)为什么要了解 GC 和内存分配策略1、面试需要。。。2、GC 对应用的性能是有影响的;3、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点。分代回收理论当前商业虚拟机的垃圾回收器,大多遵循“分代收集”的理论来进行设计,这个理论大体上是这么描述的:1、
2020-07-25 22:21:25
199
原创 jvm深度学习(8):JVM对象的分配策略
栈上分配 即方法中的对象没有发生逃逸。 逃逸分析的原理:分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用。 比如:调用参数传递到其他方法中,这种称之为方法逃逸。甚至还有可能被外部线程访问到,例如:赋值给其他线程中访问的变量,这个称之为线程逃逸。 从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程度。 如果确定一个对象不会逃逸出线程之外,那么让对象在栈上分配内存可以提高 JVM 的效率。代码示例:p...
2020-07-25 14:21:28
278
原创 jvm深度学习(7):JVM 中对象的创建过程、内存布局、访问定位、判断对象存活算法、四种引用、Finalize 方法
前言:本文分别从JVM 中对象的创建过程、对象的内存布局、对象的访问定位、判断对象的存活、四大引用5个方面来讲述。JVM 中对象的创建过程提问:对象在jvm中到底是怎么创建出来的?图解:1)检查加载 当JVM遇到一条字节码new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用(符号引用 :符号引用以一组符号来描述所引用的目标),并且检查类是否已经被加载、解析和初始化过。如果该类没有没有加载过,将会抛出异常。2)分配内存 如果...
2020-07-25 13:33:51
257
原创 jvm深度学习(6):实例代码运行JVM内存处理全流程、堆的垃圾回收、栈优化技术
实例代码运行JVM内存处理全流程提问:当一个实例在运行时我们的JVM究竟发生了什么?先写个代码,然后运行public class JVMObject { public final static String MAN_TYPE = "man"; // 常量 public static String WOMAN_TYPE = "woman"; // 静态变量 public static void main(String[] args)throws Exceptio...
2020-07-24 20:32:44
256
原创 jvm深度学习(5):常量池与String
本文分静态常量池、运行时常量池和字符串常量池三个方面去分析。 先提一句,对于字符串常量池官方从未给过任何关于其的定义,不知从哪来,也不知哪去,有各种对其的争议,有人说它属于运行时常量池,也有人说他是和运行时常量池并行的一个常量池。本文对其单独拿出来讲解,并不对争议进行站队,没有必要,更没有意义。静态常量池(又称Class常量池) 在 class 文件中除了有类的版本、字段、方法和接口等描述信息外,还有一项信息是常量池 (Constant P...
2020-07-22 18:05:56
264
原创 jvm深度学习(4):java方法的运行与程序计数器
程序计数器:较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响。程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。因为 JVM 是虚
2020-07-19 16:09:08
352
原创 jvm深度学习(2): jvm的内存区域
前言: JVM 能涉及非常庞大的一块知识体系,比如内存结构、垃圾回收、类加载、性能调优、JVM 自身优化技术、执行引擎、类文件结构、监控工具等。 但是在所有的知识体系中,都或多或少跟内存结构有一定的关系。比如垃圾回收回收的就是内存、类加载加载到的地方也是内存、性能优化也涉及到内存优化、执行引擎与内存密不可分、类文件结构与内存的设计有关系,监控工具也会监控内存。所以内存结构处于 JVM 中核心位置。也是属于我们入门 JVM 学习的最好的选择。 同时 JVM 是一个...
2020-07-18 12:04:34
276
原创 jvm深度学习(1):基础知识
jvm基础知识1 JVM 从编译到执行1.1 java程序的执行过程 一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相 关的函数。JVM 作为 .class 文件的翻译存在,输入字节码,调用操作系统函数。过程如下:Java 文件->编译器>字节码->JVM->机器码。 JVM 全称 Java Virtual Machine,也就是我们耳...
2020-07-18 10:45:57
257
转载 TCP与UDP特点及区别
前言网络层只把分组发送到目的主机,但是真正通信的并不是主机而是主机中的进程。传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。1、UDP 和 TCP 的特点与区别用户数据报协议 UDP(User Datagram Protocol)是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用...
2020-04-03 17:55:41
1464
转载 redis必会知识点(3)
主从复制redis单节点存在单点故障问题,为了解决单点问题,一般都需要对redis配置从节点,然后使用哨兵来监听主节点的存活状态,如果主节点挂掉,从节点能继续提供缓存功能。redis主从复制的过程和原理主从配置结合哨兵模式能解决单点故障问题,提高redis可用性。从节点仅提供读操作,主节点提供写操作。对于读多写少的状况,可给主节点配置多个从节点,从而提高响应效率。关于复制过程...
2020-03-29 17:44:25
259
转载 redis必会知识点(2)
Redis为何这么快官方提供的数据可以达到100000+的QPS(每秒内的查询次数),这个数据不比Memcached差。redis为什么是单线程还那么快?Redis确实是单进程单线程的模型,因为Redis完全是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章的采用单线程的方案了(毕...
2020-03-29 17:07:14
211
转载 redis必会知识点(1)
什么是redisRedis是C语言开发的一个开源的(遵从BSD协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。它是一种NoSQL(not-only sql,泛指非关系型数据库)的数据库。Redis作为一个内存数据库。1、性能优秀,数据在内存中,读写速度非常快,支持并发10W QPS;2、单进程单线程,是线程安全的,采用IO多路复用机制;...
2020-03-29 16:47:55
218
原创 mysql报错:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;
最近配合测试人员测试批量数据处理时,突然出现这个报错:Value '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp;第一反应是数据问题,因为鉴于业务的复杂,测试环境很难有大批量的数据满足测试,所以大部分数据由本人写脚本刷出来的。简单思考可能是数据类型和持久层的映射问题,查看了表字段类型和pojo并无异常。本...
2020-03-28 18:57:18
270
转载 SpringCloud系列之服务消费Ribbon和Feign区别
在业界,一般有两种微服务的实践方法:基于dubbo的微服务架构、基于Spring Cloud的微服务架构。从概念上来讲,Dubbo和Spring Cloud并不能放在一起对比,因为Dubbo仅仅是一个RPC框架,实现Java程序的远程调用,实施服务化的中间件则需要自己开发;而Spring Cloud则是实施微服务的一系列套件,包括:服务注册与发现、断路器、服务状态监控、配置管理、智能路由、一次性令...
2019-12-27 17:49:06
186
原创 String深度学习——split(1)
一、源码解读做银行项目时经常有对收益、份额、清算等数据文件导入数据库操作,需要用I/O流进行数据处理。在数据处理中有步重要的操作,那就是对文件的数据进行解析。一般的数据文件采用的分割原则,统一使用“|”、“,”或者其他的约束好的分隔符进行分割。一般通常采用String的方法split进行解析以下是源码,通过源码发现,String中已多态的形式提供了4个方法,而split(Strin...
2019-07-12 16:43:51
865
原创 简谈:java种关于BigDecimal的坑
最近踩了一个坑,关于使用BigDecimal时所产生的问题。我们知道在我们进行一些货币计算的时候,一般采用BigDecimal的方法来进行运算。而不是通过double和long浮点型进行运算。就是因为Java种double或者long采用的是二进制浮点运算。而二进制不能充分准确的表示出浮点数的。举个例子,当我们用十进制时无法准确的表示1/3一样。只能通过0.3333...无限循环的方式来表示,...
2019-07-08 21:00:14
1708
转载 MySQL中EXISTS的用法
比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(SELECT OrderID FROM Orders o WHERE o.CustomerID=c.CustomerID) 这里面的EXISTS是如何运作呢?子查询返回的是OrderId字段,可是外面的查询要找的...
2019-07-04 14:25:18
984
转载 SVN提交出错--URL access forbidden for unknown reason
使用SVN在eclipse中提交文件,但是出现错误,如下:URL access forbidden for unknown reasonsvn: Commit failed (details follow):svn: Access to ** forbidden但是更新项目可以,网上查了原因是之前只用用户登录之后保存了密码,换用新的用户之后就出现这样的问题。解决方法如下:1....
2019-04-23 11:17:24
2915
转载 MySql常用的内置函数
mysql内置函数列表可以从mysql官方文档查询,这里仅分类简单介绍一些可能会用到的函数。1 数学函数abs(x)pi()mod(x,y)sqrt(x)ceil(x)或者ceiling(x)rand(),rand(N):返回0-1间的浮点数,使用不同的seed N可以获得不同的随机数round(x, D):四舍五入保留D位小数,D默认为0, 可以为负数, 如round(19,...
2019-03-28 19:51:46
148
原创 java并发机制的学习—线程优先级
什么为线程的优先级现代操作系统基本采用时分的形式调度运行线程,操作系统会分出一个个时间片,线程会分配到若干时间片,当线程的时间片用完了就会发生线程调度,并等待下次分配。线程分配的时间片多少也就决定了线程使用处理器资源的多少,而线程的优先级就是决定线程需要多或者少分配一些处理器资源的线程属性。Java的优先级存在优先级范围 :1 ~ 10,默认优先级为5,可以通过setPriority(...
2019-03-06 13:23:34
686
转载 Java对象的序列化和反序列化
一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2) 在网络上传送对象的字节序列。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的...
2019-03-05 17:05:43
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人