自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (4)
  • 收藏
  • 关注

原创 JVM垃圾收集器基准报告 – Ionuț Baloșin 如何选择适合你的垃圾回收器

本文使用一组不同的模式描述了一系列Java虚拟机(JVM)垃圾收集器(GC)微基准及其结果。对于当前问题,我包括了AdoptOpenJDK 64位服务器VM版本13(内部版本13 + 33)中的所有垃圾收集器:串行GCParallel / ParallelOld GC(启动Java 7u4 ParallelGC和ParallelOld GC基本上是同一收集器)并发标记扫描CMS GC(目前不建议使用,它将根据JEP 363在Java 14版本中删除)垃圾优先G1 GCShenandoah

2020-05-30 18:24:36 683 2

原创 深入理解java虚拟机—— 虚拟机 新型垃圾收集器 Shenandoah GC, ZGC

(1)、内存:在内存占用、吞吐量和延迟这三项指标里,延迟的重要性日益凸显,越发备受关注。其原因是随着计算机硬件的发展、性能的提升,我们越来越能容忍收集器多占用一点点内存;(2)、吞吐量:硬件性能增长,对软件系统的处理能力是有直接助益的,硬件的规格和性能越高,也有助于降低收集器运行时对应用程序的影响,换句话说,吞吐量会更高。(3)、延迟:对延迟则不是这样,硬件规格提升,准确地说是内存的扩大,对延迟反而会带来负面的效果,这点也是很符合直观思维的:虚拟机要回收完整的1TB的堆内存,毫无疑问要比回收1GB的

2020-05-30 17:04:49 1270 2

原创 深入理解java虚拟机—— 超详细虚拟机垃圾收集器原理,GC 垃圾收集器算法的深度解析,项目中如何选择合适的垃圾收集器

有7中收集器 -- Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1。从JVM区域结构看,可将这些区域划分为“静态内存”和“动态内存”两类。程序计数器、虚拟机栈、本地方法3个区域是“静态”的,因为这几个区域的内存分配和回收都具备确定性,都随着线程而生,随着线程而灭。但Java堆和方法区不一样,内存分配都存在不确定性,只有在程序处于运行期间才能知道会创建哪些对象,这部分内存和回收都是动态的,垃圾收集器所关注的是这

2020-05-30 01:10:04 874 2

原创 深入理解java虚拟机—— 虚拟机 深扒垃圾回收器,再也不怕BAT面试

在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。jvm中,程序计数器、虚拟机栈、本地方法栈都是随线程而生随线程而灭,栈帧随着方法的进入和退出做入栈和出栈操作,实现了自动的内存清理,因此,我们的内存垃圾回收主要集中于 java 堆和方法区中,在程序运行期间,这部分内存的分配和使用都是动态的.为什么需要了解垃圾回收目前内存的动态分配与内存

2020-05-27 23:40:33 410 3

原创 深入理解java虚拟机—— 一张万能的JVM虚拟机架构图看懂了虚拟机也就没什么了

辛辛苦苦树立了整整一个晚上,只要有价值就是值得的。希望大家留下宝贵意见。1、前篇介绍了【JAVA虚拟机堆内存结构以及堆内存作用对象回收机制】,主要包含四部分 一、堆区(Heap) 二、对象的内存布局 三、对象的访问定位 四、Java堆的内存划分2、前篇博文已将对JVM虚拟机内存中的 方法栈 【JAVA虚拟机内存结构之虚拟机栈(JVM Stack)】做了详细的介绍,栈的四大部分:虚拟机栈主要用于存储四部分内容栈帧(Stack Frame)...

2020-05-26 23:11:33 472

原创 深入理解java虚拟机——JAVA虚拟机程序计数器深度解析这一篇就够了

开篇介绍1、前篇介绍了【JAVA虚拟机堆内存结构以及堆内存作用对象回收机制】,主要包含四部分 一、堆区(Heap) 二、对象的内存布局 三、对象的访问定位 四、Java堆的内存划分2、前篇博文已将对JVM虚拟机内存中的 方法栈 【JAVA虚拟机内存结构之虚拟机栈(JVM Stack)】做了详细的介绍,栈的四大部分:虚拟机栈主要用于存储四部分内容栈帧(Stack Frame) ------局部变量表 --...

2020-05-25 22:25:17 1028 1

原创 深入理解java虚拟机——堆区,学习java内存分布这一篇就够了

在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”(Bump The Pointer)但如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内

2020-05-24 17:11:47 3216 2

原创 ARM处理器 CISC(复杂指令集)与RISC(精简指令集)

博文背景:最近想学习一些树莓派的知识,便看了一本书《树莓派开始,玩转Linux》,在阅读此书的时候,顺便把其中不懂的知识重新梳理一些,算是作为自己的读书笔记了。 有感兴趣的同学,可以一起研究学习。毕竟软件搞久了,真是有点无聊了,接触一些硬件的知识,反而感觉新颖,真是别有一番滋味了。毕竟一切软件的载体都是这是硬件,了解一些底层说不定可以收获到意想不到的见解。你知道iOS、WindowsPhone、Android这3大平台的手机共通点是什么吗?除了都可以打电话、传简讯、安装App之外,...

2020-05-24 01:15:07 8867

原创 高并发编程 -- Java中CAS详解

在JDK 5之前Java语言主要依靠synchronized关键字保证同步,这会导致有锁。一、锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。二、volatile机制volatile到底如何保证可见性和禁止指令重排序的。“观察加入volatile关键字和没有加入volatile关.

2020-05-23 14:23:56 335 2

原创 深入理解java虚拟机——java内存结构之虚拟机栈(JVM Stack)线程私有区域如何调度方法

虚拟机栈(JVM Stack)的介绍与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stack)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。  局部变量表中存储着方法的相关局部变量,包括各种基...

2020-05-20 22:51:39 1152

原创 深入理解java虚拟机—— java虚拟机内存结构虚拟机的内存模型架构解析

学习目标:由 JVM 引发的故障问题,无论在我们开发过程中还是生产环境下都是非常常见的,所有掌握好jvm,可以帮我本排查故障。 OutOfMemoryError(OOM) 内存溢出问题,Tomcat 容器中加载项目过多导致的 OOM 问题。 定位JVM哪里发生内存溢出了,为什么会内存溢出呢?如何监控 JVM运行。 JVM性能调优,JVM的内存区域划分,内存分配比例,并且可以通过JVM参数来反向定位代码问题,优化代码结构。 从JVM本质上了解线程并发安全的实现原理,以及与操作系统如何结合...

2020-05-19 23:15:42 395

原创 深入理解java虚拟机——如何下载hotspot、jdk源码

为什么要学习jvm学习JVM对于一个Java程序员的好处大概可以概括为下8点:了解java的发展历程,以及计算机语言的历史发展进程。 垃圾回收算法与原理 类字节码规范与执行引擎 内存模型与线程 类加载机制 编译器 高效并发,线程安全与锁优化 性能监控以及jvm调优可以从java语言运行的底层来了解java的运行原理首先我们看一下如何下载jdk源码、hotspot源码1. 进入网址:,这个网http://hg.openjdk.java.net址下面列出了所...

2020-05-18 23:14:55 1677

原创 Tomcat 9 源码解析 -- 请求如何经过tomcat到达servlet

前面几篇文章讲解了Tomcat如何启动的,如何通过NIO,开启一个ServerSocket服务监听。最后用户通过浏览器就可以直接访问到想要的资源。下图中Connector部分:一个Connector将在某个指定端口上侦听客户请求,并将获得的请求交给Engine来处理,从Engine处获得回应并返回客户。 Tomcat有两个典型的Connector: - 一个直接侦听来自browser的http请求 - 一个侦听来自其它WebServer的请求 Coyote Http/1.1 Connec.

2020-05-17 10:16:19 1140

原创 Tomcat 9 源码解析 -- 与SpringMvc如何结合在一起

Tomcat启动项目的方式下,如何加载SpringMvc 中的 DispatcherServletSpringBootServletInitializer类public abstract class SpringBootServletInitializer implements WebApplicationInitializer { protected Log logger; // Don't initialize early private boolean register...

2020-05-15 00:06:37 491

原创 Tomcat 9 源码解析 -- tomcat框架设计(源码层次解析)

Tomcat 9 源码解析 -- tomcat框架设计前文已经从架构层次讲解了tomcat框架设计,以及tomcat使用,以及每个模块的作用,以及各功能模块之间的关系。下面是Tomcat 9 架构的一个启用的架构流程图:...

2020-05-12 23:26:57 516

原创 Tomcat 9 源码解析 -- tomcat框架设计

Tomcat整体架构与重要组件1.Tomcat整体架构如果你浏览过Tomcat源码相关文章,你一定对此图不陌生.Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载servlet的,但,当使用一些MVC框架时,如spring MVC、strusts2,可能就找不出servlet在哪里?其实spring MVC框架就是一整个servlet,在web.xml中

2020-05-11 23:43:23 611

原创 Tomcat 9 源码解析 -- 环境搭建

前言为什么要学习tomcat源码?以我个人来说,为什么我要学习tomcat源码,之前我看过一本书《tomcat源码解析》,讲的十分详细,但是那个是以tomcat 7 为基础进行讲解的。看到tomcat 7 --》 tomcat 9 变化还是不少的,所以自己想再重新了解一下 最新tomcat 源码的原理。1、 学习最新tomcat源码知识。2、了解tomcat运行原理浏览器 --》tomcat 然后再返回给 --》浏览器 的过程。3、了解代码设计模式。4、性能调优。因为项目..

2020-05-10 18:34:14 426

原创 Tomcat 9 源码解析 -- Connector组件(2)

Tomcat 9 源码解析 -- Connector组件上文中已经分析到了processKey()方法。Poller #run() 在run方法最后调用了 processKey(sk, attachment); // 处理SelectKey/** processKey()这个方法主要通过调用processSocket()方法创建一个SocketProcessor,然后丢到Tomcat线程池中去执行。每个Endpoint都有自己的SocketProce...

2020-05-10 00:06:14 620

原创 Tomcat 9 源码解析 -- Connector组件

<Service name="Catalina"><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /></Service>1、首先.

2020-05-08 23:30:18 639

原创 Tomcat 9 源码解析 -- StandardContext

StandardContext 类介绍StandardContext 和其他 Container 一样,也是重写了 startInternal 方法。由于涉及到 webapp 的启动流程,需要很多准备工作,比如使用 WebResourceRoot 加载资源文件、利用 Loader 加载 class、使用 JarScanner 扫描 jar 包,等等。因此StandardContex...

2020-05-07 23:47:38 1177 1

原创 Tomcat 9 源码解析 -- ServletContainerInitializer

最近一直在死磕Tomcat 9 的源码,在此写下一些自己的学习心得,大家可以一起学习,互相讨论。本文主要是关于 Tomcat中 ServletContainerInitializer 初始化的部分。先看一张截图:1. 左侧为方法调用栈信息2.中间部分是一个loader加载器获取资源路径信息此处贴出源码:此处的源码是说明 tomcat 加载定义的ServletContai...

2020-05-06 23:31:22 785

原创 Maven项目中使用tomcat启动

最近学习Tomcat源码,平时新建maven项目的时候,使用springboot内嵌tomcat启动,现在需要使用外部tomcat启动,以便于学习tomcat和spring代码之间的执行关系。 添加完外部tomcat后突然发现无法将 maven项目的web项目添加到tomcat中。就是通过下图添加maven的 web项目,如过在JavaEE窗口下,项目中没有Deployment Desc...

2020-05-02 15:44:17 5741

jd-guijava反编译工具

JD-GUI 是一个用 C++ 开发的 Java 反编译工具,由 Pavel Kouznetsov开发,支持Windows、Linux和苹果Mac Os三个平台。而且提供了Eclipse平台下的插件JD-Eclipse.一款纯绿色的java反编译软件,压缩完仅586KB。解压可用,强大的反编译功能,可以把class文件编译成java文件,而且支持层级关系,在打开子类的情况下,直接点击父类名称,即可进入父类文件 轻巧方便~是我使用过最好的反编译软件~~ 还等什么呢

2017-08-11

Dubbo分布式项目例子

1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架 其核心部分包含: 1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。 2. Dubbo能做什么? 1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 2.软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 3. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载

2017-08-08

netWorkProtocol_网络协议

网络协议,网络七层协议结构图2017版

2017-08-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除