Arthas 是Alibaba开源的一款Java诊断神奇,我今天在泡论坛的时候无意中看到,大家对这款产品评价很高,我也下载试用了一下,使用很简单,就是一个Springboot JAR包,支持JDK1.6+,需要在目标机器上启动JAR,但也支持远程监控,就类似于jconsole ,需要在被监控的目标机器上安装Agent,我还没有测试。
Arthas提供了命令交互式的Web访问界面,通过help可以查看所有供使用的命令,比如:thread、jvm、dump、session等几十个。
我觉得Arthas最大的优势是实时jvm监控,比如 可以对某个类的某个方法监控运行情况,jvm整体运行情况监控等,离线dump分析工具太多,其中Memory Analyzer就很强大。Arthas不占优势。#程序员# #职场达人炼成记#
有很多初学者听别人介绍过Java,知道Java的JDK有很多版本,而且知道版本不同,Java所具有的功能也不尽相同。所以就有小白来问了,我们学习Java到底该选择哪个版本呢?版本是越新越好吗?
所以今天壹哥就给大家说说Java的JDK版本问题。
首先,Java的版本号也是指JDK的版本号。在Java语言的发展过程中,有很多不同的表述方式,有时候会给初学者造成一些误解。但请你记住,所谓的Java版本,就是指JDK的版本,两者是一回事!
我们来看看Java版本的演变历史:
1996年1月,Sun公司发布了Java的第一个开发工具包JDK 1.0;
1998年12月,推出 JDK1.2,更名为Java2(Java2就是Java第二代,之所以改成Java2,就是想让外界感觉的Java突飞猛进,已经不是刚诞生时的初级版本,一下子进入到了新二代的意思),自此Java细化为J2SE、J2EE、J2ME;
2000年5月,推出J2SE1.3;
2002年2月,推出J2SE1.4;
2004年9月,推出1.5版本,更名为JavaSE5.0,加入了很多新特性,改动很大;
2006年4月,推出JavaSE6.0;
2009年,甲骨文公司宣布74亿美元收购Sun,取得Java的版权;
2011年7月,甲骨文推出JavaSE7.0的推出;
2014年3月,甲骨文公司发布了JavaSE8.0正式版 (目前最主流版本);
2018年2月26日开始,JavaEE改名为Jakarta EE;
2020年9月15日,JDK 15正式推出;
2021年3月,推出JDK 16;
2022年3月,推出JDK 19;
2023年......
现在Oracle公司把JDK分成了两种维护情况,即短期支持版本和长期支持版本。对于短期支持版本(non-LTS)而言,Oracle只会提供6个月的支持维护;而对于长期支持版本(LTS),则提供8年的支持维护。根据这一规划,Oracle每隔6个月,就会发布一个大版本,每个季度发布一个中间特性版本。并且承诺新的JDK发布周期会严格遵循时间节点,将于每年的3月份和9月份发布,中间不会跳票。
所以现在正常情况下,每隔6个月就会有一个短期维护版本(non-LTS)发布出来,比如JDK 9、10、12、13、14、15、16、19;然后每隔3年,就会发布一款可以得到8年长期支持维护的JDK版本,比如JDK 8、11、17。
需要记住几点:
1998年至2004年,Java还被称为Java2;
2009年,Sun被甲骨文(Oracle公司)收购,Java的版权从此属于甲骨文;
1.5版本后更名为JavaSE 5.0,所以以下几个版本有两种描述方式:JavaSE 5.0(1.5.0)JavaSE 6.0(1.6.0)JavaSE 7.0(1.7.0)JavaSE 8.0(1.8.0)JavaSE 9.0之后开始收费,不再沿用1.9.0的说法;截止到2022年4月,目前最高版本是JDK 19。
别被忽悠了,学习Java时JDK版本不是越高越好
JDK版本有这么多,作为小白,你到底该选择哪个版本的JDK来学习呢?直接学习JDK 17还是18?或者学习刚发布的JDK 19?壹哥告诉你,别傻了,谁会去基于最新的JDK来使用Java啊!
每一个JDK版本推出时,都存在着很多的未知的bug,所以企业在开发时,都会选择最稳定的版本!而现在主流的企业级应用都是基于JDK 8.0正式版!并且JDK 8.0及之前版本都是免费的,而JDK 9.0及以后的版本开始收费(针对企业收费,非个人),所以当前公司考虑到稳定性和费用,都在使用JDK 8.0或者是开源版本的JDK,这才是主流!不知道你们公司在使用哪个版本呢?
当然在理论上,如果有一天,你们公司非要用花钱的JDK版本,那就买JavaSE 11吧,因为目前在收费版本中JDK 11是比较稳定的。但事实上,绝大多数企业都在使用开源免费的正式版JDK 8.0,所以我们只要掌握JDK 8.0就完全可以满足企业需求了!
JDK的官方下载地址是:网页链接。
目前官方提供下载的版本有15、11、8以及8以下的版本,但8.0以下的版本你就不要考虑啦!
有些机构宣称他们的课程内容里会讲JDK 12、JDK 10、JDK 9等版本,不过是哗众取宠,这些版本官方都停止下载了,你讲了学了有啥用?所以如果你想学习Java,千万要擦亮自己的眼睛,希望壹哥的这篇文章,可以让各位知道在学习Java时该选择哪个版本的JDK。
各位小伙伴,你们公司在用哪个版本的JDK呢?你觉得要不要去学哪些高本版的JDK呢?
快被java搞晕了,从来没见过如此混乱的程序版本,java8和jdk1.8傻傻分不清楚,结果发现他俩是一个东西,wtf?什么鬼。还有搜索新版出来17.0?那么和1.8是什么关系。然后你会发现,搜索下载,有时候你会去到java.com,有时候你会被带去oracle.com,然后他们又告诉你可以在azul.com下载jdk,那么azul的版本似乎又和oracle的版本一致。打开taro,他说你要编译,要使用jdk1.8,不要使用1.9,因为暂不支持1.8以上版本,那么17.0和1.9哪个高呢?我是鱼歌,在深圳创业的程序员,这混乱的版本是怎么形成的呢,果然是防止内卷的高招,新手想入行,光版本号就足以让你却步。
synchronized锁的四大特性
从今天开始,我会说下java中,synchronized锁的底层实现原理,但是这个要细讲起来,涉及到的东西非常多了,一篇肯定是讲不完了,我们我打算分几篇来讲,本次先讲下synchronized锁的四大特性:即 悲观锁、不可中断锁、可重入锁、非公平锁
一、悲观锁
synchronized是悲观锁,即在获取资源时,就要先获取锁,只要当获取到锁以后,才可以对资源操作。
但是悲观锁的效率是比较差的,所以在JDK1.6以后,引入了偏向锁和轻量级锁,虽然从含义上来讲,偏向锁和轻量级锁还是属于悲观锁,但是他们获取锁的方式,是通过乐观锁,即CAS来实现的,这样才锁竞争不大的时候,可以提升synchronized的效率,至于CAS是怎样获取锁的,我们后面在讲到synchronized的底层实现原理的时候会讲到。
二、不可中断锁
synchronized是不可中断锁,这意味着,一旦某个线程获取某个资源的锁时,这个资源被其他线程占有了,那么当前线程就要一直等待下去,直到其它线程锁被释放,在这个过程中,锁是不能被中断的。如果一个线程等待锁的时间太长了,想中断它去做其他事情,这个是做不到的。
这个和Lock锁是有区别的,Lock锁是可中断锁,在等待的过程中,随时可以被中断。因为synchronized锁的实现,是基于JVM层面的,它无法实现自动中断。但是Lock锁是基于JAVA的API层面的,它可以通过代码的方式实现中断。
三、可重入锁
在面试中高级的JAVA工程师的时候,我通常会问到这样一个问题,如图片中的代码所示,他的运行结果是什么?是否会出现死锁?
答案是不会的,因为synchronized是个可重入锁,即当一个线程获取到某个对象的锁以后,在没有释放锁之前,它在访问这个对象的其他的加锁方法或者其他的代码块的时候,是可以直接访问的,不需要在重新获取锁。
之所以设计成可重入锁,就是为了减少死锁的可能,如果设计成不可重入的,还是拿图片中的代码举例,那我在method1方法中调用method2方法的时候,就要等待当前线程释放锁,但是当前线程的method1方法还没执行完,又无法释放锁,这样就会造成死锁。
四、非公平锁
非公平锁的意思是说,获取到锁的顺序,并不是说按照先到先得的顺序来说的,有可能后到的线程,反而先获取到锁,而先到的线程,反而后获取到锁。
那是否有人会有疑问,为什么要这样设计呢?如果是这样的话,岂不是可能会有线程,可能很长时间都获取不到锁?
其实这样设计的目的,也是为了提升synchronized的性能。
非公平锁,其实也并不是说,所有时候,所有的线程都是非公平的,在大多数时候,还是可以保证公平性的。
举例来说,有10个线程来获取某一资源的锁,按照线程到来的顺序,我们分别命名为t1到t10,这时t1线程获取到锁,t2到t10线程都进入被挂起,进入阻塞队列。当t1线程执行完,释放线程后,就会唤醒t2线程,然后t2线程释放后,在唤醒t3线程,这样看起来,是公平的。
但是频繁的对线程做挂起和唤醒,是比较消耗性能的,所以避免频繁的对线程做挂起和唤醒,可以允许后来的线程插队。
还是拿上面的例子来说,假如现在t1线程获取到锁,t2到t10线程在队列中排队,等待被唤醒,这时如果t11线程过来,如果按照公平锁的话,t11线程就会被挂起,并且放到队列的队尾,等待被唤醒。那如果在锁竞争大的时候,就会频繁的做后来的线程做挂起和唤醒,比较消耗性能,这时非公平锁的优势就体现出来了,假如t11线程到来的时候,刚巧t1线程已释放锁,而且t2线程还没有被唤醒,这时t11线程就可以插队,直接获取到锁。减少了对线程挂起和唤醒的次数。
作者介绍:
贠学文,一位具有十年经验java开发经验的大佬,希望可以在头条上结识更多的志同道合的小伙伴!
验证JDK是否装成功
C:Usersadmin>echo %JAVA_HOME%
C:Program FilesJavajdk1.8.0_161
小米Java社招,面试题分享(难度:中等,经验:2年+)
1.HashMap的默认大小、数据结构和扩容实现?
2.ConcurrentHashMap怎么保证线程安全,jdk1.7与1.8的区别?
3.CopyOnWriteList怎么保证线程安全?
4.java Synchronized关键字的作用,实现原理(锁升级、锁粗化、锁消除)?
5.volatile关键字的作用,实现原理?
6.数据库MVCC,事务的ACID,每一项是如何保证的?
7.MySQL的索引结构,为什么是B+数而不是B数?
8.单例模式有几种写法?并说明区别
9.tcp握手挥手的过程?
10.cms垃圾回收器跟g1垃圾回收器的区别
11.算法题:先升序后降序的数组排序
12.算法题:求递增数组中相加等于10的元素数对
13.算法题:怎么判断一棵树是不是二叉搜索树
14.算法题:给定数组,求第K大的数字
#程序员##面试##职场#
Java编程入门03.JDK的下载与安装
JDK 16 来了
JDK 16即将在3月16号发布GA版本。本次版本特性列表中我比较关注以下几项:
1)ZGC: Concurrent Thread-Stack Processing
ZGC在JDK 15中已经正式成为生产特性。而其还剩下两个工作要做,1)分代 2)并发线程栈处理。
这个特性就要解决第二个问题。
2)Records
有了它,让人厌烦的lombok可以靠边站了。
3)Elastic Metaspace
这个特性可以将Java类元数据不在使用的内存归还给操作系统。既降低对内存资源的消耗,也简化对应代码的复杂度。
JDK release:
网页链接
上周四同学去某树科技面试20K的Java开发岗位,一面大致有如下八个问题
1、redis的底层数据结构,集群方式,数据持久方式
2、mysql的锁知道吗,执行计划,mvcc
3、beanfactory与factorybean的区别
4、jdk的类加载机制,能否加载一个包名和类名一样的类
5、autowire和resource的区别
6、springbootapplication里面有哪些注解,作用分别是什么
7、springboot如何实现自动装箱
8、rabbitmq消息保证消息不丢失
一面过了,但最后hr回复说要再比较比较,是这些问题不值20k?#程序员# #深圳# @深漂小小熊
现在的开源软件,已经为社会创造了很多财富,它才是真正创造蛋糕的动力来源。
Linux开源内核的出现,让安卓操作系统不仅跟着开源,还以极低的价格让全球用户使用,用户量已经远超苹果。
鸿蒙系统的开源,让国内外(中国、欧洲)的优秀程序员更愿意往物联网技术领域发展,使我们的未来生活更有科技感。
Java jdk的开源,让国内很多互联网公司不仅快速建立自己的服务体系,也建立了自己数据服务体系,同时也养活了很多Java程序员。
最后,做开源软件没什么不好,反而能够产生更多社会财富,这个社会实际上也更需要有更多制作蛋糕的人,开源软件能够成为你一生的事业和发展动力。
#头条创作挑战赛#
最近听说 Oracle 开始查 Oracle JDK 许可问题了, 搞得有些企业很紧张.
按理说, 有开源免费的 OpenJDK 当道, Oracle JDK 这种收费玩意儿应该早就凉了才对.
不是很了解 Java 江湖的恩怨, 有没有大佬能解读一下?
随着微服务和无服务器的兴起,Java处于不利地位,因为JVM似乎太大(内存占用率高)和太慢(启动时间慢)。另外,在基于容器的现代开发中,容器的资源是有限的。因此,人们开始在云原生开发中使用灵活、小型、快速的语言,如Node.js、Golang。
Java社区试图通过引入用GraalVM提供现代版的Java。这是一个JDK发行版,提供AOT编译、多语言编程。此外,它可以直接编译成Native代码,完全适合云原生开发(内存占用少,首次启动时间短)。
长期以来Java的开发一直让人诟病:开发复杂度极高、维护非常困难,难以快速部署及启动
当所有人认为Spring不在前进的时候,Spring推出了微架构实现的两个重要框架:SpringBoot和SpringCloud,这两个与其说是Spring,不如说是Spring的另外一次重生。
那么,Java开发的复杂度为什么是最高的?
在所有的软件行业里面,如果说商用体系,编程语言排在第一位的永远是Java,因为Java的体系丰富,支持度高,安全性也高,但是同时我们所有的开发者也不得不去忍受Java中的以下痛苦:
1、Java里面提供的开发支持都属于原生操作代码,例如:JDBC为例,如果使用Java原生代码会重复编写大量的内容,例如:PreparedStatement操作。
2、Java进行Web项目开发的时候,必须要求按照严格的格式进行Web项目的创建,以及每当修改Web程序的时候又需要Tomcat的重新启动。
3、Java之中虽然提供了所谓的开发标准,但是所有的公司几乎都有可能有自己的开发标准,例如:最初的时代JVM的标准就有三个,而且许多的公司由于版本不同会造成部署的环境不同。
4、Java里面严格要求按照MVC的设计模式,MVC设计模式中强调的是前端跟我们后台业务之间的调用,在整个开发过程里面,我相信写过代码的人都应该知道,后端代码相对简单容易些,而所有的琐碎之处却是在前端上。
5、以Web开发为例,一个良好的JSP程序代码里面不应该包含任何的Scriptlet程序代码,但是要想做到这一步,我们发现非常麻烦,诸如有各种实现标准,例如:JSTL+EL、Spring的Taglib、Struts的Taglib、JSF等。
6、如果现在使用Node.js、Python开发一个控制器程序类可能只需要几行代码,而Java想要开发这样一个程序,我们需要写一堆的代码,而且还要求搞部署。
7、Java后期的发展使用了大量的Maven技术作为开发,那么你会发现使用了Maven之后的Java开发处理之中并没有逃离掉传统Web开发的身影,所有的项目依然需要打包为war文件,然后上传到系统之中。使用Maven还有一个最大的痛:如果是开发框架,那一堆的Maven配置依赖库足够让初学者奔溃。
8、Restful技术已经开始在行业之中广为流传,而Java要想实现Restful架构的开发,也是相当麻烦的。
9、现在行业之中,Spring已经作为了绝对的主流Java架构,但是如果想要在Spring之中整合RabbitMQ、Kafka、ActiveMQ、MySQL、Druid、Redis、Shiro等,需要编写一堆的xml配置文件,这些xml配置文件也足以让初学者崩溃,让初学者抓不到门路。
所以,在这样一个大的历史背景下,很多人开始寻求更加简便的开发,而遗憾的是这种简便的开发没有被JDK、JavaEE所支持,因为这些只是平台,平台能够提供的只是原始的技术支持。
这一时刻,终于由于Spring框架的升级而得到了新生,Springboot的出现,改变了所有Java开发的困境,Springboot的最终奉行的宗旨:废除掉所有复杂的开发,废除掉所有配置文件,让开发变得更简单纯粹。(但我觉得不太可能),核心:零配置(这就是个梦)
最近系统进入护网阶段,jdk1.8(1.8.0_262)扫出了漏洞,使用jdk1.8最新版本(1.8.0_333)进行了更新。用户突然反映系统出现故障了。啥也没动啊,怎么就故障了!眼前跑过十万个为什么!
查后台日志发现后台调用https地址竟然报错了。经过一番查找,替换为原jdk后问题消除。
jre/lib/security 下面有个java.security。找到对应的SSLv3,删除掉,重启项目就好了。有的版本还需要需要删除TLS。层层查找代码,发现代码中使用的ssl是TLSv1。关键是TLSv1!!
jdk都已经17了,新功能你知道多少?JAVA大多数用的8,有些已经升级到11,17仍然处于被观望中。主要是没空,框架的更新都来不及学,谁管jdk去。jdk更新太快学习起来太累。再者,项目搭起来了,能不动尽量别更新,谁知道会不会隐藏bug。新语法除了lambda,Function和steam常用,其他的我也没用过。其他的你出去面试有可能被问到,平时顶多能见到有人用下lambda和 stream操作下list。.NET 这些功能都有了,.net core 上一波!