Java基础-网络
参考文献
Java语言程序设计-进阶版(第8版)
Java核心技术 卷2 高级特性
引言
Java支持基于流的通信(stream-based communication)和基于包通信(packet-based communication).
基于流的通信使用传输控制协议TCP进行数据传输,而基于包的通信使用用户数据协议UDP.
Java API提供用于创建套接字的类来便于程序的网络通信.套接字(scoket)是两台主机之间逻辑连接的端点,可以用来发送和接收数据.
网络程序设计通常涉及一个服务器和一个或多个客户端,客户端向服务器发送请求,而服务器响应请求.客户端尝试建立与服务器的连接开始,服务器可能接受或拒绝这个连接.一旦建立连接,客户端和服务器就可以通过套接字进行通信.
当客户端尝试连接服务器时,服务器必须正在运行.服务器等待来自客户端的连接请求.
12345678910// 服务端 // 创建服务器套接字 final ServerSocket serverSocket = new ServerSocket(8000); // ...
Java基础-I/O流
参考文献
IO 多路复用
Java语言设计-基础篇(第8版)
Java核心技术 卷2 高级特性
Java IO Tutorials
I/O流
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流.
OutputStream/Writer: 所有的输出流的基类,前者是字节输出流,后者是字符输出流.
File类
File对象封装了文件或路径的属性,但是它既不包括创建文件,也不包括从(向)文件读(写)数据的方法.
文件输入和输出
PrintWriter
java.io.PrintWriter类可以用来创建一个文件并向文本文件写入数据.首先必须为一个文本文件创建一个PrintWriter对象.
123 final PrintWriter printWriter = new PrintWriter(new File(""));printWriter.println("");printWriter.close();
Scanner
java.util.Scanner类用来从控制台读取 ...
工具-JMH的使用
参考文献
别再写 main 方法测试了,太 Low!这才是专业 Java 测试方法!
https://hg.openjdk.java.net/code-tools/jmh
为什么要用JMH?何时应该用?
JMH简介
JMH,全称 Java Microbenchmark Harness (微基准测试框架),是专门用于Java代码微基准测试的一套测试工具API,是由 OpenJDK/Oracle 官方发布的工具。
基准测试注意点
测试前需要预热。
防止无用代码进入测试方法中。
并发测试。
测试结果呈现。
使用场景
定量分析某个热点函数的优化效果
想定量地知道某个函数需要执行多长时间,以及执行时间和输入变量的相关性
对比一个函数的多种实现方式
依赖
1234567891011<dependency> <groupId>org.openjdk.jmh</groupId> <artifactId>jmh-core</artifactId> <version>${jmh.versio ...
JVM(六)-类加载
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JVM 基础 - Java 类加载机制
虚拟机类加载机制
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制.
在Java语言中,类型的加载,连接和初始化过程都是在程序运行期间完成的.
类的生命周期
一个类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期将经历**加载(Loading),验证(Verification),准备(Preparation),解析(Resolution),初始化(Initialization),使用(Using)和卸载(Unloading)**七个阶段.
其中验证,准备,解析三个阶段被统称为连接(Linking).
其中前五个部分(加载,验证,这边,解析,初始化)统称为类加载.
类加载的过程
Loading 加载
加载阶段是整个类加载(Class Loading)过程的一个阶段,在加载阶段,Java虚拟机需要完成以下三件事情:
通过类的 ...
JVM-类文件结构
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
类文件结构
类型
名称
中文名称
数量
u4
magic
魔数
1
u2
minor_version
主版本号
1
u2
major_version
副版本号
1
u2
constant_pool_count
常量池计数器
1
cp_info
constant_pool
常量池
constant_pool_count-1
u2
access_flags
某个类或者接口的访问权限和属性
1
u2
this_class
类索引
1
u2
super_class
父类索引
1
u2
interfaces_count
接口计数器
1
u2
interfaces
接口表
interfaces_count
u2
fields_count
字段计数器
1
fields_info
fields
字段表
fields_count
u2
methods_count
方法计数器
1
method_info
methods
方法表
methods_count
u2
a ...
JVM(四)-虚拟机性能监控和故障处理工具
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JDK Tools and Utilities
How to Analyze Java Thread Dumps
基础故障处理工具
工具
简介
java
Java 应用的启动程序
javac
JDK 内置的编译工具
javap
反编译 class 文件的工具
javadoc
根据 Java 代码和标准注释,自动生成相关的 API 说明文档
javah
JNI 开发时,根据 Java 代码生成需要的 .h 文件.
extcheck
检查某个 jar 文件和运行时扩展 jar 有没有版本冲突,很少使用
jdb
Java Debugger 可以调试本地和远端程序,属于 JPDA 中的一个 Demo 实现,供其他调试器参考.开发时很少使用
jdeps
探测 class 或 jar 包需要的依赖
jar
打包工具,可以将文件和目录打包成为 .jar 文件;.jar 文件本质上就是 zip 文件,只是后缀不同.使用时按顺序对应好选项和参数即可.
keytool
安全证书和密钥 ...
JVM(三)-垃圾收集器日志分析
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
JEP 158: Unified JVM Logging
Tools Reference
Java HotSpot VM Options
垃圾收集器日志
HotSpot 所有功能的日志都收归到了-Xlog参数
1Xlog[:[selector][:[output][:[decorators][:output-options
命令行中最关键的参数是选择器(Selector),它由标签(Tag)和日志级别 (Level)共同组成.标签可理解为虚拟机中某个功能模块的名字,它告诉日志框架用户希望得到虚拟机哪些功能的日志输出。垃圾收集器的标签名称为“gc”,由此可见,垃圾收集器日志只是 HotSpot 众多功能日志的其中一项,全部支持的功能模块标签名如下所示
12add,age,alloc,annotation,aot,arguments,attach,barrier,biasedlocking,blocks,bot,break point,bytecode
日志级别从低到高,共有Trace,Debug,War ...
JVM-垃圾回收
参考文献
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)
The JVM Write Barrier - Card Marking
Java(JVM) Memory Model - Memory Management in Java
GC Roots
Garbage Collection Roots
Understanding metaspace line in JVM heap printout
[讨论] [HotSpot VM] JVM调优的"标准参数"的各种陷阱
Java中9种常见的CMS GC问题分析与解决
JVM之三色标记算法
概念
内存泄漏: 该释放的没释放,该回收的没回收.
内存溢出: 内存不够用
垃圾回收
哪些内存需要回收?
JVM 的内存区域中,程序计数器、虚拟机栈和本地方法栈这 3 个区域是线程私有的,随着线程的创建而创建,销毁而销毁;栈中的栈帧随着方法的进入和退出进行入栈和出栈操作,每个栈帧中分配多少内存基本是在类结构确定下来的时候就已知的.
垃圾回收的重点就是关注堆和方法区中的内存了,堆中的回收主要是对象的回收,方法区的 ...
Java-编程技巧
参考文献
Java获取资源路径
Java中获取资源时,经常使用class.getResource()和ClassLoader.getResource获取资源时,获取的是编译之后的class文件资源,而不是获取Java源码
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package com.holelin.sundry.demo;import org.springframework.core.io.ClassPathResource;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.util.stream.Stream;/** * @Description: * @Author: HoleLin * @CreateDate: 2020/7/29 15:24 * @U ...
Java基础-BigDecimal使用
参考文献
BigDecimal概述
BigDecimal是Java在java.match包中提供的API类,主要用来对超过16位有效位的数进行精确的运算.
双精度浮点型变量double可以处理16位有效数,但在实际引用中,可能需要对更大或者更小的数进行运算和处理;
一般情况对于那些不需要精确计算精度的数字,可以直接使用Float和Double来处理,但是使用Float.valueOf(String)和Float.valueOf(String)会丢失经,所以面对需要精确计算的结果,则必须使用BigDecimal类来操作;
BigDecimal所创建的是对象,所以不能使用传统的+,-,*,/等运算符直接对对象进行数学运算,而必须调用其对应的方法,方法的参数也必须是BigDecimal的对象.
BigDecimal常用的构造函数
BigDecimal(int): 创建一个具有参数所指定整数值的对象
BigDecimal(double): 创建一个具有参数所指定双精度值的对象
BigDecimal(long): 创建一个具有参数所指定长整型数值的对象
BigDecimal( ...