Java
文章平均质量分 78
__KevinYzy__
github:https://github.com/KEVINYZY ----
leetcode:https://leetcode.com/seanadfgfeer/ ----
lintcode:https://www.lintcode.com/user/fire-blade ----
nowcoder:https://www.nowcoder.com/profile/1073818
展开
-
Leetcode 959. Regions Cut By Slashes
并查集class Solution {private: int _fa[3600]; int N, M; void init() { for (int i = 0; i < M; i++) _fa[i] = i; } int fa(int x) { return x == _fa[...原创 2019-05-19 10:32:32 · 160 阅读 · 0 评论 -
Retrofit 中文参数乱码问题
网站中文用户名登录,结果出错,网上的结论说是@Headers(“Content-Type:application/x-www-form-urlencoded; charset=utf-8”)//添加请求头注解或是然鹅这会使你统一的请求参数拦截失效,具体原因上述链接里有,就是ContentTypeOverridingRequestBody 替换了你的 FormBody所以你添加统一的请求参...原创 2020-04-27 11:04:50 · 1007 阅读 · 0 评论 -
Java字节码运行浅析
明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候到底发生了些什么。理解这点不仅能搞清语言特性是如何实现的,并且在做方案讨论的时候能知道相应的副作用及权衡利弊。本文介绍了Java代码是如何编译成字节码并在JVM上执行的。想了解JVM的内部结构以及字节码运行时用到的各个内存区域,可以看下我前面的一篇关于JVM内部细节的文章。本文分为三部分,每一部分都分成几个...原创 2020-04-27 10:55:50 · 132 阅读 · 0 评论 -
Java 10的类型推导
Java 10带来了全新的语言特性:局部变量类型推导(local variable type inference)。它的主要目标就是减少样板代码(boilerplate),增强代码可读性。可以使用关键词var来替代局部变量的类型声明——编译器会根据变量初始化语句来自己填充正确的类型的。比如说:Map<User, List> userChannels = new HashMap<...原创 2020-04-27 10:42:38 · 203 阅读 · 0 评论 -
关于Java中尾递归的优化
最近总有人问我,Java SE8里有没有针对尾调用做优化(这是一种特殊的函数调用)。这个优化和递归调用密切相关,而递归调用对函数式语言来说尤其重要,因为它们通常都基于递归来进行设计编码。本文会介绍到什么是尾调用,怎样可以对它进行有效的优化,以及Java 8在这方面是如何做的。在深入这个话题之前,我们先来了解下什么是尾调用。什么是尾调用?尾调用指的是一个方法或者函数的调用在另一个方法或者函数的...原创 2020-04-27 10:35:28 · 442 阅读 · 0 评论 -
不容忽视的ClassNotFoundException
相信很多Java开发人员都对这个常见却不招人待见的java.lang.ClassNotFoundException并不陌生。出现这个异常的原因大家都清楚(classpath路径下缺少class文件或者jar包了,或者是类加载器委派的问题等),不过对于它给JVM带来的性能影响可能就不了解了。这个异常可能会严重影响应用程序的响应时间和可伸缩性。大型的J2EE企业级应用,可能会同时部署有多个应用,由于...原创 2020-04-27 10:35:13 · 428 阅读 · 0 评论 -
JVM中方法调用的实现机制
本文将要介绍一下Java 8和Java 9中JVM是如何进行方法调用的。这是JVM内部实现的基础机制,如果你想理解JVM的just-in-time(JIT)编译器或者进行应用程序调优的话,这些是必需的背景知识。字节码分析我们先从一段简单的Java代码开始:long time = System.currentTimeMillis();HashMap<String, String>...原创 2020-04-27 10:33:12 · 681 阅读 · 0 评论 -
关于类加载器内存泄露的分析
从上个世纪90年代Java诞生之日起,Java的类和资源的加载就一直是个问题。由于它增加了启动和初始化时间,因此这个问题在Java应用服务器上则尤为明显。为了缓解这个问题,大家试过了不同的访问,比如说以exploaded方式部署,但这只对简单的应用有效;还有2001年发明的Java热插拔的机制。启用热插拔的话,你在一个现有的方法内的改动马上就会生效。由于方法的边界限制,这个方法并不是特别有用,通常...原创 2020-04-27 10:28:12 · 356 阅读 · 0 评论 -
Twitter:使用Netty 4来减少GC开销
在twitter,需要网络功能的核心模块使用的都是Netty。 比方说:Finagle是我们的协议无关的RPC系统,它的传输层是在Netty之上构建的,许多内部的服务都是通过它来实现的,比如说搜索服务。TFE(Twitter Front End,Twitter前端)是我们专门的填鸭式反向代理,它使用Netty支撑了大部分面向公众的HTTP及SPDY的流量。Cloudhopper每个月都通过N...原创 2020-04-27 10:27:20 · 238 阅读 · 0 评论 -
浅谈GC调优
复杂的东西我们可不喜欢。一直以来,内存泄露,线程锁,GC调优这些东西处理起来都很痛苦。这三个邪恶的小伙伴带来的性能问题是最难复现的,这也使得修复这些问题有如噩梦一般。如果你不信的话,看一下LinkedIn最近关于性能调优的一篇文章就知道了。尽管这篇文章很好的剖析了性能调优的过程,但它也很好的证明了这个领域的复杂性。LinkedIn的工程师进行GC调优改善吞吐量和延迟用的是下面这组参数:-ser...原创 2020-04-27 10:27:04 · 148 阅读 · 0 评论 -
HotSpot JVM就是个庞氏骗局
正好今天是愚人节,就来说点骗子的东西吧~时不时的我就会听见有人抱怨说,他的HotSpot JVM不停的在垃圾回收,可是每次回收完后堆却还是满的。当他们发现这是因为JVM的内存已经不够了之后,通常会问这么个问题,为什么JVM不抛一个OutOfMemoryError(OOME)呢?毕竟来说,由于内存不足,我的程序都已经没法继续跑了,对吧?先说重要的,如果你运气好的话,你永远不会发现你的JVM其实在...原创 2020-04-27 10:24:39 · 215 阅读 · 0 评论 -
自己动手写GC
有时候事情多得我喘不过气来的时候,我会出现一种异常反应,好像找点别的事做,就能摆脱烦恼了。通常的话我会自己写一些独立的小程序。有一天早上,我正在写的书,工作中的事情,还有要为Strang Loop准备的分享,这些东西让我感到快崩溃了,突然间我想到,“我要写一个垃圾回收程序”。是的,我知道这听起来有点疯狂。不过你可以把我这个荒唐的想法当成是一份编程语言基础的免费教程。通过百来行普通的C代码,我实...原创 2020-04-27 10:23:27 · 4076 阅读 · 0 评论 -
Java的Finalizer引发的内存溢出
本文介绍的是Java里一个内建的概念,Finalizer。你可能对它对数家珍,但也可能从未听闻过,这得看你有没有花时间完整地看过一遍java.lang.Object类了。在java.lang.Object里面就有一个finalize()的方法。这个方法的实现是空的,不过一旦实现了这个方法,就会触发JVM的内部行为,威力和危险并存。如果JVM发现某个类实现了finalize()方法的话,那么见证奇...原创 2020-04-27 10:21:52 · 484 阅读 · 0 评论 -
Java 8的元空间
本文我们将会介绍JVM的一个更新,这就是持久代的移除。我们会介绍为什么需要移除持久代,以及它的替代者,元空间(metaspace)。这是上一篇文章内存管理之垃圾回收的续集。Java 6中的堆结构是这样的:持久代持久代中包含了虚拟机中所有可通过反射获取到的数据,比如Class和Method对象。不同的Java虚拟机之间可能会进行类共享,因此持久代又分为只读区和读写区。JVM用于描述应用程序中...原创 2020-04-27 10:20:35 · 164 阅读 · 0 评论 -
JVM堆大小的自适应能力
在完善我们的测试台以便提高Plumbr排查GC故障能力的时候,我编写了一个小小的测试用例,我觉得应该会有不少人对它感兴趣。我的目标是测试JVM在不同的伊甸区(Eden), 存活区(Survivor)以及年老代空间的分配情况下的自适应能力。这个测试用例就是在批量地生成对象。每秒会批量生成一批,每批大概是500KB的大小。这些对象的生命周期是5秒钟,之后它们的引用会被删除掉,然后就可以进行垃圾回收了...原创 2020-04-27 10:19:38 · 530 阅读 · 0 评论 -
Full GC是否真的存在
在Plumbr这和GC暂停检测打交道的这段日子里,我查阅了与这个主题相关的大量文章,书籍以及资料。在这当中,我经常会对新生代GC, 年老代GC以及Full GC的事件的使用(滥用)感到困惑。于是便有了这篇文章,希望能够清除一些困惑。本文需要读者对JVM内建的GC相关的常用原理有一定的了解。像eden区,Survivor区以及年老区空间的划分,分代假设(generational hypothesi...原创 2020-04-27 10:18:34 · 141 阅读 · 0 评论 -
什么是垃圾回收
本文摘自我们几周后即将出版的Garbage Collection Handbook一书的样章。同时也让你能熟悉下垃圾回收的基础知识——这选自该书的第一章。乍一看,垃圾回收所做的事情应当恰如其名——查找并清除垃圾。事实上却恰恰相反。垃圾回收会跟踪所有仍在使用的对象,然后将剩余的对象标记为垃圾。牢记了这点之后,我们再来深入地了解下这个被称为“垃圾回收”的自动化内存回收在JVM中到底是如何实现的。手...原创 2020-04-27 10:18:20 · 114 阅读 · 0 评论 -
Java 8:HashMap的性能提升
HashMap是一个高效通用的数据结构,它在每一个Java程序中都随处可见。先来介绍些基础知识。你可能也知道,HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶里。桶的数量通常要比map中的记录的数量要稍大,这样每个桶包括的值会比较少(最好是一个)。当通过key进行查找时,我们可以在常数时间内迅速定位到某个桶(使用hashCode()对桶的数量进行取模)以及要...原创 2020-04-27 10:17:12 · 137 阅读 · 0 评论 -
弱引用,软引用及虚引用对GC的影响
在应用程序中使用非强引用会导致一系列的问题,对GC的响应时间及吞吐量都会有所影响。尽管这类引用在某些场景下可以减少OutOfMemoryError的出现频率,但过度的使用则会严重影响到垃圾回收,从而导致应用程序的性能遭受影响。应该注意什么?在使用弱引用时,你最好了解一下它是如何被回收的。一旦垃圾回收器发现有一个对象是弱可达的,也就是说,它只剩下弱引用了,这个对象就会被放到一个相应的Refere...原创 2020-04-27 10:16:09 · 778 阅读 · 0 评论 -
Java中的垃圾回收
前文中对标记删除算法的介绍更多还是偏理论性质的。实践中,为了更好地满足现实的场景及需求,还需要对算法进行大量的调整。举个简单的例子,我们来看下JVM需要记录哪些信息才能让我们得以安全地分配对象空间。碎片及整理(Fragmenting and Compacting)JVM在清除不可达对象之后,还得确保它们所在的空间是可以进行复用的。对象删除会导致碎片的出现,这有点类似于磁盘碎片,这会带来两个问题...原创 2020-04-27 10:15:40 · 139 阅读 · 0 评论 -
GC算法基础
GC算法:基础篇在深入GC算法的实现细节之前,我们最好先来了解下相关术语及背后的基本原理。不同回收器的实现细节各有不同,但总的来说基本所有的回收器都会关注如下两个方面:找出所有的存活对象清理掉所有的其它对象——也就是那些被认为是废弃或无用的对象。首先,所有回收器都会通过一个标记过程来对存活对象进行统计。标记可达对象JVM中用到的所有现代GC算法在回收前都会先找出所有仍存活的对象。下图中...原创 2020-04-27 10:14:46 · 115 阅读 · 0 评论 -
Kubernetes简介及入门
如今单体应用(monolithic application)日渐被认为是一种反模式(antipattern),而云平台则成为了应用部署的香饽饽。这个转变可不仅仅像是在别人的机器上启动一个虚机那么简单。如何能有效地利用云的资源和伸缩性,意味着和要过去的单体应用划清界限,转而拥抱新的架构和开发实践。微服务正逐渐成为云端应用及服务分发的事实标准。应用被拆分成松耦合的小模块,每个模块都有自己的职责。这种...原创 2020-04-27 10:11:46 · 283 阅读 · 0 评论 -
JDK下载过慢的问题解决方案
下载JDK的时候,10k每秒的速度简直难以忍受,下面列出了一些解决方法可用的加速方法将下载链接去掉https由于下载时默认是https,所以会慢一些,使用http之后虽然还是慢,但是也能稳定在400k左右,不急的话这速度十分钟之内就可以下完,还可以接受使用下载工具下载使用诸如百度网盘、迅雷等下载工具下载,流氓加速,快的一批国内各大公司的镜像站比如华为的:https://repo.hu...原创 2020-04-27 10:10:48 · 1176 阅读 · 0 评论 -
Java 中初始化 List 集合的 8 种方式!
https://blog.csdn.net/qq_39101581/article/details/88393876List 是在开发中比较常用的集合,今天总结一下 Java 中初始化 List 的几种方式。1、常规方式List<String> list = new ArrayList<>();list.add("1");list.add("2");list....原创 2020-04-24 11:31:33 · 491 阅读 · 0 评论 -
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
new InputStreamReader(System.in);构造一个InputStreamReader对象,这个对象是字节流通向字符流的桥梁,它读取字节并将其解码为字符。 new BufferedReader(new InputStreamReader(System.in));构造一个BufferedReader,里面存放在控制台输入的字节转换后成的字符。 所以Buffered...原创 2020-04-24 12:10:58 · 2900 阅读 · 0 评论 -
Java Queue:poll、offer、element、peek
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。在java5中新增...原创 2020-04-24 12:12:59 · 520 阅读 · 0 评论 -
ArrayBlockingQueue take()和poll()的一点区别
使用take()函数,如果队列中没有数据,则线程wait释放CPU,而poll()则不会等待,直接返回null;同样,空间耗尽时offer()函数不会等待,直接返回false,而put()则会wait,因此如果你使用while(true)来获得队列元素,千万别用poll(),CPU会100%的。另外,如果你希望ThreadPoolExecutor中常驻n个线程,请调用“public void a...原创 2020-04-27 09:54:15 · 5683 阅读 · 0 评论 -
Java Thread之Sleep()使用方法总结
一、API简介Thread.sleep()是Thread类的一个静态方法,使当前线程休眠,进入阻塞状态(暂停执行),如果线程在睡眠状态被中断,将会抛出IterruptedException中断异常。。主要方法如下:【a】sleep(long millis) 线程睡眠 millis 毫秒【b】sleep(long millis, int nanos) 线程睡眠 millis 毫秒 + na...原创 2020-04-27 09:56:30 · 1749 阅读 · 0 评论 -
java enum的用法详解
Java Enum原理public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE };实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。因此,在比较两个枚举类型的值时,永远不需要调用equals方法,而直接使用""就可以了。(equals()方法也是直接使用, 两者是一样的效果)Java Enum类型的语法结构尽管和...原创 2020-04-27 10:10:23 · 97 阅读 · 0 评论 -
Erlang和Java的内存模型比较
Erlang和Java的内存模型比较我读到一篇相当相当有趣的关于Erlang VM内存管理策略的文章。它是Jesper Wilhelmsson写的一篇论文,我觉得有必要讨论一下Erlang和Oracle的Java虚拟机在内存管理方面的不同之处。对于从没听说过Erlang的人来说,有必要简单的介绍一下,它是一门函数式语言,并且使用异步消息传递作为它并发的基石。消息传递使用的是拷贝的机制,并且在不...原创 2020-04-27 10:42:52 · 164 阅读 · 0 评论 -
Java中如何颠倒"是非"
我们先来看一段代码:public static void main(String[] args) {if(Boolean.valueOf(“true”) == false))System.out.println(“true == false”);}你觉得这段代码的输出是什么?1. 什么也没有。 2. true == false. 3. 这可不好说。选1的都是好孩子,直接选3的就请不...原创 2020-04-27 10:45:05 · 150 阅读 · 0 评论 -
hashCode的性能优化
本文主要讨论下不同的hashCode()实现对应用程序的性能影响。hashCode()方法的一个主要作用就是使得对象能够成为哈希表的key或者散列集的成员。但同时这个对象还得实现equals(Object)方法,它和hashCode()的实现必须是一致的:如果a.equals(b)那么a.hashCode == b.hashCode()如果hashCode()在同一个对象上被调用两次,它应该...原创 2020-04-27 10:45:44 · 266 阅读 · 0 评论 -
JUnit:使用ExpectedException进行异常测试
Junit中有好几种测试异常的方法。就像我在前面几篇文章中写道的那样,我比较喜欢使用org.junit.rules.ExpectedException规则。一般来说,ExpectedException规则是org.junit.Before, org.junit.After, org.junit.BeforeClass,或者org.junit.AfterClass注解的一种替代方式 ,但是它们的功能...原创 2020-04-27 10:45:59 · 1394 阅读 · 0 评论 -
Java异常的性能分析
在Java中抛异常的性能是非常差的。通常来说,抛一个异常大概会消耗100到1000个时钟节拍。通常是出现了意想不到的错误,我们才会往外抛异常。也就是说,我们肯定不希望一个进程一秒钟就抛出上千个异常。不过有时候你确实会碰到有些方法把异常当作事件一样往外抛。我们在这篇文章中已经看到一个这样的典范):sun.misc.BASE64Decoder之所以性能很差就是因为它通过抛异常来对外请求道,”我还需要...原创 2020-04-27 10:46:12 · 448 阅读 · 1 评论 -
Java字符串之性能优化
基础类型转化成String在程序中你可能时常会需要将别的类型转化成String,有时候可能是一些基础类型的值。在拼接字符串的时候,如果你有两个或者多个基础类型的值需要放到前面,你需要显式的将第一个值转化成String(不然的话像System.out.println(1+‘a’)会输出98,而不是"1a")。当然了,有一组String.valueOf方法可以完成这个(或者是基础类型对应的包装类的方...原创 2020-04-27 10:46:23 · 254 阅读 · 0 评论 -
如何在Java中分配超过-Xmx限制的内存
本文主要介绍Java中几种分配内存的方法。我们会看到如何使用sun.misc.Unsafe来统一操作任意类型的内存。以前用C语言开发的同学通常都希望能在Java中通过较底层的接口来操作内存,他们一定会对本文中要讲的内容感兴趣。如果你对Java内存优化比较感兴趣,可以看下这篇文章,以及它的姊妹篇:一, 二。http://java-performance.info/memory-consumptio...原创 2020-04-27 10:46:34 · 1240 阅读 · 0 评论 -
Java的对象驻留
Java会将源代码中的字符串常量存储到常量池中。也就是说,当你这么写的时候:String a = “I am a string”;String b = “I am a string”;变量a和变量b是同一个值。这不只是说它俩的值是一样的,而是说就是同一个字符串对象。用Java的话来说就是a==b的结果是true。然而这个只对字符串以及小的整型或者长整型有效。其它的对象是不会被驻留的,也就是说...原创 2020-04-27 10:46:48 · 196 阅读 · 0 评论 -
Java中另类使用内存的方法
sun.misc.Unsafe为你大开Java的方便之门,你可以用它做很多Java不允许的事情,在一些非常特殊的场景下它还是非常有用的。99%的时候,你都应该避免使用它,然而在有些非常罕见的情况下,只有它能解决问题。本文讲述了它在OpenHFT中的使用场景以及我希望在Java 9中看到哪些功能。如果希望访问大量内存的同时又不影响GC,就特别适合使用Unsafe。在进程间共享内存,同时又不希望引起...原创 2020-04-27 10:47:00 · 163 阅读 · 0 评论 -
Java那些不为人知的特殊方法
如果你用过反射并且执行过getDeclaredMethods方法的话,你可能会感到很吃惊。你会发现出现了很多源代码里没有的方法。如果你看一下这些方法的修饰符的话,可能会发现里面有些方法是volatile的。顺便说一句,如果在Java面试里问到“什么是volatile方法?”,你可能会吓出一身冷汗。正确的答案是没有volatile方法。但同时,getDeclaredMethods()或者getMet...原创 2020-04-27 10:56:10 · 201 阅读 · 0 评论 -
Java中常见的坑
概述Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头。如果你习惯了别的语言,你读Java 的代码很容易搞错一些概念。变量要么是引用 ,要么是基础类型这是对的,变量不是对象。也就是说在下面这个例子里,s不是个对象,也不是字符串,它只是一个字符串的引用。String s = “Hello”;这...原创 2020-04-27 10:56:28 · 185 阅读 · 0 评论