![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA进阶知识总结
文章平均质量分 62
NullPointerExcept
这个作者很懒,什么都没留下…
展开
-
JAVA集合类(大公司面试喜欢问的)
看了一些所谓大公司的Java面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。java.util包中就包含了一系列重要的集合类,而对于集合类,主要需要掌握的就是它的内部结构,以及遍历集合的迭代模式。接口:Collection所有集合类的根类型,主要的一个接口方法:boolean add(Ojbect c)转载 2017-08-17 10:14:37 · 251 阅读 · 0 评论 -
阿里P7/P8学习路线图——技术封神之路
一、基础篇JVMJVM内存结构堆、栈、方法区、直接内存、堆和栈区别Java内存模型内存可见性、重排序、顺序一致性、volatile、锁、final垃圾回收内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定JVM参数及调优 Java对象模型oop-klass、对象头HotSpot即时编译器、编译优化类加载机制classLoader、类加载过程、双亲委派(破坏双亲委派)、模块化(jb...转载 2018-04-18 09:32:06 · 5785 阅读 · 0 评论 -
[大数据量]BitMap即java.util.BitSet的应用
Bitmap算法, 问题:对40亿个数据进行排序,数据类型为 int,无相同数据。 思考:关于40亿个数据的排序,首先想如何存储呢?一个int 4个字节,也就是160亿个字节,也就是大概有16GB的数据,现在所有的计算机估计 没有这么大的内存吧,所以我们就可以文件归并排序,也可以分段读入数据在进行Qsort,但是都需要不停地读入文件,可以想象不停地读取文件硬件操作会有多么浪费时间。 我们这样都是用...转载 2018-04-18 10:20:53 · 904 阅读 · 0 评论 -
Java JDK代理、CGLIB、AspectJ代理分析比较
前言什么是代理,在Design patterns In java这个本书中是这样描述的,简单的说就是为某个对象提供一个代理,以控制对这个对象的访问。在不修改源代码的基础上做方法增强,代理是一种设计模式,又简单的分为两种。静态代理:代理类和委托类在代码运行前关系就确定了,也就是说在代理类的代码一开始就已经存在了。动态代理:动态代理类的字节码在程序运行时的时候生成。静态代理先来看一个静态代理的例子,C...转载 2018-05-25 15:14:43 · 157 阅读 · 0 评论 -
理解JMX之介绍和简单使用
近期在项目上需要添加一些功能,想把一个开源工程整合进来,虽说是整合,但是觉得跟开发有查不了多少,要让这个开源工程的编码风格和设计方式与我们的工程保持一致,其中涉及到应用程序的监控和管理,不可避免的要使用JMX,之前简单的了解过JMX,但是没有动力深入去了解其中的原理和编码,由于项目需要,这次针对JMX要深入总结一下,关于监控的内容,之前写过一篇系统监控之SNMP协议理解,纯属是科普文章,也没有编程...转载 2018-05-25 15:32:38 · 541 阅读 · 0 评论 -
JVM原理讲解和调优
一、什么是JVM JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言...转载 2018-05-22 16:22:20 · 119 阅读 · 0 评论 -
JAVA锁的分类大全
在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章来汇总下各种锁的分类。公平锁/非公平锁可重入锁独享锁/共享锁互斥锁/读写锁乐观锁/悲观锁分段锁偏向锁/轻量级锁/重量级锁自旋锁上面是很多锁的名词,这些分类并不是全是指锁的状态,有的指锁的特性,有的指锁的设计,下面总结的内容是对每个锁的名词进行一定的解释。公平锁/非公平锁公平锁是指多个线程按照申请锁的顺序来获取锁。非公平锁是指多个线程...转载 2018-05-23 09:19:04 · 203 阅读 · 0 评论 -
垃圾回收算法——复制算法 以及eden和survivor
复制(Copying)算法说到底也是为了解决标记-清除算法产生的那些碎片。首先将内存分为大小相等的两部分(假设A、B两部分),每次呢只使用其中的一部分(这里我们假设为A区),等这部分用完了,这时候就将这里面还能活下来的对象复制到另一部分内存(这里设为B区)中,然后把A区中的剩下部分全部清理掉。这样一来每次清理都要对一半的内存进行回收操作,这样内存碎片的问题就解决了,可以说简单,高效。但是呢,肯定发...转载 2018-05-23 10:04:35 · 1385 阅读 · 0 评论 -
JDK8-废弃永久代(PermGen)迎来元空间(Metaspace)
目录一、背景1.1 永久代(PermGen)在哪里?1.2 JDK8永久代的废弃 二、为什么废弃永久代(PermGen) 2.1 官方说明Motivation 2.2 现实使用中易出问题三、深入理解元空间(Metaspace)3.1元空间的内存大小3.2常用配置参数3.3测试并追踪元空间大小 四、总结 正文回到顶部一、背景1.1 永久代(PermGen)在哪里?根据,hotspot jvm结构如下...转载 2018-05-23 10:41:56 · 283 阅读 · 0 评论 -
几张图轻松理解String.intern()
一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用。 二、通过字面量赋值创建字符串(如:String str=”twm”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串;若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串。 三、常量...转载 2018-05-23 10:58:56 · 118 阅读 · 0 评论 -
JVM进阶之运行时数据区
前言 最近在看重温JVM相关的知识点,但总感觉看书很枯燥乏味,看别人的博客知识又显得零碎,知识体系不够系统,所以有必要把所见所闻所学的点,好好地梳理成文,加强自己理解程度的同时,挖掘自身的盲点。好了,鸡血不宜多,让我们开始JVM的新篇章。 话说平时开发中的我们有曾想过写过的代码运行在哪儿,比如在类中声明了static类型的变量,在方法中new了一个对象等等……如果这些都不了解,我只能说不是个合...转载 2018-05-23 11:09:38 · 104 阅读 · 0 评论 -
JDK-9的安装与环境变量配置
2017年9月JDK -9发布了,鉴于官网的声明Oracle will not post further updates of Java SE 8 to its public download sites for commercial use after September 2018.早点移植到此版本为好。1. 安装首先下载最新版的JDK-9(官网下载比较慢,可以直接在网上找资源下载),如果只是为...原创 2018-04-01 17:09:46 · 250 阅读 · 0 评论 -
配置Eclipse for Java 9
原文:Configure Eclipse for Java 9今天 安装 JDK9 之后, 配置到 Eclipse 总是 提示: Target is not a JDK root. System library was not found.配置Eclipse for Java 91 下载Java 9 2 将 Eclipse配置为在Java 9 VM上运行 3 为Java 9模块配置Eclipse ...转载 2018-04-01 16:23:20 · 788 阅读 · 0 评论 -
JVM 内存分代、垃圾回收漫谈
关于 JVM 内存模型以及垃圾回收的文章网上很多,自己以前也看过很多,但是却从来也没有系统的去了解学习过,这次正巧看到一本讲解 JVM 的好书 – 周志明老师的《深入理解 Java 虚拟机》,然后就花了点时间,认真系统的学习了一遍,尽管还没有看完,但是已经爱耐不住,觉得要写点东西出来,写的过程是一个思考融汇的过程,也是一个知识升华的过程。这篇主要简单分享一下关于 JVM 内存模型、内存溢出转载 2017-08-17 10:15:20 · 252 阅读 · 0 评论 -
Java虚拟机回忆录
那么今天我就来谈谈我对他的理解。首先,每当说起JVM大概都会想到Java虚拟机运行时数据区,那么它是怎样划分的呢?话不多说,别跟一个直男程序员谈理论扯理想,最爱看的就是图(图摘自互联网)。很多人粗略的将它分为堆区和非堆区,由上图可以看出Java虚拟机在执行程序时会把他管理的内存划分为不同的数据区。堆首先第一个想到的就是它了,在虚拟机启动时就创建,一坨儿活跃在虚拟转载 2017-08-04 09:14:26 · 220 阅读 · 0 评论 -
如何建设高可用系统
面试的时候经常会问一个问题,如何建设高可用系统?大家可以一起探讨下。“高可用性”(High Availability)通常来描述一个系统经过专门的设计,从而减少停工时间,而保持其服务的高度可用性。以下是高可用系统的设计建议:设计建议精准监控- 对CPU利用率,load,内存,带宽,系统调用量,应用错误量,PV,UV和业务量进行监控,避免内存泄露和异常代码对系统产生影转载 2017-08-18 09:55:02 · 398 阅读 · 0 评论 -
java分布式系统开关功能设计(服务升降级)
首先讲一下开关的由来,例如东京在6月18日做店庆促销活动,在交易下单环节,可能需要调用A、B、C三个接口来完成,但是其实A和B是必须的,C只是附加的功能(例如在下单的时候做一下推荐),可有可无,在平时系统没有压力,容量充足的情况下,调用下没问题,但是在类似店庆之类的大促环节,系统已经满负荷了,这时候其实完全可以不去调用C接口,怎么实现这个呢?改代码?no,no,no,这样太不敏捷,此时开关诞生了,转载 2017-08-18 09:55:37 · 693 阅读 · 0 评论 -
比较两个java.util.Date 的日期(年月日)是否相同(忽略时、分、秒)的多种方法
介绍几种比较Date年月日的方法1、需求:1)下面两个时间进行比较:Thu Jan 01 08:59:00 CST 1970Thu Jan 01 08:48:00 CST 1970=》比较结果:same2)下面两个时间进行比较:Thu Jan 01 08:00:00 CST 1970Fri Jan 01 08:00:00 CST 2016转载 2017-08-21 10:36:39 · 7065 阅读 · 0 评论 -
Java判断两个时间是不是同一天
1**Java判断两个时间是不是同一天** 使用DateUtils.isSameDay函数判断两个date是否处于同一天。boolean org.apache.commons.lang.time.DateUtils.isSameDay(java.util.Date d1, java.util.Date d2);11示例:(PS:判断两个时间是否处于同一天,如果处于同一天,则处理相应转载 2017-08-21 10:36:59 · 17597 阅读 · 1 评论 -
Java虚拟机体系结构,你知道吗?
Java的跨平台特性,因为它有针对不同平台的虚拟机。1.2 Java虚拟机Java虚拟机的主要任务是装载class文件并且执行其中的字节码。由下图可以看出,Java虚拟机包含一个类装载器(class loader),它可以从程序和API中装载class文件,Java API中只有程序执行时需要的类才会被装载,字节码由执行引擎来执行。当Java虚拟机由主机操作系统上的转载 2017-08-23 09:23:43 · 475 阅读 · 0 评论 -
用java获取本机IP地址
在网上找了几个用java获取本机IP地址的代码,发现都少都有些不完美,自己整理了一下.突然之间很想把自己的IP地址给获取了,虽然用系统自带命令可以得到,但自己想写一个程序获取一下,到网上搜索了一下java获取本机IP地址的方法,结果居然发现没有一个是可以用的,气的我老人家吐血,这些人闭着眼睛写程序,写完了就往网上发,也不测试一下,害的我以为自己RP问题,老是获取不到正确的IP地址,强烈谴责转载 2017-09-26 11:27:06 · 1102 阅读 · 0 评论 -
JavaAgent 简单例子
JavaAgent 是JDK 1.5 以后引入的,也可以叫做Java代理。JavaAgent 是运行在 main方法之前的拦截器,它内定的方法名叫 premain ,也就是说先执行 premain 方法然后再执行 main 方法。那么如何实现一个 JavaAgent 呢?很简单,只需要增加 premain 方法即可。看下面的代码和代码中的注释说明:package com.shanhy.demo.a...转载 2018-03-15 14:37:46 · 1814 阅读 · 0 评论 -
Java 9 模块化(Modularity)
JDK9的发布一直在推迟,终于在2017年9月21日发布了。下面是JDK9的几个下载地址: JDK9.0.1 Windows-x64下载地址 Oracle Java 官网下载地址 OpenJDK 9官网 OpenJDK JDK9下载从安装的JDK9文件夹下会发现没有jre文件夹了,并且多了一个jmods文件夹,想想为什么? 传统的jar文件是在运行时runtime使用,而 .jmods文件是在开发...转载 2018-04-01 16:00:00 · 1385 阅读 · 0 评论 -
JVM进阶之GC(一)内存分代
前言我们知道,java语言与c++语言最大的不同点就是在垃圾回收的处理上,java有了专门的垃圾自动回收机制,而c++需要手动回收内存垃圾。既然java的垃圾回收这么NB,那今天就来整理JVM的垃圾回收这块内容吧。首先得明确几点目的: 1. 为什么需要了解JVM的垃圾回收,让JVM自己去处理不就好了? 2. 是回收什么东西? 3. 是什么时候回收的? 4. JVM是怎么进行垃圾回收的?JVM内存分...转载 2018-05-23 11:10:26 · 1148 阅读 · 0 评论 -
JVM进阶之GC(二)对象存活判断算法
上一篇简单的说明了对象在JVM中的内存分代策略,此文继续来为GC打基础,说说什么样的对象需要被GC,即对象是否存活判定算法。判定对象存活算法如何判断对象沦为了垃圾也是门技术。引用计数法引用计数法就是给对象加个引用计数器,每有一个地方引用到它时,这个引用计数器就加1。当引用失效的时候,计数器的值就减1,也就是说根据引用计数器的值来判断对象是否存活,若值是0,那么该对象就不再被使用了。 真是如此吗?答...转载 2018-05-23 11:12:02 · 258 阅读 · 0 评论 -
大话分布式系统里涉及到的基本概念
前言最近看了一些蚂蚁金服的面试分享文章,里面多次提到分布式系统涉及的概念,比如分布式事务、接口的幂等性,乐观锁、数据一致性等。笔者一时也说不清楚,后来查询了一些资料,整理下来,以备后用。系统衡量关键指标QPS:单位时间内处理完请求次数。一个系统的qps是100,则代表一秒钟内处理100个请求。TPS:单位时间内处理完事务的次数。在分布式系统中,对应的是...原创 2019-05-09 10:00:58 · 257 阅读 · 0 评论 -
如何在JAVA编程中干掉if/else、switch/case(二)
前言上一篇中介绍了采用表驱动(map)方式和Optional方式取代if...else、switch...case逻辑。本章采用JAVA设计模式之策略模式抽象公共方法,剥离像map这样的紧耦合操作,对扩展开放,只关心自己的handler逻辑即可。策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个...原创 2019-05-06 17:50:42 · 690 阅读 · 0 评论 -
Lombok神器带你飞(简化POJO)
前言遇到残暴的大佬,心里不由得为代码暗暗揪了心,不过撸码残暴起来,也是感觉到了一丝丝的爽~今天为大家介绍一个神器:Lombok。希望各种各样的神器带来便捷的同时也为我们带来更多的Money~本文目标希望阅读完本文的童鞋,可以快速入手项目,让我们一起残暴的撸码!思考一下首先举三个例子:Case 1:属性私有,设置其 get / setpackage com.hl...原创 2019-05-09 18:18:37 · 2840 阅读 · 0 评论 -
如何在JAVA编程中干掉if/else、switch/case(三)
前言前面的文章咱们通过表驱动法、策略模式两种方法替换掉JAVA代码里的if...else和switch...case,今天继续介绍第三种方法:责任链设计模式。在WEB应用中,大名鼎鼎的filter链就是责任链模式的具体实现。在笔者一个实际项目中就用到责任链模式,来看看吧。场景所有移动端app开发,都会面临一个问题:升级!后台在开发升级接口时,会判断很多逻辑,比如版本是否在升级的范...原创 2019-05-24 15:34:39 · 836 阅读 · 0 评论 -
阿里巴巴Java开发手册推荐线程池的创建方式你知道吗?
前言之前在项目中做一些任务型的项目,采用多线程方式,笔者通常用ExecutorService cachedThreadPool=Executors.newFixedThreadPool();方式创建。但是后来看阿里巴巴的JAVA开发手册,上面有个建议:【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线...原创 2019-05-27 12:44:57 · 10768 阅读 · 0 评论 -
JAVA类:我是如何被ClassLoader加载到内存的
前言之前看到阿里的一个面试题,JAVA类的双亲委派加载机制是什么?有什么好处?工作这么久,还不知道一个JAVA类如何被加载到内存并运行起来的有点羞愧。不懂但是会搜索啊,这篇文章就这样诞生了。本文主要总结了JAVA的类加载模型(classLoader),一个类的加载过程。ClassLoaderr定义我们用eclipse或idea编写一个xxx.java文件,...原创 2019-05-23 11:38:56 · 3740 阅读 · 0 评论 -
Java字节码1-Agent简单上手
一、概述Java Agent是从JDK1.5及以后引入的,其作用相当于你的main函数之前的一个拦截器,即在执行main函数前,先执行Agent中的代码。Agent的代码与你的main方法在同一个JVM中运行,并被同一个类加载器所加载,被同一的安全策略 和上下文所管理。二、简单上手写一个Agent1、编写一个Java类,并包含如下两个方法中的任一个:public static voi...转载 2019-05-28 16:49:28 · 271 阅读 · 0 评论 -
Java字节码2-instrument初体验
一、概述在上一节中Java字节码1-Agent简单上手中,我们了解了通过一个Agent可以在main方法前执行。本节中,我们将介绍java.lang.instrument,通过instrument可以实现一个Agent来修改类的字节码。下面我们会借助javassist实现一个简单的性能检测工具。目的是检测函数的调用耗时,这里仅仅抛砖引玉,instrument提供的更松耦合的AOP不止于此。...转载 2019-05-28 16:50:43 · 338 阅读 · 0 评论 -
Java字节码3-使用ByteBuddy实现一个Java-Agent
一、概述在前面两节中,我们实现了Agent,但是其无论在使用方式和功能上面都有一定的局限性。本文我们借助字节码工具ByteBuddy,写出高级的Agent。ByteBuddy不仅仅是为了生成Java-Agent,它提供的API甚至可以改变重写一个Java类,本文我们使用其API实现和第二节一样的功能,给目标类中的函数统计其调用耗时。二、实现1、修改pom.xml本节和上节的不同点,主...转载 2019-05-28 16:51:57 · 951 阅读 · 0 评论 -
如何在JAVA编程中干掉if/else、switch/case(一)
前言if...else在每一种语言中都存在,但是代码中如果存在大量的if...else语句,就会造成程序的可读性变差,可维护性变差,进而危害整个系统。同样switch...case也会让代码变得冗余,我们称这样的代码有坏代码的味道,为了优化掉系统中的if...else和switch...case,猫叔做了一个系列,研究可替代方案。这一篇我们重点讲解使用java8中的optional和lambd...原创 2019-05-06 14:37:33 · 2019 阅读 · 0 评论 -
理解、学习与使用 JAVA 中的 OPTIONAL
从 Java 8 引入的一个很有趣的特性是Optional 类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但...转载 2019-05-05 17:47:31 · 148 阅读 · 0 评论 -
JVM进阶之GC(三)垃圾回收算法
上篇我们讨论了怎么判断对象是否存活,判了“死刑”的对象就会在垃圾回收中被回收掉。那么本文将说说JVM是如何回收垃圾的。垃圾回收算法标记-清除算法算法的过程就如同算法的名字,分为标记和清除两个阶段:首先标记出所有要回收的对象,然后对标记的对象统一清除。算法很简单,再看下逻辑图: 内存空间经过标记清除算法回收的过程一目了然,从图中也能看出这种算法的不足,即标记清除后会产生大量的不连续的内存碎片,如果...转载 2018-05-23 11:13:04 · 427 阅读 · 0 评论 -
JVM进阶之GC(四)垃圾收集器
上一篇讲了下垃圾回收算法,今天就来说说垃圾回收算法的具体实现吧–垃圾收集器(本文讨论的是JDK1.7版本的HotSpot虚拟机)。垃圾收集器HotSpot虚拟机提供的收集器如下图: 新生代的垃圾收集器有:Serial、ParNew、Parallel Scavenge; 老年代的垃圾收集器有:CMS、Serial Old、Parallel Old G1收集器因运用的还不是很广泛,不予讨论,有兴趣的...转载 2018-05-23 11:14:59 · 901 阅读 · 0 评论 -
JVM进阶之GC(五)对象的内存分配和回收策略
简单回顾下JVM内存结构和垃圾回收器。JVM内存结构JVM内存主要由新生代、老年代、永久代构成。新生代(Young Generation):大多数对象在新生代中被创建,其中很多对象的生命周期很短。每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。新生代内又分三个区:一个Eden区,两个Survivor区(一般而言),大部分对象在E...转载 2018-05-24 09:22:38 · 528 阅读 · 0 评论 -
通过jstack日志分析和问题排查
前段事件公司出现了一个严重故障(调用dubbo服务一直处于超时,整个服务系统发生雪崩,系统彻底访问不了),一开始怎么都找不到问题的根源,日志的表现形式是dubbo线程池用完了,那么具体是什么导致的没有找到,后然通过jstack日志分析才找到问题的根源,根源就是系统日志代码写有问题。通过这个故障我们来了解下如何通过jstack日志分析线上问题。首先了解下jstack简介jstack用于生成java虚...转载 2018-05-24 09:22:29 · 1484 阅读 · 0 评论