关于jdk8:Java开启JMX远程监控

1. 服务端配置java启动命令减少以下参数即可: -Dcom.sun.management.jmxremote \-Dcom.sun.management.jmxremote.local.only=false \-Djava.rmi.server.hostname=test.xxx.com \-Dcom.sun.management.jmxremote.port=18097 \-Dcom.sun.management.jmxremote.rmi.port=18098 \-Dcom.sun.management.jmxremote.ssl=false \-Dcom.sun.management.jmxremote.authenticate=false \-Xloggc:logs/gc.log \参数阐明:不开启SSL-Dcom.sun.management.jmxremote.ssl=false不开启明码验证-Dcom.sun.management.jmxremote.authenticate=false 2. 客户端配置关上Java VisualVM配置近程连贯连贯留神项:主机填-Djava.rmi.server.hostname配置的主机端口填-Dcom.sun.management.jmxremote.port配置的端口配置-Dcom.sun.management.jmxremote.rmi.port不能省略

May 24, 2023 · 1 min · jiezi

关于jdk8:Jenkins-添加-Slave-Agent-节点时报类文件不匹配错误

在搭建好的 Jenkins Server 的控制面板上增加 Salve Agent 节点的时候产生了上面的谬误 Checking Java version in the PATHopenjdk version "1.8.0_345"OpenJDK Runtime Environment (build 1.8.0_345-b01)OpenJDK 64-Bit Server VM (build 25.345-b01, mixed mode)[11/19/22 04:35:32] [SSH] Checking java version of /home/shutang/jenkins/jdk/bin/javaCouldn't figure out the Java version of /home/shutang/jenkins/jdk/bin/javabash: /home/shutang/jenkins/jdk/bin/java: No such file or directory[11/19/22 04:35:32] [SSH] Checking java version of java[11/19/22 04:35:32] [SSH] java -version returned 1.8.0_345.[11/19/22 04:35:32] [SSH] Starting sftp client.[11/19/22 04:35:33] [SSH] Copying latest remoting.jar...Source agent hash is 8D575C4C8219E6AB2039295EC545C6C3. Installed agent hash is 8D575C4C8219E6AB2039295EC545C6C3Verified agent jar. No update is necessary.Expanded the channel window size to 4MB[11/19/22 04:35:33] [SSH] Starting agent process: cd "/home/shutang/jenkins" && java -jar remoting.jar -workDir /home/shutang/jenkins -jar-cache /home/shutang/jenkins/remoting/jarCacheError: A JNI error has occurred, please check your installation and try againException in thread "main" java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:473) at java.net.URLClassLoader.access$100(URLClassLoader.java:74) at java.net.URLClassLoader$1.run(URLClassLoader.java:369) at java.net.URLClassLoader$1.run(URLClassLoader.java:363) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:362) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:352) at java.lang.ClassLoader.loadClass(ClassLoader.java:351 at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:601)Agent JVM has terminated. Exit code=1[11/19/22 04:35:33] Launch failed - cleaning up connection[11/19/22 04:35:33] [SSH] Connection closed.Searching for www.datang001.com in /var/jenkins_home/.ssh/known_hostsSearching for www.datang001.com:22 in /var/jenkins_home/.ssh/known_hosts[11/19/22 04:35:44] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.Key exchange was not finished, connection is closed.SSH Connection failed with IOException: "Key exchange was not finished, connection is closed.", retrying in 15 seconds. There are 3 more retries left.Searching for www.datang001.com in /var/jenkins_home/.ssh/known_hostsSearching for www.datang001.com:22 in /var/jenkins_home/.ssh/known_hosts[11/19/22 04:35:59] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.Key exchange was not finished, connection is closed.SSH Connection failed with IOException: "Key exchange was not finished, connection is closed.", retrying in 15 seconds. There are 2 more retries left.Searching for www.datang001.com in /var/jenkins_home/.ssh/known_hostsSearching for www.datang001.com:22 in /var/jenkins_home/.ssh/known_hosts[11/19/22 04:36:14] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.Key exchange was not finished, connection is closed.SSH Connection failed with IOException: "Key exchange was not finished, connection is closed.", retrying in 15 seconds. There are 1 more retries left.Searching for www.datang001.com in /var/jenkins_home/.ssh/known_hostsSearching for www.datang001.com:22 in /var/jenkins_home/.ssh/known_hosts[11/19/22 04:36:29] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.Key exchange was not finished, connection is closed.ERROR: Connection is not established!java.lang.IllegalStateException: Connection is not established! at com.trilead.ssh2.Connection.getRemainingAuthMethods(Connection.java:988) at com.cloudbees.jenkins.plugins.sshcredentials.impl.TrileadSSHPasswordAuthenticator.canAuthenticate(TrileadSSHPasswordAuthenticator.java:83) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195) at java.base/java.util.Spliterators$IteratorSpliterator.tryAdvance(Spliterators.java:1812) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:127) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:502) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:488) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:150) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:543) at com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:222) at com.cloudbees.jenkins.plugins.sshcredentials.SSHAuthenticator.newInstance(SSHAuthenticator.java:173) at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:881) at hudson.plugins.sshslaves.SSHLauncher.lambda$launch$0(SSHLauncher.java:434) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829)通过查看 Jenkins 官网提供的信息如下 ...

November 19, 2022 · 3 min · jiezi

关于jdk8:windows环境安装JDK18

1.1 筹备工作: 下载安装包 JDK下载地址 1.2 抉择JDK版本: 这里抉择的是JDK1.8 (留神协定变动: Oracle JDK到底从哪个版本开始免费?) 1.3 抉择版本: 这里抉择windows64位,点击下载 2.1 关上方才下载下来的exe文件(留神下装置门路),点击下一步,直到装置完结. 2.2 我的电脑(右键--->抉择属性) 2.3 点击高级零碎设置 2.4 点击环境变量 2.5 在零碎环境,点击新建 至此装置JDK装置胜利

August 5, 2021 · 1 min · jiezi

关于jdk8:docker搭建java-jdk环境

下载centos镜像docker pull centos:7.9.2009以jdk8为例来搭建环境1.获取jdk8安装包,在下载页面找到与零碎对应的安装包,我这里抉择64位的安装包。 https://www.oracle.com/java/t... 2.创立Dockerfile在/usr/local目录下创立jdk目录,把jdk-8u301-linux-x64.tar.gz复制到/usr/local/jdk目录下,而后创立Dockerfile mkdir /usr/local/jdkcd /usr/local/jdkcp /usr/local/mylib/jdk-8u301-linux-x64.tar.gz ./touch Dockerfilevim Dockerfile编辑Dockerfile文件FROM centos:7.9.2009RUN mkdir /usr/local/jdkWORKDIR /usr/local/jdkADD jdk-8u301-linux-x64.tar.gz /usr/local/jdkENV JAVA_HOME /usr/local/jdk/jdk1.8.0_301ENV JRE_HOME /usr/local/jdk/jdk1.8.0_301/jreENV PATH $JAVA_HOME/bin:$PATH应用Dockerfile构建jdk1.8镜像docker build -t jdk1.8 . 当docker build命令执行实现之后,对应的jdk8的镜像曾经打包实现。 验证查看零碎所有docker镜像文件 docker images 1.创立容器 docker run -di --name="jdk1.8" jdk1.82.进入容器 docker exec -it jdk1.8 /bin/bash3.查看jdk版本 java -version 4.退出容器,验证java javac命令

July 26, 2021 · 1 min · jiezi

关于jdk8:linux-下安装-jdk

下载安装包上官网下载对应linux环境的安装包 上传安装包进入 /usr/local,新建一个放jdk的目录 cd /usr/localmkdir java ##目录名称 将下载好的jdk压缩包上传到下面新建的目录 解压安装包进入对应文件目录,应用 tar -zxvf jdk-8u291-linux-x64.tar.gz 解压。 x : 从 tar 包中把文件提取进去z : 示意 tar 包是被 gzip 压缩过的,所以解压时须要用 gunzip 解压v : 显示详细信息f xxx.tar.gz : 指定被解决的文件是 xxx.tar.gz 配置环境变量编辑 /etc/profile 文件,在开端加上以下配置 # 设置环境变量export JAVA_HOME=/usr/local/java/jdk1.8.0_291 ## 这里要留神目录要换成本人解压的jdk 目录export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 接着输出 source /etc/profile 使环境变量配置马上失效。 验证别离输出 java -version 和 javac 查看装置状况 至此,linux 下的 jdk 环境装置胜利。 技术交换 QQ 群:816425449

July 5, 2021 · 1 min · jiezi

关于jdk8:JAVA8之妙用Optional解决判断Null为空的问题

引言在文章的结尾,先说下NPE问题,NPE问题就是,咱们在开发中常常碰到的NullPointerException.假如咱们有两个类,他们的UML类图如下图所示在这种状况下,有如下代码user.getAddress().getProvince();这种写法,在user为null时,是有可能报NullPointerException异样的。为了解决这个问题,于是采纳上面的写法 if(user!=null){ Address address = user.getAddress(); if(address!=null){ String province = address.getProvince(); }}这种写法是比拟俊俏的,为了防止上述俊俏的写法,让俊俏的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的注释局部进行具体阐明 API介绍先介绍一下API,与其余文章不同的是,本文采取类比的形式来讲,同时联合源码。而不像其余文章一样,一个个API列举进去,让人找不到重点。 1、Optional(T value),empty(),of(T value),ofNullable(T value) 这四个函数之间具备相关性,因而放在一组进行记忆。 先阐明一下,Optional(T value),即构造函数,它是private权限的,不能由内部调用的。其余三个函数是public权限,供咱们所调用。那么,Optional的实质,就是外部贮存了一个实在的值,在结构的时候,就直接判断其值是否为空。好吧,这么说还是比拟形象。间接上Optional(T value)构造函数的源码,如下图所示那么,of(T value)的源码如下 public static <T> Optional<T> of(T value) { return new Optional<>(value);}也就是说of(T value)函数外部调用了构造函数。依据构造函数的源码咱们能够得出两个论断: 通过of(T value)函数所结构出的Optional对象,当Value值为空时,仍然会报NullPointerException。 通过of(T value)函数所结构出的Optional对象,当Value值不为空时,能失常结构Optional对象。 除此之外呢,Optional类外部还保护一个value为null的对象,大略就是长上面这样的 public final class Optional<T> { //省略.... private static final Optional<?> EMPTY = new Optional<>(); private Optional() { this.value = null; } //省略... public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }}那么,empty()的作用就是返回EMPTY对象。 ...

May 24, 2021 · 3 min · jiezi

关于jdk8:JAVA8之妙用Optional解决判断Null为空的问题

引言在文章的结尾,先说下NPE问题,NPE问题就是,咱们在开发中常常碰到的NullPointerException.假如咱们有两个类,他们的UML类图如下图所示在这种状况下,有如下代码user.getAddress().getProvince();这种写法,在user为null时,是有可能报NullPointerException异样的。为了解决这个问题,于是采纳上面的写法 if(user!=null){ Address address = user.getAddress(); if(address!=null){ String province = address.getProvince(); }}这种写法是比拟俊俏的,为了防止上述俊俏的写法,让俊俏的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的注释局部进行具体阐明API介绍先介绍一下API,与其余文章不同的是,本文采取类比的形式来讲,同时联合源码。而不像其余文章一样,一个个API列举进去,让人找不到重点。 1、Optional(T value),empty(),of(T value),ofNullable(T value) 这四个函数之间具备相关性,因而放在一组进行记忆。 先阐明一下,Optional(T value),即构造函数,它是private权限的,不能由内部调用的。其余三个函数是public权限,供咱们所调用。那么,Optional的实质,就是外部贮存了一个实在的值,在结构的时候,就直接判断其值是否为空。好吧,这么说还是比拟形象。间接上Optional(T value)构造函数的源码,如下图所示那么,of(T value)的源码如下 public static <T> Optional<T> of(T value) { return new Optional<>(value);}也就是说of(T value)函数外部调用了构造函数。依据构造函数的源码咱们能够得出两个论断: 通过of(T value)函数所结构出的Optional对象,当Value值为空时,仍然会报NullPointerException。 通过of(T value)函数所结构出的Optional对象,当Value值不为空时,能失常结构Optional对象。 除此之外呢,Optional类外部还保护一个value为null的对象,大略就是长上面这样的 public final class Optional<T> { //省略.... private static final Optional<?> EMPTY = new Optional<>(); private Optional() { this.value = null; } //省略... public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; }}那么,empty()的作用就是返回EMPTY对象。 ...

May 24, 2021 · 3 min · jiezi

关于jdk8:函数式接口实现以及专业化

函数式接口 实现类接口Current Interface Preferred InterfaceFunction<Integer, R> IntFunction<R>Function<Long, R> LongFunction<R>Function<Double, R> DoubleFunction<R>Function<Double,Integer> DoubleToIntFunctionFunction<Double,Long> DoubleToLongFunctionFunction<Long,Double> LongToDoubleFunctionFunction<Long,Integer> LongToIntFunctionFunction<R,Integer> ToIntFunction<R>Function<R,Long> ToLongFunction<R>Function<R,Double>. ToDoubleFunction<R>Function<T,T>. UnaryOperator<T>BiFunction<T,T,T> BinaryOperator<T>Consumer<Integer> IntConsumerConsumer<Double> DoubleConsumerConsumer<Long> LongConsumerBiConsumer<T,Integer> ObjIntConsumer<T>BiConsumer<T,Long> ObjLongConsumer<T>BiConsumer<T,Double> ObjDoubleConsumer<T>Predicate<Integer> IntPredicatePredicate<Double> DoublePredicatePredicate<Long> LongPredicateSupplier<Integer> IntSupplierSupplier<Double> DoubleSupplierSupplier<Long> LongSupplierSupplier<Boolean> BooleanSupplierUnaryOperator<Integer> IntUnaryOperatorUnaryOperator<Double> DoubleUnaryOperatorUnaryOperator<Long> LongUnaryOperatorBinaryOperator<Integer> IntBinaryOperatorBinaryOperator<Long> LongBinaryOperatorBinaryOperator<Double> DoubleBinaryOperatorFunction<T, Boolean> Predicate<T>BiFunction<T,U,Boolean> BiPredicate<T,U>

December 19, 2020 · 1 min · jiezi

关于jdk8:JDK8中的新时间APIDuration-Period和ChronoUnit介绍

简介在JDK8中,引入了三个十分有用的工夫相干的API:Duration,Period和ChronoUnit。 他们都是用来对工夫进行统计的,本文将会具体解说一下这三个API的应用。 DurationDuration次要用来掂量秒级和纳秒级的工夫,应用于工夫精度要求比拟高的状况。 先来看看Duration的定义: public final class Duration implements TemporalAmount, Comparable<Duration>, Serializable能够看到,Duration是一个final class,并且它是可序列化和可比拟的。咱们留神,Duration还实现了TemporalAmount接口。 那么TemporalAmount接口是什么呢? TemporalAmount是Duration和Period的父接口。 它定义了4个必须要实现的办法: long get(TemporalUnit unit);List<TemporalUnit> getUnits();Temporal addTo(Temporal temporal);Temporal subtractFrom(Temporal temporal);其中TemporalUnit代表的是工夫对象的单位,比方:years, months, days, hours, minutes 和 seconds.而Temporal代表的是对工夫对象的读写操作。 咱们看下Duration的一些基本操作: Instant start = Instant.parse("2020-08-03T10:15:30.00Z"); Instant end = Instant.parse("2020-08-03T10:16:30.12Z"); Duration duration = Duration.between(start, end); log.info("{}",duration.getSeconds()); log.info("{}",duration.getNano()); log.info("{}",duration.getUnits());下面咱们创立了两个Instant,而后应用Duration.between办法来测算他们之间的差别。 其中秒局部的差别,应用duration.getSeconds()来获取,而秒以下精度局部的差别,咱们应用duration.getNano()来获取。 最初咱们应用duration.getUnits()来看一下duration反对的TemporalUnit(工夫单位)。 看下执行后果: INFO com.flydean.time - 60 INFO com.flydean.time - 120000000 INFO com.flydean.time - [Seconds, Nanos]除了Instance,咱们还能够应用LocalTime: ...

November 5, 2020 · 1 min · jiezi

关于jdk8:JDK源码那些事儿之传说中的AQS独占锁

上一篇文章中笔者曾经介绍过AQS的基础知识,然而更加具体的源码实现还未波及,本篇文章笔者就联合具体的AQS实现类来聊一聊AQS的独占锁实现过程 前言JDK版本号:1.8.0_171之前的文章中曾经介绍过,AQS是一套多线程访问共享资源的同步器框架实现,开发者只须要依照需要在实现类中实现对应的办法即可实现锁或者同步器的构建,在AQS的源码正文局部,如果你有认真看过的话应该会留神到,作者举了2个简略的例子,一个是独占锁实现Mutex,另一个是共享锁实现BooleanLatch 作为示例笔者就以这两个简略的锁实现联合AQS的具体方法来进行解说阐明,这里揭示下请先看下笔者的上篇文章JDK源码那些事儿之传说中的AQS-概览,理解AQS的基本知识,同时浏览下之前对Object和LockSupport的解说,笔者默认读者应该曾经理解了这些相干知识点 其次,集体认为初学者学习AQS的源码须要多思考多debug,多看几遍本篇文章能力了解。因为篇幅过长,笔者这篇文章只解说简略的独占锁实现流程 示例先来看下源码作者实现的独占锁Mutex,能够看到封装了外部类Sync继承AbstractQueuedSynchronizer实现了独占锁须要的几个办法,这里次要是tryAcquire,tryRelease,其余办法留给读者自行深刻,这里再温习下AQS定义这两个办法的含意: tryAcquire:独占模式尝试获取资源,胜利则返回true,失败则返回falsetryRelease:独占模式尝试开释资源,胜利则返回true,失败则返回false这里先理解下即可,可略过持续看上面的测试代码实现 class Mutex implements Lock, Serializable { // Our internal helper class private static class Sync extends AbstractQueuedSynchronizer { // Reports whether in locked state @Override protected boolean isHeldExclusively() { return getState() == 1; } // Acquires the lock if state is zero @Override public boolean tryAcquire(int acquires) { assert acquires == 1; // Otherwise unused if (compareAndSetState(0, 1)) { setExclusiveOwnerThread(Thread.currentThread()); return true; } return false; } // Releases the lock by setting state to zero @Override protected boolean tryRelease(int releases) { assert releases == 1; // Otherwise unused if (getState() == 0) throw new IllegalMonitorStateException(); setExclusiveOwnerThread(null); setState(0); return true; } // Provides a Condition Condition newCondition() { return new ConditionObject(); } // Deserializes properly private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); setState(0); // reset to unlocked state } } // The sync object does all the hard work. We just forward to it. private final Sync sync = new Sync(); @Override public void lock() { sync.acquire(1); } @Override public boolean tryLock() { return sync.tryAcquire(1); } @Override public void unlock() { sync.release(1); } @Override public Condition newCondition() { return sync.newCondition(); } public boolean isLocked() { return sync.isHeldExclusively(); } public boolean hasQueuedThreads() { return sync.hasQueuedThreads(); } @Override public void lockInterruptibly() throws InterruptedException { sync.acquireInterruptibly(1); } @Override public boolean tryLock(long timeout, TimeUnit unit) throws InterruptedException { return sync.tryAcquireNanos(1, unit.toNanos(timeout)); }}笔者这里写了一个简略的应用示例供大家参考,其中应用了CountDownLatch,仅仅是保障线程池中的所有线程同一时刻争抢Mutex独占锁,读者能够不必过多关注,把这个去掉也能够,不是重点,咱们重点关注下Mutex的应用即可,最终的后果想必读者也能猜到,其中的线程一个一个争抢到锁能力执行业务逻辑操作 ...

October 24, 2020 · 5 min · jiezi

关于jdk8:Centos7-安装Oracle-JDK18和OpenJDK-18

首先:Oracle JDK和OpenJDK装任何一个就能够了.Oracle JDK和OpenJDK的区别: Oracle JDK由Oracle公司开发,该公司是Sun许可证,基于Java标准版标准实现。它以二进制产品的模式公布。它反对多种操作系统,如Windows,Linux,Solaris,MacOS等。它反对不同的平台,如Intel 32位和64位架构,ARM架构和SPARC。它齐全基于Java编程语言。之后,该许可证发表将依据GPL(通用公共许可证)许可证公布。Oracle JDK蕴含许多组件作为库模式的编程工具汇合OpenJDK是Java SE平台版的开源和收费实现,它是Sun Corporation(当初的Oracle Corporation)于2006年开始的开发后果。它是依据GNU GPL许可证受权的。它最后于2007年公布。它由Oracle Corporation,Red Hat,IBM,Apple Inc.,OpenJDK和Java Community等开发。它是应用C ++和Java编程语言编写的。它反对不同的操作系统,如FreeBSD,Linux,Microsoft Windows,Mac OS X. OpenJDK是Java SE Platform Edition的官网参考实现。 Oracle与OpenJDK之间比拟Oracle JDKOpenJDK执照它是依据GPL(通用公共许可证)许可证受权的它是依据GNU GPL(通用公共许可证)许可证受权的倒退由Sun Microsystems Inc.开发由Oracle,OpenJDK和Java社区开发性能依据Sun JDK的开发和实现提供性能提供由Oracle JDK之上的一些供应商开发的高性能可扩展性依据Sun的施行能够应用其余库或Oracle JDK进行改良费用Sun的官网执行许可证开源和收费施行可供收费应用速度由Sun Microsystems Inc.开发第三方供应商将通过进行一些调整来进步JVM的速度操作系统反对Windows,Linux,Solaris,MacOSFreeBSD,Linux,Microsoft Windows,Mac OS X.便于应用能够与任何利用程序开发一起应用能够与任何利用程序开发和其余开源工具一起应用,以进步开源实现模型的性能。Oracle JDK1.8的装置1.下载 jdk-8u261-linux-x64.tar.gz链接: https://pan.baidu.com/s/1_x5W... 明码: 6pat 2.创立目录 # 把 jdk-8u261-linux-x64.tar.gz通过ftp传送到Centos7服务器> mkdir /usr/local/java> tar -xzvf jdk-8u261-linux-x64.tar.gz -C /usr/local/java> mv /usr/local/java/jdk1.8.0_261 /usr/local/java/jdk1.83.配置环境变量 > vi /etc/profile# 增加JAVA_HOME环境变量到文件开端export JAVA_HOME=/usr/local/java/jdk1.8export PATH=${JAVA_HOME}/bin:${PATH}> source /etc/profile4.测试 > java -versionOpen JDK1.8的装置1.查看jdk1.8可用版本 ...

October 6, 2020 · 1 min · jiezi

关于jdk8:啃碎String源码

前言最近打算开始来读一下JDK的局部源码,这次先从咱们平时用的最多的String类(JDK1.8)开始,本文次要会对以下几个办法的源码进行剖析: equalshashCodeequalsIgnoreCaseindexOfstartsWithconcatsubstringsplittrimcompareTo如果有不对的中央请多多指教,那么开始进入注释。 源码分析equalsequals() 办法用于判断 Number 对象与办法的参数进是否相等String类重写了父类Object的equals办法,来看看源码实现: 首先会判断两个对象是否指向同一个地址,如果是的话则是同一个对象,间接返回true接着会应用instanceof判断指标对象是否是String类型或其子类的实例,如果不是的话则返回false接着会比拟两个String对象的char数组长度是否统一,如果不统一则返回false最初迭代顺次比拟两个char数组是否相等hashCodehashCode() 办法用于返回字符串的哈希码Hash算法就是一种将任意长度的消息压缩到某一固定长度的音讯摘要的函数。在Java中,所有的对象都有一个int hashCode()办法,用于返回hash码。 依据官网文档的定义:Object.hashCode() 函数用于这个函数用于将一个对象转换为其十六进制的地址。依据定义,如果2个对象雷同,则其hash码也应该雷同。如果重写了 equals() 办法,则原 hashCode() 办法也一并生效,所以也必须重写 hashCode() 办法。 依照下面源码举例说明: String msg = "abcd"; System.out.println(msg.hashCode());此时value = {'a','b','c','d'}  因而for循环会执行4次 第一次:h = 31*0 + a = 97 第二次:h = 31*97 + b = 3105 第三次:h = 31*3105 + c = 96354 第四次:h = 31*96354 + d = 2987074  由以上代码计算能够算出 msg 的hashcode = 2987074 在源码的hashcode的正文中还提供了一个多项式计算形式: s[0]31^(n-1) + s[1]31^(n-2) + ... + s[n-1]另外,咱们能够看到,计算中应用了31这个质数作为权进行计算。能够尽可能保障数据分布更扩散 在《Effective Java》中有提及: ...

October 4, 2020 · 3 min · jiezi