JDK

Java 14 发布了,不使用"class"也能定义类了?还顺手要干掉Lombok!

Deadly 提交于 2020-12-05 00:57:47
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载。在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 早在2019年2月份,Java 语言架构师 Brian Goetz,曾经写过一篇文章( http://cr.openjdk.java.net/~briangoetz/amber/datum.html ),详尽的说明了并吐槽了Java语言,他和很多程序员一样抱怨“Java太啰嗦”或有太多的“繁文缛节”,他提到:开发人员想要创建 纯数据载体 类(plain data carriers)通常都必须编写大量低价值、重复的、容易出错的代码。如:构造函数、getter/setter、equals()、hashCode()以及toString()等。 以至于很多人选择使用IDE的功能来自动生成这些代码。还有一些开发会选择使用一些第三方类库,如Lombok等来生成这些方法,从而会导致了令人吃惊的表现(surprising behavior)和糟糕的可调试性(poor debuggability)。 那么,Brian Goetz 大神提到的纯数据载体到底指的是什么呢。他举了一个简单的例子: final class Point { public final int x; public final int

抢占云原生市场,阿里开源服务发现组件 Nacos快速入门

不羁岁月 提交于 2020-12-04 23:59:32
最近几年随着云计算和微服务不断的发展,各大云厂商也都看好了微服务解决方案这个市场,纷纷推出了自己针对微服务上云架构的解决方案,并且诞生了云原生,Cloud Native的概念。 云原生是一种专门针对云上应用而设计的方法,用于构建和部署应用,以充分发挥云计算的优势。 云原生应用的特点是可以实现快速和频繁的构建、发布、部署,可以方便的满足在扩展性,可用性,可移植性等方面的要求,并提供更好的经济性。 针对云原生,云厂商也纷纷提出了自己的解决方案,阿里巴巴开源的Nacos就是其中之一,Nacos同时集成到了Spring Cloud Alibaba中,作为一个整体的解决方案。 Nacos解决两个核心问题:动态配置管理,服务注册发现。 一、Nacos支持功能 Nacos支持以下的功能,包括服务发现,配置管理,元数据管理,地址服务器,支持云原生,支持Docker和K8s等。 服务发现 服务注册与发现 健康检查:支持服务端探测、客户端心跳 路由策略:支持权重、保护阈值、就近访问 配置管理 配置管理:支持发布、修改、查询、监听配置 灰度配置:支持灰度发布 元数据管理 对接第三方CMDB 地址服务器 支持Nacos寻址 云原生支持 对接Istio 对接ConfigMap 多客户端支持 支持多种客户端,包括Java客户端、Go客户端、Node.js客户端、C#客户端 支持Docker和K8s

BIO、NIO、AIO 区别和应用场景

你说的曾经没有我的故事 提交于 2020-12-04 19:21:33
点击上方 “ java1234 ”, 选择“ 标星公众号 ” 优质文章,第一时间送达 66套java从入门到精通实战课程分享 简单回顾 对于IO我们应该非常熟悉了,IO不仅仅针对文件的操作,网络编程socket的通信,就是IO操作。 输入、输出流(InputStream、OutputStream)用于读取或写入字节,如操作图片、视频等。 Reader和Writer 则用于操作字符,增加了字符编码功能。本质上计算机操作都是字节,不管是网络或者文件,Reader和Writer等于构建了应用逻辑和原始数据的另一层通道。 BufferedOutputStream、BufferedInputStream等带有缓冲区的实现,可以避免频繁的磁盘操作,通过设计缓冲区将批量数据进行一次操作。 NIO 能解决什么问题? 为什么要有NIO,NIO是什么? 首先看一下BIO,如果有一台服务器,能承受简单的客户端请求,那么使用io和net中的同步、阻塞式API应该是可以实现了。但是为了一个用户的请求而单独启动一个线程,开销应该不小吧。java语言对线程的实现是比较重量的,启动或销毁线程,都会有明显开销,每个线程都有单独的线程棧占用明显的内存。引入线程池,就能很大程度的避免不必要的开销。 这种情况适合连接数并不多,只有最多几百个连接的普通应用,能比较好的进行工作,但如果连接数量剧增

B站疯传,堪称最强,一整套JVM课程,白拿不谢!

北慕城南 提交于 2020-12-04 13:54:31
挑战一下!这3 道 JVM 面试题你能快速答对几道? 1、当 Java 程序性能达不到既定目标,并对于程序优化技巧已用尽,应如何通过 JVM 知识对GC 优化? 2、对于众多参数各自优点增加了调优的难度,GC 优化过程应如何结合现有业务进行适合的参数优化呢? 3、JVM 数据运行区,哪些会造成 OOM 的情况? ...... 画外音:你看看,怎么回才是面试官想要听的? JVM 在性能调优中使用非常广泛,无论什么级别的 Java 从业者,JVM 是进阶时必须迈的坎。如果不懂 JVM 的话,薪酬会非常吃亏。除了面试,学习 JVM 有利于更深入地理解 Java 这门语言,吃透 JVM,为未来排查线上问题打下坚实的基础。 今天给大家推荐一个 【奈学教育】 免费的课程《JVM 从入门, 深入到源码解读》 ,让你轻松玩转JVM底层与调优,从容应对面试官的灵魂拷问. 扫码,添加课程小助手 免费领取JVM 课程 名额有限,先到先得 课程目录 JVM基础必备篇 1、从官网认知JDK/JRE/JVM的体系结构 2、源码到类文件,一起从官网剖析class文件的格式与定义 3、类文件到虚拟机,即类加载和初始化过程-装载/链接/初始化 4、剖析Classloader双亲委派机制 5、全局认知Runtime Data Areas,五大运行时内存区域 6、结合字节码指令理解Java虚拟机栈和栈帧 7、栈/方法区

基于jmeter+perfmon的稳定性测试记录

社会主义新天地 提交于 2020-12-04 10:56:00
1. 引子 最近承接了项目中一些性能测试的任务,因此决定记录一下,将测试的过程和一些心得收录下来。 说起来性能测试算是软件测试行业内,有些特殊的部分。这部分的测试活动,与传统的测试任务差别是比较大的,也比较依赖工具,一定程度上性能测试被认为是测试中的“高阶”部分,跟自动化测试、安全测试等并称。 2. 任务情况 2.1 任务总览 本次平台稳定性测试的目的在于:在服务器压力处于较饱和(达到80%系统最大TPS)压力之下,在较长时间(>8小时)之内观测服务器稳定性问题,以及资源使用情况和异常。 2.2 接口情况 本次测试不调用上下游接口,只压测创建订单接口。订单表存量数据19万,接口请求方式为PUT。 2.3 服务器配置 网关服务器 16核CPU、内存16G 应用服务器 16核CPU、内存16G 3. 测试过程 3.1 测试机及工具选择 由于在前序的测试过程中,可以确定本机jmeter运行可以驱动200线程数,达到接近系统极限吞吐量的情况。 因此本次稳定性测试决定延续使用本地PC使用jmeter仍以200线程进行测试,测试重点在于较长时间段内的稳定情况。 涉及到服务器资源的监控,将决定使用Jmeter插件perfmon配合serverAgent进行采集,以nmon作为实时监控工具。 具体工具选择如下: 核心工具 版本 备注 Jmeter 3.3 提供并发请求能力 PerfMon

Java线程池

点点圈 提交于 2020-12-04 10:17:58
  为什么需要线程池?在java中,使用线程来执行异步任务时,线程的创建和销毁需要一定的开销,如果我们为每一个任务创建一个新的线程来执行的话,那么这些线程的创建与销毁将消耗大量的计算资源。同时为每一个任务创建一个新线程来执行,这样的方式可能会使处于高负荷状态的应用最终崩溃。所以线程池的出现为解决这个问题带来曙光。我们将在线程池中创建若干条线程,当有任务需要执行时就从该线程池中获取一条线程来执行任务,如果一时间任务过多,超出线程池的线程数量,那么后面的线程任务就进入一个等待队列进行等待,直到线程池有线程处于空闲时才从等待队列获取要执行的任务进行处理,这样就大大减少了线程创建和销毁的开销,也会缓解我们的应用处于超负荷时的情况。 一、Executor   线程池顶级接口。定义方法,void execute(Runnable)。方法是用于处理任务的一个服务方法。调用者提供Runnable接口的实现,线程池通过线程执行这个Runnable。服务方法无返回值的。是Runnable接口中的run方法无返回值。   常用方法 - void execute(Runnable)   作用是: 启动线程任务的。   在java线程启动时会创建一个本地操作系统线程,当该java线程终止时,这个操作系统线程也会被回收。而每一个java线程都会被一对一映射为本地操作系统的线程

还怕面试官问JVM吗?

给你一囗甜甜゛ 提交于 2020-12-04 08:54:03
请你谈谈你对JVM的理解? JVM类加载器是怎么样的?有几种? 什么是OOM,什么是StackOverFlowError? 怎么分析? JVM常用调优参数有哪写? GC有几种算法?分别是怎么执行的? 你知道JProfiler吗,怎么分析Dump文件? 第一次看到这些真真实实的面试题的时候,我~ 这都什么玩意??????? 经过一段时间的研究!!接下来,我将以大白话从头到尾给大家讲讲 Java虚拟机 !! 1、什么是JVM?在哪? JVM是Java Virtual Machine(Java 虚拟机 )的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 百度的解释云里雾里,对于我们Java程序员,说白了就是: JVM本质上是一个 程序 ,它能识别 .class 字节码文件(里面存放的是我们对 .java 编译后产生的二进制代码),并且能够解析它的指令,最终调用操作系统上的函数,完成我们想要的操作! 关于Java语言的 跨平台性 ,就是因为JVM,我们可以将其想象为一个抽象层,只要这个抽象层JVM正确执行了 .class 文件,就能运行在各种操作系统之上了!这就是 一次编译,多次运行 对于 JVM的位置 : JVM是运行在操作系统之上的,它与硬件没有直接的交互 2、JVM、JRE、JDK 的关系 JDK(Java

JAVA8 之 Stream 流(四)

大兔子大兔子 提交于 2020-12-04 06:17:29
如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践。 Stream 流的定义 Stream 是支持串行和并行操作的一系列元素。流操作会被组合到流管道中(Pipeline)中,一个流管道必须包含一个源(Source),这个源可以是一个数组(Array),集合(Collection)或者 I/O Channel,会有一个或者多个中间操作,中间操作的意思就是流与流的操作,流还会包含一个中止操作,这个中止操作会生成一个结果。 Stream 流的作用 以函数式编程的方式更好的操作 集合 。完全依赖于函数式接口。在 java.util.stream 包中。 流的创建方式 使用数组的方式 //第一种方式,使用 Stream.of 方法 Stream stream1 = Stream.of("hello","world","hello world"); String[] myArray = new String[]{"hello","world","hello world"}; Stream stream2 = Stream.of(myArray); //第二种方式,使用 Arrays.stream() Stream stream3 = Arrays.stream(myArray); 使用集合的方式 Stream 的作用是以函数式编程的方式操作集合

Linux JDK安装及环境变量配置

余生颓废 提交于 2020-12-04 02:32:37
一.检查和下载JDK 1.检查系统是否已经安装了JDK,如果安装了,先卸载,具体方法请看: http://my.oschina.net/liting/blog/358498 2.从官网选择一个对应的版本下载 JDK最新版本下载: http://www.oracle.com/technetwork/java/javase/downloads/index.html 版本选择: http://www.oracle.com/technetwork/java/archive-139210.html 本文以JDK1.8为例,下载地址: wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-i586.rpm 二.安装JDK 1.将下载下来的文件上传到Linux中的一个目录中,如:/usr/java 2.进入/usr/java目录 cd /usr/java 3.给所有用户添加可执行的权限 chmod +x jdk-8u121-linux-i586

如何让 if/else 更优雅?

两盒软妹~` 提交于 2020-12-04 02:20:53
if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码: 是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们无数次 review 别人代码时,都会发现类似的场景,那么我们本文就来详细聊聊,有没有什么方法可以让我们避免来写这么多的 if else 呢? 我们本文提供了 9 种方法来解决掉那些“烦人”的 if else,一起来看吧。 1.使用 return 我们使用 return 去掉多余的 else,实现代码如下。 优化前代码: if (str.equals( "java" )) { // 业务代码 ! true ; } else { return ; } 优化后代码: if (str.equals( "java" )) { return ; } return false ; 这样看起来就会舒服很多,虽然相差只有一行代码,但真正的高手和普通人之间的差距就是从这一行行代码中体现出来的。 「勿以善小而不为,勿以恶小而为之」「千里之堤,溃于蚁穴」 ,说的都是同样的道理。 2.使用 Map 使用 Map 数组,把相关的判断信息,定义为元素信息可以直接避免 if else 判断,实现代码如下。 优化前代码: if (t == 1 ) { type = "name" ; } else if (t == 2