# JDK安装配置
# Flag
- JEP http://openjdk.java.net/jeps (opens new window)
- https://www.oracle.com/cn/downloads (opens new window)
- https://www.oracle.com/java (opens new window)
- 版本管理 https://github.com/jingxiang/java-switch (opens new window)
- https://github.com/NotoChen/JavaVersionChoice (opens new window)
- https://github.com/marchof/java-almanac (opens new window)
- https://github.com/HanSolo/javafinder (opens new window)
# OpenJDK
- https://github.com/topics/openjdk (opens new window)
- https://github.com/topics/jdk (opens new window)
- https://www.injdk.cn (opens new window)
- JDK版本生命周期
- https://github.com/openjdk (opens new window)
https://github.com/AdoptOpenJDK (opens new window)- https://github.com/adoptium (opens new window)
- https://github.com/corretto (opens new window)
- https://github.com/zulu-openjdk (opens new window)
- LibericaJDK https://github.com/bell-sw (opens new window)
- https://github.com/SAP/SapMachine (opens new window)
- https://developer.ibm.com/languages/java/semeru-runtimes/downloads (opens new window)
- https://developers.redhat.com/products/openjdk (opens new window)
- https://www.openlogic.com/openjdk-downloads (opens new window)
- https://github.com/microsoft/openjdk (opens new window)
- https://github.com/dragonwell-project (opens new window)
- https://github.com/beehive-lab/TornadoVM (opens new window)
- OpenJ9 https://github.com/eclipse-openj9 (opens new window)
- https://github.com/TravaOpenJDK (opens new window)
- https://github.com/Tencent/TencentKona-17 (opens new window)
- https://gitee.com/openeuler/bishengjdk-17 (opens new window)
- https://eclipse.dev/justj (opens new window)
# 通用VM
- https://github.com/topics/native-image (opens new window)
- 通用VM https://github.com/graalvm (opens new window)
- SubstrateVM https://github.com/oracle/graal (opens new window)
- https://github.com/spring-projects-experimental/spring-native (opens new window)
- https://docs.spring.io/spring-native/docs/current/reference/htmlsingle (opens new window)
- https://openval.eu/jdk (opens new window)
- https://github.com/spaceflint7/bluebonnet (opens new window)
- iOS https://github.com/ibinti/bugvm (opens new window)
- https://github.com/robovm/robovm (opens new window)
- https://sourceforge.net/projects/xmlvm (opens new window)
# JVM
- https://www.oracle.com/cn/java/technologies/hotspotfaq.html (opens new window)
- G1垃圾收集器入门 https://www.oracle.com/technetwork/tutorials/tutorials-1876574.html (opens new window)
- http://jdk.java.net/zgc/ (opens new window)
- https://wiki.openjdk.java.net/display/zgc/Main (opens new window)
- Java平台,标准版HotSpot虚拟机垃圾收集调优指南 (opens new window)
- Java SE 6 HotSpot 虚拟机垃圾收集优化 (opens new window)
- JVM的那些常用参数以及命令 (opens new window)
- JVM配置工具 https://render.alipay.com/p/s/jvm-generate/JvmGenerate (opens new window)
- http://jvmmemory.com (opens new window)
- https://console.perfma.com (opens new window)
# 常用参数
- JVM参数配置说明 (opens new window)
- JVM内存配置最佳实践 (opens new window)
- JVM核心参数图解 (opens new window)
- JVM优化之 -Xss -Xms -Xmx -Xmn 参数设置 (opens new window)
- java编译器编码和JVM编码问题? (opens new window)
参数 | 说明 |
---|---|
file.encoding | 默认文件编码 |
-Xmx1024m | 初始堆大小为1024m |
-Xms1024m | 最大堆大小为1024m |
-Xmn366m | 设置年轻代大小为366m,Sun官方推荐配置为整个堆的3/8(35.7%) |
-XX:NewSize=n | 设置年轻代大小 |
-XX:MaxNewSize=n | 设置最大的年轻代大小 |
-XX:PermSize=n | JDK1.7设置永久代大小 |
-XX:MaxPermSize=n | JDK1.7设置最大永久代大小 |
-XX:MetaspaceSize=n | JDK1.8设置元空间大小 |
-XX:MaxMetaspaceSize=n | JDK1.8设置最大元空间大小,最好与-XX:MetaspaceSize一致 |
-XX:NewRatio=4 | 设置年轻代(包括Eden和两个Survivor区)与终身代的比值(除去永久代)。设置为4,则年轻代与终身代所占比值为1:4,年轻代占整个堆栈的1/5 |
-XX:SurvivorRatio=n | 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 |
-XX:MaxTenuringThreshold | 设置垃圾最大年龄,默认为:15。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。 |
-XX:+CMSScavengeBeforeRemark | CMS并发标记阶段与用户线程并发进行,此阶段会产生已经被标记了的对象又发生变化的情况,若打开此开关,可在一定程度上降低CMS重新标记阶段对上述“又发生变化”对象的扫描时间,当然,“清除尝试”也会消耗一些时间。注:开启此开关并不会保证在标记阶段前一定会进行清除操作 |
-XX:+UseSerialGC | 设置串行收集器 |
-XX:+UseParallelGC | 设置并行收集器 |
-XX:ParallelGCThreads=n | 设置并行收集线程数 |
-XX:+UseParalledlOldGC | 设置并行年老代收集器 |
-XX:MaxGCPauseMillis=n | 设置并行收集最大暂停时间 |
-XX:GCTimeRatio=n | 设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n) |
-XX:+UseConcMarkSweepGC | 设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 |
-XX:CMSInitiatingOccupancyFraction=70 | CMS垃圾收集器,当老年代达到70%时,触发CMS垃圾回收。 |
-XX:+UseCMSInitiatingOccupancyOnly | 指定使用CMSInitiatingOccupancyFraction的值,如果不指定,JVM仅在第一次使用设定值,后续则自动调整。 |
-XX:+ParallelRefProcEnabled | 并行处理Reference,加快处理速度,缩短耗时 |
# 参考参数
根据JDK8-4G内存-4核CPU生成的
JVM
参数,打印了gc
各个阶段的日志
看看
ygc
的回收时间,以及old
区大小,最后看FGC
JAVA_OPTS="
-Dfile.encoding=UTF-8
-Dstdout.encoding=UTF-8
-Dstderr.encoding=UTF-8
-server
-Xms2688M
-Xmx2688M
-Xmn960m
-Xss8m
-XX:MetaspaceSize=512M
-XX:MaxMetaspaceSize=512M
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=70
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+ExplicitGCInvokesConcurrentAndUnloadsClasses
-XX:+ParallelRefProcEnabled
-XX:+CMSScavengeBeforeRemark
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/jvm_logs/heap.hprof
-XX:ErrorFile=/home/jvm_logs/hs_err_pid%p.log
-Xloggc:/home/jvm_logs/gc.log
-Djava.rmi.server.hostname=192.168.1.220
-Dcom.sun.management.jmxremote.port=18999
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-verbose:class
-XX:+PrintClassHistogramBeforeFullGC
-XX:+PrintClassHistogramAfterFullGC
-XX:+PrintCommandLineFlags
-XX:+PrintGCApplicationConcurrentTime
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintTenuringDistribution
-XX:+PrintHeapAtGC
"
# Linux安装JDK
查看已安装
rpm -qa | grep java
卸载JDK
rpm -e --nodeps 查出来的名称
查看JDK软件包列表
# 安装之前最好先更新一下源
yum update -y
# 列出可用安装包
yum -y list java*
# 或者
yum search java | grep -i --color JDK
jdk-headless
为最小安装包,Java Runtime Environment (JRE) 主要包含了 Java 虚拟机(JVM),类和允许运行 Java 程序的二进制包。 Java Development Kit (JDK) 包含 JRE 和用于构建 Java 应用的开发/调试工具和库文件
yum安装JDK
通过yum默认安装的路径为
/usr/lib/jvm
yum -y install java-1.8-openjdk java-1.8.0-openjdk-devel.x86_64
配置环境变量
- 在
/etc/profile
或/etc/environment
文件中使用gedit
或者vim
或者nano
加入以下几行内容
########## jdk environment ######################
export JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
# jdk8需要配置jre的环境
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
########## jdk environment ######################
# 刷新环境变量文件
source /etc/profile
# 查看变量是否生效
echo $JAVA_HOME && echo $CLASSPATH
# 源码安装时系统注册此jdk
update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_191/bin/java 300
# 安装了多个版本jdk,通过以下命令在这些版本之间切换
update-alternatives –config java
# 查看Java版本信息
java -version
# Windows环境变量
setx /m JAVA_HOME "C:\Program Files\Java\jre1.8.0_171"
setx /m CATALINA_HOME "D:\apache-tomcat-8.5.30"
setx /m JRE_HOME "%JAVA_HOME%\jre;"
setx /m CLASSPATH ".;%JAVA_HOME%\lib;%JRE_HOME%\lib;"
setx /m Path "%PATH%;%JAVA_HOME%\bin;%JRE_HOME%\bin;%MAVEN_HOME%\bin;%CATALINA_HOME%\bin;"
# 源码包
- JavaFX源码:JDK安装目录下的
javafx-src.zip
文件 - Java源码:JDK安装目录下的
src.zip
文件
IDEA查看源码都是从这两个ZIP文件加载,查看源码解压ZIP到
Maven
项目的src/main/java
下,或者直接解压到普通项目src
下
rt.jar
是JAVA基础类库,包含lang
在内的大部分功能,而且rt.jar
默认就在根classloader
的加载路径里面
在
java.util.concurrent
、java.security
、javax.cropty
、javax.security
四个包中就占了两个(多线程、安全)
多线程(multi-threading and concurrent)
- 关键词:volatile, sychronized
- 传统的线程 API:java.lang.Thread, java.lang.Runnable, java.lang.ThreadGroup, Object#wait, Object#notify, Object#notifyAll
- JDK 5 并发包(java.util.concurrent)API:线程池、任务执行器、计数信号量、倒计数门闩、并发集合(并发 Map、阻塞队列等)、 基于 CPU CAS 指令的原子 API(java.util.concurrent.atomic)、锁 API(java.util.concurrent.lock)和条件对象等。
- 作为个人知识提升,还需要理解诸如自旋锁、分离锁、分拆锁、读写锁等的同步锁策略,以及可重入锁、锁的公平性的意义。 以及各种并发锁的算法,比如:Peterson锁、Bakery锁 等等,以及现代 CPU 体系结构
涉及多线程及并发的 API 在 java.lang 中及 java.util.concurrent.* 中。
网络(network communication)
java.net、javax.net
- 阻塞 TCP 通信、阻塞 UDP 通信、组播
- 非阻塞 TCP 通信、非阻塞 UDP 通信
- 客户端通信 API(java.net.URL, java.net.URLConnection 等类库)
涉及网络通信的 API 都在 java.net 和 java.nio.channels 包中。这里的网络已经将 RMI 相关包 java.rmi, javax.rmi 都排除了。
安全(security, cryptography and AAA)
- Java 加密类库 JCA
- Java 加密类库扩展 JCE
- 涉及密码学知识点的消息摘要、消息认证码、对称加密、非对称加密、数字签名
- 涉及网络通信证书管理工具(keytool)及 API(PKI、X.509证书)
- 基于 SSL/TLS 的安全网络通信 API(JSSE),包括:密钥库管理、信任库管理、阻塞 SSL 通信和非阻塞 SSL 通信等等
- Java 认证及授权服务(JAAS)API
涉及安全的东西都在:
- java.security(JCA、JCE、数字证书,以及 JCE 的 SPI)
- javax.net(SSL/TLS)
- javax.security(JAAS)
- javax.crypto(密码学)
- keytool 的 JDK 工具
java
、javax
、sun
、org
包有什么区别
都是jdk提供的类包,且都是在
rt.jar
中。
java.*
java标准的一部分,是对外承诺的java开发接口,通常要保持向后兼容,一般不会轻易修改。javax.*
java标准的一部分,但是没有包含在标准库中,一般属于标准库的扩展。通常属于某个特定领域,不是一般性的api。
以扩展的方式提供api,以避免jdk的标准库过大。当然某些早期的javax,后来被并入到标准库中,所有也应该属于新版本JDK的标准库。 比如jmx,java 5以前是以扩展方式提供,但是jdk5以后就做为标准库的一部分了,所有javax.management也是jdk5的标准库的一部分。
com.sun.*
是sun的hotspot虚拟机中java.*
和javax.*
的实现类。
因为不是sun对外公开承诺的接口,所以根据根据实现的需要随时增减,因此在不同版本的hotspot中可能是不同的, 而且在其他的jdk实现中是没有的,调用这些类,可能不会向后兼容,所以一般不推荐使用。
org.omg.*
是由企业或者组织提供的java类库,大部分不是sun公司提供的,同com.sun.*
,不具备向后兼容性,会根据需要随时增减。
其中比较常用的是w3c提供的对XML、网页、服务器的类和接口。
← CAS和Shiro内外网访问 JDK工具 →