B-1.JDK核心库package

rt.jar

java.lang.* 最基础,Integer/String
java.io.* IO读写,文件操作
java.util.* 工具类,集合/日期 JUC并发工具包java.util.concurrency,默认线程不安全
java.math.* 数学计算,BigInteger
java.net.* 网络编程,Socket
java.rmi.* Java内置的远程调用
java.sql.* JDBC操作数据库
javax.* java扩展API 很多J2EE的东西是javax开头的
sun.* Sun公司的JDK实现包

B-2.JDK内置的命令行工具

路径:
JDK内置的命令行工具默认在JDK的安装目录下面的bin目录下,或者jre所在目录下的bin目录下。

常见命令行工具:

  • java:(*常用)JAVA应用的启动程序,也是JVM启动的入口。当我们用java命令run起来一个class文件或者jar包的时候,就相当于启动了一个小型的JVM虚拟机。
  • javac:(*常用)JDK内置的编译工具,将.java文件编译成.class文件。
  • javap:(*常用)反编译class文件的工具,用字节码查看.class文件。
  • javadoc:根据JAVA代码和标准注释,自动生成相关的API说明文档。
  • javah:JNI开发时,根据java代码生成需要的.h文件。.h文件是C/C++调用JAVA时使用到的文件。
  • extcheck:检查某个jar文件和运行时扩展jar有没有版本冲突。使用率极低
  • jdb:JAVA Debugger本地调试器,可以高度本地和远程程序,属于JPDA中的一个demo实现,供其他调试器参考,开发时都使用IDEA或者eclipse。
  • jdeps:dependency的缩写,探测class或者jar包需要的依赖,主要是分析import
  • jar:打包工具,可以将文件(class,properties等)和目录打包成.jar文件。.jar文件本质上就是zip文件,只是后缀不同,使用时按顺序对应好选项和参数即可。
  • keytool:安全证书和密钥的管理工具,支持生成,导入,导出等操作。
  • jarsigner:JAR文件签名和验证工具,表示jar包分发出去之后没有被篡改过。
  • policetool:图形界面管理工具,主要用来管理本机的JAVA安全策略。
  • jinfo:查看单个JAVA进程,但在mac上有bug,可以在windows和linux上使用
  • jps:查看JAVA进程。*注意点:1.不同账户因为权限问题可能看不到其他账户的java进程,需要用sudo。2.本地安装不同版本的JDK有时也不互通不兼容,因此建议尽量安装成一个确定版本的JDK。

    1. Last login: Tue Sep 21 18:07:19 on console
    2. zhukova@B-M443G8WN-1517 ~ % jps -mlv
    3. 900 -Xms128m -Xmx2048m -XX:ReservedCodeCacheSize=512m -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -XX:CICompilerCount=2 -XX:+HeapDumpOnOutOfMemoryError -XX:-OmitStackTraceInFastThrow -ea -Dsun.io.useCanonCaches=false -Djdk.http.auth.tunneling.disabledSchemes="" -Djdk.attach.allowAttachSelf=true -Djdk.module.illegalAccess.silent=true -Dkotlinx.coroutines.debug=off -XX:ErrorFile=/Users/zhukova/java_error_in_idea_%p.log -XX:HeapDumpPath=/Users/zhukova/java_error_in_idea.hprof -Djb.vmOptionsFile=/Users/zhukova/Library/Application Support/JetBrains/IntelliJIdea2021.1/idea.vmoptions -Didea.paths.selector=IntelliJIdea2021.1 -Didea.executable=idea -Didea.home.path=/Applications/IntelliJ IDEA.app/Contents -Didea.vendor.name=JetBrains
    4. 7737 sun.tools.jps.Jps -mlv -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home -Xms8m
    5. zhukova@B-M443G8WN-1517 ~ %
  • jstat*:查看JVM内部GC相关信息。

image.png

  1. zhukova@B-M443G8WN-1517 ~ % jps -l
  2. 7825 sun.tools.jps.Jps
  3. 900
  4. zhukova@B-M443G8WN-1517 ~ % jstat -gc 900 1000 5 【注释:显示内容为字节数,单位KBC代表总容量,U代表使用量】
  5. S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
  6. 68096.0 68096.0 0.0 31628.9 545344.0 284962.1 1415616.0 488425.9 533508.0 513011.2 73648.0 66318.4 913 13.722 14 42.349 56.071
  7. 68096.0 68096.0 0.0 31628.9 545344.0 289695.1 1415616.0 488425.9 533508.0 513011.2 73648.0 66318.4 913 13.722 14 42.349 56.071
  8. 68096.0 68096.0 0.0 31628.9 545344.0 289695.1 1415616.0 488425.9 533508.0 513011.2 73648.0 66318.4 913 13.722 14 42.349 56.071
  9. 68096.0 68096.0 0.0 31628.9 545344.0 289695.1 1415616.0 488425.9 533508.0 513011.2 73648.0 66318.4 913 13.722 14 42.349 56.071
  10. 68096.0 68096.0 0.0 31628.9 545344.0 289748.7 1415616.0 488425.9 533508.0 513011.2 73648.0 66318.4 913 13.722 14 42.349 56.071
  11. zhukova@B-M443G8WN-1517 ~ % jstat -gcutil -t 900 1000 5【注释:显示内容为使用率百分比,参数-t打印时间戳】
  12. Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
  13. 49378.6 37.93 0.00 5.49 34.50 96.16 90.05 914 13.735 14 42.349 56.084
  14. 49379.6 37.93 0.00 5.49 34.50 96.16 90.05 914 13.735 14 42.349 56.084
  15. 49380.6 37.93 0.00 6.55 34.50 96.16 90.05 914 13.735 14 42.349 56.084
  16. 49381.6 37.93 0.00 6.63 34.50 96.16 90.05 914 13.735 14 42.349 56.084
  17. 49382.6 37.93 0.00 6.88 34.50 96.16 90.05 914 13.735 14 42.349 56.084
  18. zhukova@B-M443G8WN-1517 ~ %
Timestamp JVM启动时间,单位为秒,此例显示启动了49378秒,大概13小时。
S0 堆内存里的survivor0,新生代New里的存活区0。0%很正常,S0和S1随时有一个是空的。
S1 堆内存里的survivor1,新生代New里的存活区1。
E 年轻代YOUNTH里的Eden。
O 老年代OLD。concurrent mark-sweep generation(CMS generation)
M 元数据区META
CCS 压缩class空间(Compressed class space)的使用
YGC 年轻代YOUNTH的GC次数.
YGCT 年轻代YOUNTH GC消耗的总时间。此例显示占总运行时间的万分之一不到,可以忽略。
FGC FULL GC的次数。
FGCT FULL GC的总时间
GCT 所有GC加起来消耗的总时间,即YGCT + FGCT。
  • jmap*:查看JVM内,堆内存heap的分配情况,以及类占用空间的统计信息,即对当前堆内存打一个快照,把堆内容dump出来。但jmap -heap在MAC上有bug,JDK9以上修复。

image.png

  • jstack*:查看线程栈信息;在MAC或LINUX上可以使用kill -3打印线程信息。

  • jcmd*:执行JVM相关分析命令(整合命令,把前面的命令进行了一个整合),可以用来查看JVM的GC的线程等等,JDK8以上版本建议使用此命令。jcmd [pid] help

  • jrunscript/jjs:执行JS命令,不分析JVM运行态。JDK8以上版本

B-3.JDK内置图形化工具

1.命令jconsole:早期老牌工具,查看JVM。
2.命令jvisualvm:JDK8_265之后,没有打包到JDK默认功能里。需要手动下载。有抽样器工具。
3.VisualGC,属于IDE插件
image.png
4.JMC(Java Mission Control):最开始是Bea自己的JDK叫JRMC(JRockit Misson Control),支持飞行器仪表盘。JDK8u261之后不再打包到内部,需要手动下载。下载地址:https://www.oracle.com/javase/jmc/

B-4.JDK基础数据类型与集合类

数据类型

1.原生类型:旧称一般类型,int,long,byte,float,double,boolean等,它们不是对象。
2.数组类型:
3.对象引用类型:旧称特殊类型

1.线性数据结构:一维的表,List链表,Stack栈,Queue队列,源于Collection接口,并且拥有迭代器。
java.util包分类
List—>ArrayList, LinkedList, Stack(LIFO), Vector
Set—>LinedSet, HashSet, TreeSet
Queue(FIFO)实现Deque实现LinkedList
2.字典K-V结构
Map—>HashMap, LinkedHashMap, TreeMap
Dictionary实现HashMap实现Properties(只能用String作为KeyValue)

ArrayList

  • 基本特点:基于数组,便于按 index 访问,超过数组需要扩容,扩容成本较高 用途:大部分情况下操作一组数据都可以用 ArrayList
  • 原理:使用数组模拟列表,默认大小10,如果长度不够,扩容 x1.5,newCapacity = oldCapacity + (oldCapacity >> 1)
  • 安全问题:

1.写冲突:- 两个写,相互操作冲突
2.读写冲突:- 读,特别是 iterator 的时候,数据个数变了,拿到了非预期数据或者报错 - 产生ConcurrentModificationException

LinkedList

  • 原理:使用双向指针将所有节点Node连接起来,按指针访问,next/prev/first/last,而不是下标index
  • 基本特点:非数组,使用链表实现,不需要指定大小,无需扩容
  • 用途:使用于不确定容量,变动较多的情况。
  • 安全问题:非线程安全,同ArrayList

HashMap

  • 基本特点:空间换时间,哈希冲突不大的情况下查找数据性能很高
  • 用途:存放指定 key 的对象,缓存对象
  • 原理:使用hash原理,存k-v数据,初始容量16,扩容x2,负载因子0.75。JDK8以后,在链表长度到8 & 数组长度到64时,使用红黑树。
  • 安全问题:

1.写冲突
2.读写问题,可能会死循环
3.keys()无序

LinkedHashMap

  • 基本特点:继承自HashMap,对Entry集合添加了一个双向链表
  • 用途:保证有序,特别是Java8 stream操作的toMap时使用
  • 原理:同LinkedList,包括插入顺序(一个链表专门管理插入顺序)和访问顺序(最近被访问的会挪到最前面)
  • 安全问题:线程不安全,继承自HashMap,同HashMap