# JDK安装配置

# Flag

# OpenJDK

# 源码包

  • 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.concurrentjava.securityjavax.croptyjavax.security 四个包中就占了两个(多线程、安全)

多线程(multi-threading and concurrent)

  1. 关键词:volatile, sychronized
  2. 传统的线程 API:java.lang.Thread, java.lang.Runnable, java.lang.ThreadGroup, Object#wait, Object#notify, Object#notifyAll
  3. JDK 5 并发包(java.util.concurrent)API:线程池、任务执行器、计数信号量、倒计数门闩、并发集合(并发 Map、阻塞队列等)、 基于 CPU CAS 指令的原子 API(java.util.concurrent.atomic)、锁 API(java.util.concurrent.lock)和条件对象等。
  4. 作为个人知识提升,还需要理解诸如自旋锁、分离锁、分拆锁、读写锁等的同步锁策略,以及可重入锁、锁的公平性的意义。 以及各种并发锁的算法,比如:Peterson锁、Bakery锁 等等,以及现代 CPU 体系结构

涉及多线程及并发的 API 在 java.lang 中及 java.util.concurrent.* 中。

网络(network communication)

java.net、javax.net

  1. 阻塞 TCP 通信、阻塞 UDP 通信、组播
  2. 非阻塞 TCP 通信、非阻塞 UDP 通信
  3. 客户端通信 API(java.net.URL, java.net.URLConnection 等类库)

涉及网络通信的 API 都在 java.net 和 java.nio.channels 包中。这里的网络已经将 RMI 相关包 java.rmi, javax.rmi 都排除了。

安全(security, cryptography and AAA)

  1. Java 加密类库 JCA
  2. Java 加密类库扩展 JCE
  3. 涉及密码学知识点的消息摘要、消息认证码、对称加密、非对称加密、数字签名
  4. 涉及网络通信证书管理工具(keytool)及 API(PKI、X.509证书)
  5. 基于 SSL/TLS 的安全网络通信 API(JSSE),包括:密钥库管理、信任库管理、阻塞 SSL 通信和非阻塞 SSL 通信等等
  6. Java 认证及授权服务(JAAS)API

涉及安全的东西都在:

  • java.security(JCA、JCE、数字证书,以及 JCE 的 SPI)
  • javax.net(SSL/TLS)
  • javax.security(JAAS)
  • javax.crypto(密码学)
  • keytool 的 JDK 工具

javajavaxsunorg包有什么区别

都是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、网页、服务器的类和接口。

# 通用VM

# JVM

因为Tomcat运行在JAVA虚拟机之上,适当调整运行JVM参数可以提升整体性能。

  • Windows:修改bin/catalina.bat文件,文件中有注释说明
  • Linux:修改bin/catalina.sh文件,文件中有注释说明

# 常用参数

参数 说明
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="
-server
-Xmx2688M
-Xms2688M
-Xmn960m
-XX:MaxMetaspaceSize=512M
-XX:MetaspaceSize=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;"