
java基础
茴香豆的茴有六种写法
这个作者很懒,什么都没留下…
展开
-
案例实战:每日上亿请求量的电商系统,JVM年轻代垃圾回收参数如何优化?
1、案例背景引入按照惯例,我们接下来会用案例驱动来带着大家分析到底该如何在特定场景下,预估系统的内存使用模型。然后合理优化新生代、老年代、Eden和Survivor各个区域的内存大小。接着再尽量优化参数避免新生代的对象进入老年代,尽量让对象留在新生代里被回收掉。我们这里的背景是电商系统,电商系统其实一般会拆分为很多的子系统独立部署比如商品系统、订单系统、促销系统、库存系统、仓储系统、会员系统,等等我们这里就以比较核心的订单系统作为例子来说明。(提示:食用本案例之前,请务必充分理解专栏之前两周的文章!)我们转载 2020-06-06 17:58:06 · 616 阅读 · 0 评论 -
关于finally
finally代码块一定会执行吗?答案当然是否定的。原因显而易见,在如下的情况下,finally代码块不会执行。在try代码块之前,程序出现异常,不会执行到finally代码块。 在try代码块之前,程序返回,不会执行finally代码块。 在try代码块中,如果主动执行System.exit(0)语句,不会执行finally代码块。 在没执行到finally代码块之前,突然J...转载 2016-12-27 23:51:49 · 2269 阅读 · 0 评论 -
JVM 1.8 永久代---元空间 的变动
JDK8 HotSpot JVM 将移除永久区,使用本地内存来存储类元数据信息并称之为:元空间(Metaspace)以下是JVM内存模型中方法区的变动1.新生代:Eden+From Survivor+To Survivor2.老年代:OldGen3.永久代(方法区的实现) : PermGen----->替换为Metaspace(本地内存中)方法区和“PermGe...转载 2019-07-11 16:27:06 · 3389 阅读 · 0 评论 -
Java并发编程-阻塞队列(BlockingQueue)的实现原理
原文地址转载 2019-07-15 11:09:10 · 895 阅读 · 0 评论 -
GC调优相关
1.如何理解Latency和Throughput: 吞吐量和延迟 延迟一般包括单向延迟(One-way Latency)和往返延迟(Round Trip Latency),实际测量时一般取往返延迟。它的单位一般是ms、s、min、h等。 而吞吐量一般指相当一段时间内测量出来的系统单位时间处理的任务数或事务数(TPS)。注意“相当一段时间”,不是几秒,而可能是十几分钟、...原创 2019-06-30 17:13:48 · 3421 阅读 · 0 评论 -
线程池实现的原理
线程池的优点是可总结为以下三点:线程复用 控制最大并发数 管理线程1.线程复用过程理解线程复用原理首先应了解线程生命周期。在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态。Thread通过new来新建一个线程,这个过程是是初始化一些线程信息,如线程名,id,线程所属group等,...转载 2019-07-14 11:03:19 · 3509 阅读 · 0 评论 -
内存泄露排查工具MAT的使用
MAT下载链接在程序运行时加上+HeapDumpOnOutOfMemoryError在OOM时会导出堆信息到hprof文件。本次测试用的代码如下public class Test02 { byte[] bytes = new byte[1*1024*1024]; public static void main(String[] args) { List...原创 2019-07-09 23:45:28 · 3446 阅读 · 0 评论 -
CMS收集器和G1收集器的区别
对于CMS收集器和G1收集器的不同,目前简单写了一下4点,有不足的地方后面再不断的更新修改。CMS收集器和G1收集器的区别区别一: 使用范围不一样 CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二: STW的时间CMS收集器以最小的停顿时间为目标的收集器。...转载 2019-07-07 15:47:33 · 3449 阅读 · 0 评论 -
Caffeine Cache
1. 前言互联网软件神速发展,用户的体验度是判断一个软件好坏的重要原因,所以缓存就是必不可少的一个神器。在多线程高并发场景中往往是离不开cache的,需要根据不同的应用场景来需要选择不同的cache,比如分布式缓存如redis、memcached,还有本地(进程内)缓存如ehcache、GuavaCache、Caffeine。说起Guava Cache,很多人都不会陌生,它是Google ...转载 2019-06-26 17:25:58 · 3509 阅读 · 0 评论 -
强引用,软引用,弱引用
一、软引用和弱引用的用法软引用(SoftReference)的含义是,如果一个对象只具有软引用,而当前虚拟机堆内存空间足够,那么垃圾回收器就不会回收它,反之就会回收这些软引用指向的对象。弱引用(WeakReference)与软引用的区别在于,垃圾回收器一旦发现某块内存上只有弱引用(一定请注意只有弱引用,没强引用),不管当前内存空间是否足够,那么都会回收这块内存。见如下实例 pub...原创 2019-06-26 13:48:27 · 3424 阅读 · 0 评论 -
性能优化
性能优化就是发挥机器本来的性能。性能的几个维度1.cputop命令2.IOiostat命令3.memoryfree命令4.networknicstat原创 2019-06-22 18:01:14 · 3454 阅读 · 0 评论 -
Gson @JsonAdapter实现对json指定属性进行加密
在项目开发中,对于一些敏感属性,可能需要进行加密处理。比如下面的对象中的name若需要加密。可在name上加上@JsonAdapter注解。/** * JsonAdapter * 用来自定义序列化 和 反序列化 * * 这种形式比较单一 , * 序列化 : 放置在 该类的属性上 * 反序列化时: 实现 JsonDeserializer<该类名> * ...原创 2019-06-10 15:36:46 · 1882 阅读 · 0 评论 -
深入理解wait/notify/notifyAll的作用
notify: 唤醒在监视器对象上等待的单个线程,此时调用该方法的代码继续执行。notifyAll: 唤醒在监视器对象上等待的所有线程,此时调用该方法的代码继续执行。第一、为什么会有wait/notify/notifyAll这几个方法?(1) wait/notify/notifyAll是为了避免轮询(尝试执行)带来的性能损失,这句话是什么意思?看下面的讲解:为了说清道理,我们用“图书馆借书...转载 2019-07-07 15:29:23 · 3561 阅读 · 0 评论 -
Java并行任务框架Fork/Join
Fork/Join是什么?Fork意思是分叉,Join为合并。Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割,提供我们一种方便的并行任务功能,满足实际场景的业务需求,思想类似于MapReduce。任务的分割必须保证子任务独立,不会相互依赖结果。从哪里开始?Fork/Join框架主要有...转载 2019-07-16 15:34:22 · 1985 阅读 · 0 评论 -
String == equals 堆 常量池
问题我们知道创建一个String类型的变量有以下两种方法:String str1 = "abc";String str2 = new String("abc");那么问题来了:String a = "abc";String b = "abc";String c = new String("abc");String d = new String("abc");Syst...转载 2017-02-10 17:39:45 · 2906 阅读 · 0 评论 -
Java开发必须掌握的线上问题排查命令
作为一个合格的开发人员,不仅要能写得一手还代码,还有一项很重要的技能就是排查问题。这里提到的排查问题不仅仅是在coding的过程中debug等,还包括的就是线上问题的排查。由于在生产环境中,一般没办法debug(其实有些问题,debug也白扯。。。),所以我们需要借助一些常用命令来查看运行时的具体情况,这些运行时信息包括但不限于运行日志、异常堆栈、堆使用情况、GC情况、JVM参数情况、线程情...转载 2019-08-15 19:32:38 · 429 阅读 · 0 评论 -
jvm 性能调优工具之 jmap
概述命令jmap是一个多功能的命令。它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息、查看 ClassLoader 的信息以及 finalizer 队列。jmap 用法参数:option: 选项参数。 pid: 需要打印配置信息的进程ID。 executable: 产生核心dump的Java可执行文件。 core: 需要打印配置信息的核心文...转载 2019-08-15 18:00:27 · 409 阅读 · 0 评论 -
static关键字主要有两种作用:
static关键字主要有两种作用:第一,为特定数据类型或对象分配单一的存贮空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,static在java中主要有四种使用情况:成员变量、成员方法、代码块及内部类。(1)static成员变量虽然java语言中没有全局的概念,但可以通过s...转载 2019-08-06 15:38:55 · 1155 阅读 · 0 评论 -
彻底明白java的字节流和字符流
java的IO流分两种流字节流 InputStream OutputStream字符流 Reader Writer他们都是抽象类,具体实现有字节流 FileInputStream FileOutputStream字符流 FileReader FileWriter字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节...转载 2016-11-30 19:42:53 · 2134 阅读 · 0 评论 -
在Java中如何高效的判断数组中是否包含某个元素
如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow中也是一个非常热门的问题。在投票比较高的几个答案中给出了几种不同的方法,但是他们的时间复杂度也是各不相同的。本文将分析几种常见用法及其时间成本。检查数组是否包含某个值的方法使用Listpublic static boolean useList(S...转载 2017-01-23 12:39:47 · 2424 阅读 · 0 评论 -
为什么JDK自身提供的构建线程池的方式并不建议使用
ExecutorsExecutors 是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。从上图中也可以看出,Executors的创建线程池的方法,创建出来的线程池都实现了ExecutorService接口。常用方法有以下几个:newFiexedThreadPool(int Threads):创建固定数目线程的线程池。newCachedThreadPool():创建一...转载 2018-12-03 23:45:36 · 4313 阅读 · 0 评论 -
在ArrayList的循环中删除元素,会不会出现问题?
如下的五种删除方式可以动手试试并看看结果import java.util.ArrayList;import java.util.Iterator;public class ArrayListTest { public static void main(String[] args) { ArrayList<String> list = new Arra...转载 2016-11-28 16:07:42 · 2314 阅读 · 0 评论 -
Serializable接口与Externalizable接口区别
被Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下:public interface Externalizable extends Serializable { public void writeExternal(ObjectOutput out) throws I...转载 2019-07-21 10:52:55 · 1875 阅读 · 0 评论 -
throw和throws的区别和联系
throw和throws对于Java程序员而言它们真的不是很陌生。但对于我这样的选手而言一提到它们的区别和联系就蒙圈了... 为了以后不蒙圈,今天就研究一下吧~~如果有不足的地方欢迎批评指正...1)throws 对于throws关键字而言一般用于抛出编译时的异常,如果某个异常是编译是异常,那么这个异常就需要捕获(try{}catch{}finally{})...转载 2017-12-19 17:16:48 · 632 阅读 · 0 评论 -
Java中的Switch对整型、字符型、字符串型的具体实现细节
Java 7中,switch的参数可以是String类型了,这对我们来说是一个很方便的改进。到目前为止switch支持这样几种数据类型:byte short int char String 。但是,作为一个程序员我们不仅要知道他有多么好用,还要知道它是如何实现的,witch对整型的支持是怎么实现的呢?对字符型是怎么实现的呢?String类型呢?有一点Java开发经验的人这个时候都会猜测switch...转载 2019-07-24 21:12:56 · 1639 阅读 · 0 评论 -
详解Tomcat 配置文件server.xml
目录前言一、一个server.xml配置实例二、server.xml文档的元素分类和整体结构1、整体结构2、元素分类三、核心组件1、Server2、Service3、Connector4、Engine5、Host(1)Engine与Host(2)Host的作用(3)Host的配置6、Context(1)Context的作用(...转载 2017-02-17 09:10:07 · 4012 阅读 · 0 评论 -
框架类总结
----------------------------------------------------------sp,ring的工作原理----------------------------------------------------------ORM实现原理---------------------------------------------------------...转载 2017-03-05 22:35:17 · 1217 阅读 · 0 评论 -
JVM相关
JVM内存模型1.程序计数器:是一个数据结构,用于保存当前正常执行的程序的内存地址。Java虚拟机的多线程就是通过线程轮流切换并分配处理器时间来实现的, 为了线程切换后能恢复到正确的位置,每条线程都需要一个独立的程序计数器,互不影响,该区域为“线程私有”。2.Java虚拟机栈:线程私有的,与线程生命周期相同,用于存储局部变量表,操作栈,方法返回值。局部变量表放着基本数据类型,还有对象的引用...原创 2019-04-14 00:15:45 · 3549 阅读 · 0 评论 -
HTTP长连接、短连接究竟是什么?
1. HTTP协议与TCP/IP协议的关系HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。 IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得网络上接收端收到发送端所发出的所有包,并且顺序与发送顺序一致。TCP协议是可靠的、面向连接的。2. 如何理解HTTP协议是无状态的...转载 2017-01-23 21:16:17 · 4284 阅读 · 0 评论 -
threadlocal原理及常用应用场景
threadlocal原理及常用应用场景转载 2019-07-15 20:57:37 · 2023 阅读 · 0 评论 -
《Effective Java》中关于异常处理的几条建议
概要本章是从《Effective Java》摘录整理出来的关于异常处理的几条建议。内容包括:第1条: 只针对不正常的情况才使用异常第2条: 对于可恢复的条件使用被检查的异常,对于程序错误使用运行时异常第3条: 避免不必要的使用被检查的异常第4条: 尽量使用标准的异常第5条: 抛出的异常要适合于相应的抽象第6条: 每个方法抛出的异常都要有文档第7条: 在细节消息中包含失败 -- 捕获消息第8条:...转载 2019-07-24 18:11:58 · 1591 阅读 · 0 评论 -
netty
Netty简介Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。JDK原生NIO程序的问题JDK原生也有一套网络应用程序API,但是存在一系列问题,主要如下: NIO的类库和API繁杂,使用麻烦,你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等 需要具...转载 2019-08-03 18:26:48 · 1258 阅读 · 0 评论 -
动态规划之矩阵路径类
leetcode 62. 不同路径一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?示例 1:输入: m = 3, n = 2 输出: 3解释:从左上角开始,总共有 3 条路径可以到达右下角。1. 向右 -> ...原创 2019-08-26 18:02:11 · 842 阅读 · 0 评论 -
Synchronized 底层原理
我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:package com.paddx.test.concurrent;public class SynchronizedDemo { public void method() { synchronized (this) { System.out.printl...转载 2019-05-22 16:02:10 · 3451 阅读 · 0 评论 -
注解(Annotation)入门
1.@Target,作用:用于描述注解的使用范围(即:被描述的注解可以用在什么地方) 取值(ElementType)有: 1.CONSTRUCTOR:用于描述构造器 2.FIELD:用于描述域 3.LOCAL_VARIABLE:用于描述局部变量 4.METHOD:用于描述方法 5.PACKAGE:用于描述包 6.PARAMETER:用于描述参...原创 2019-06-22 17:52:35 · 3974 阅读 · 0 评论 -
反射中Class.forName()和ClassLoader.loadClass()的区别
一 Java类装载过程装载:通过累的全限定名获取二进制字节流,将二进制字节流转换成方法区中的运行时数据结构,在内存中生成Java.lang.class对象;链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;校验:检查导入类或接口的二进制数据的正确性;(文件格式验证,元数据验证,字节码验证,符号引用验证)准备:给类的静态变量分配并初始化存储空间;解析:将常量池中...转载 2019-07-12 13:38:42 · 3398 阅读 · 0 评论 -
java中
throw和throws1、throws出现在方法函数头;而throw出现在函数体。2、throws表示出现异常的一种可能性,并不一定会发生这些异常;throw则是抛出了异常,执行throw则一定抛出了某种异常。3、两者都是消极处理异常的方式(这里的消极并不是说这种方式不好),只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理。mvn d...转载 2019-04-15 22:21:39 · 3499 阅读 · 0 评论 -
如何正确的重写equals() 和 hashCode()方法
1.equals与hashcode间的关系 1.如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同; 2.如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)2.为什么要这样设计 为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就...原创 2019-04-05 15:25:48 · 2539 阅读 · 0 评论 -
关于try catch finally
除非在try块或者catch块中调用了退出虚拟机的方法(即System.exit(1);)1、不管有木有出现异常,finally块中代码都会执行;2、当try和catch中有return时,finally仍然会执行;3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保...转载 2017-08-16 15:07:40 · 525 阅读 · 0 评论 -
dubbo-原理-服务引用流程
这个dubbo:reference标签对应的是ReferenceBean。它实现了FactoryBean接口。我们看getObject方法-->get()-->init()-->ref = createProxy(map);debug启动,reference标签会去spring容器中拿UserService的实现,就会进入到ReferenceBean的getObje...转载 2017-11-21 14:05:15 · 410 阅读 · 0 评论