首页
归档
留言
友链
广告合作
壁纸
更多
美女主播
Search
1
博瑞GE车机升级/降级
5,603 阅读
2
Mac打印机设置黑白打印
4,930 阅读
3
修改elementUI中el-table树形结构图标
4,892 阅读
4
Mac客户端添加腾讯企业邮箱方法
4,669 阅读
5
intelliJ Idea 2022.2.X破解
4,352 阅读
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
登录
/
注册
Search
标签搜索
Spring Boot
Java
Vue
Spring Cloud
Mac
MyBatis
WordPress
MacOS
asp.net
Element UI
Nacos
.Net
Spring Cloud Alibaba
MySQL
Mybatis-Plus
Typecho
jQuery
Java Script
微信小程序
Oracle
Laughing
累计撰写
625
篇文章
累计收到
1,421
条评论
首页
栏目
后端开发
HarmonyOS Next
Web前端
微信开发
开发辅助
App开发
数据库
随笔日记
页面
归档
留言
友链
广告合作
壁纸
美女主播
搜索到
51
篇与
的结果
2021-07-31
JVM故障诊断与性能优化之常用虚拟机参数
类加载子系统负责从文件系统或网络中加载Class信息。方法区存放类加载子系统加载的Class信息及运行时常量池信息,包括字符串的字面量和数字常量Java堆在虚拟机启动时建立,是Java程序最主要的内存工作区域,几乎所有的Java对象实例都放于Java堆中。堆空间是线程共享的。直接内存直接内存是在Java堆外直接向系统申请的内存空间,通常,访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。直接内存在Java堆外,因此它的大小不会直接首先与Xmx指定的最大堆大小。垃圾回收系统垃圾回收器可以堆方法区、Java堆和直接内存进行回收。Java栈每个一Java虚拟机线程都有一个私有的Java栈,一个线程的Java栈在线程创建的时候被创建,Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。本地方法栈与Java栈类似,最大的不同在于Java栈用于Java方法的调用,而本地方法栈用于本地方法的调用。作为Java虚拟机的重要扩展,Java虚拟机允许Java直接调用本地的方法(通常使用C编写)PC寄存器寄存器也是每个线程私有的空间,Java虚拟机会为每一个Java线程创建PC寄存器,在任意时刻,一个Java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会只想当前正在被执行的指令,如果当前方法是本地方法,那么PC寄存器的值就是undefined执行引擎负责执行虚拟机的字节码。常见Java虚拟机参数要诊断虚拟机,我们就要学习如何对Java虚拟机进行最基本的配置和跟踪。跟踪垃圾回收可以通过-XX:+PrintGC参数启动Java虚拟机,只要遇到GC,就会打印日志。System.out.println("##########准备申请1m内存#########"); byte[] bytes = new byte[1 * 1024 * 1024]; System.gc();GC和Full GC是垃圾回收的停顿类型,而不是区分是新生代还是年老代,如果有Full说明发生了Stop-The-World。如果是调用 System.gc()触发的,那么将显示的是Full GC (System) 4878K->1576K(249344K)表示GC 前该区域已使用容量 -> GC 后该区域已使用容量 (该区域内存总容量)0.0013118 secs表示GC所用时间,单位为秒。可以通过-XX:+PrintGCDetails参数来输出更加详细的参数。PSYoungGen:代表新生代。total 75776K, used 1951K代表新生代大小及已使用大小。[0x000000076b800000, 0x0000000770c80000, 0x00000007c0000000)代表新生代的下界、当前上界和上届。eden、from、to代表新生代的三个区,当对象在 Eden ( 包括一个 Survivor 区域,这里假设是 from 区域 ) 出生后,在经过一次 Minor GC 后,如果对象还存活,并且能够被另外一块 Survivor 区域所容纳( 上面已经假设为 from 区域,这里应为 to 区域,即 to 区域有足够的内存空间来存储 Eden 和 from 区域中存活的对象 ),则使用复制算法将这些仍然还存活的对象复制到另外一块 Survivor 区域 ( 即 to 区域 ) 中,然后清理所使用过的 Eden 以及 Survivor 区域 ( 即 from 区域 ),并且将这些对象的年龄设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的年龄 + 1,当对象的年龄达到某个值时 ( 默认是 15 岁,可以通过参数-XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。ParOldGen代表老年代
2021年07月31日
608 阅读
0 评论
0 点赞
2021-06-22
《深入理解Java虚拟机:JVM高级特性与最佳实践》Java经典书籍 PDF下载
{card-default label="介绍" width=""}作为一名Java开发工程师,怎么能对JVM不了解呢,《深入理解Java虚拟机:JVM高级特性与最佳实践》是一部经典的Java书籍,对JVM进行了详细的剖析,此书从核心理论和实际运用这两个角度去探讨java虚拟机,不仅理论分析得透彻,而且书中包含的典型案例和最佳实践也极具现实指导意义,适合所有java工程师、系统调优师和系统架构师阅读。{/card-default}下载地址{cloud title="" type="bd" url="http://pan.baidu.com/s/1mh5wQX6" password="5xkn"/}目录第一部分 走近Java 第1章 走近Java 1.1 概述 1.2 Java技术体系 1.3 Java发展史 1.4 Java虚拟机发展史 1.4.1 Sun Classic Exact VM 1.4.2 Sun HotSpot VM 1.4.3 Sun Mobile-Embedded VM Meta-Circular VM 1.4.4 BEA JRockit IBM J9 VM 1.4.5 Azul VM BEA Liquid VM 1.4.6 Apache Harmony GoogleAndroidDalvik VM 1.4.7 Microsoft JVM及其他 1.5 展望Java技术的未来 1.5.1 模块化 1.5.2 混合语言 1.5.3 多核并行 1.5.4 进一步丰富语法 1.5.5 64位虚拟机 1.6 实战:自己编译JDK 1.6.1 获取JDK源码 1.6.2 系统需求 1.6.3 构建编译环境 1.6.4 进行编译 1.6.5 在IDE工具中进行源码调试 1.7 本章小结 第二部分 自动内存管理机制 第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot虚拟机对象探秘 2.3.1 对象的创建 2.3.2 对象的内存布局 2.3.3 对象的访问定位 2.4 实战:OutOfMemoryError异常 2.4.1 Java堆溢出 2.4.2 虚拟机栈和本地方法栈溢出 2.4.3 方法区和运行时常量池溢出 2.4.4 本机直接内存溢出 2.5 本章小结 第3章 垃圾收集器与内存分配策略 3.1 概述 3.2 对象已死吗 3.2.1 引用计数算法 3.2.2 可达性分析算法 3.2.3 再谈引用 3.2.4 生存还是死亡 3.2.5 回收方法区 3.3 垃圾收集算法 3.3.1 标记-清除算法 3.3.2 复制算法 3.3.3 标记-整理算法 3.3.4 分代收集算法 3.4 HotSpot的算法实现 3.4.1 枚举根节点 3.4.2 安全点 3.4.3 安全区域 3.5 垃圾收集器 3.5.1 Serial收集器 3.5.2 ParNew收集器 3.5.3 Parallel Scavenge收集器 3.5.4 Serial Old收集器 3.5.5 Parallel Old收集器 3.5.6 CMS收集器 3.5.7 G1收集器 3.5.8 理解GC日志 3.5.9 垃圾收集器参数总结 3.6 内存分配与回收策略 3.6.1 对象优先在Eden分配 3.6.2 大对象直接进入老年代 3.6.3 长期存活的对象将进入老年代 3.6.4 动态对象年龄判定 3.6.5 空间分配担保 3.7 本章小结 第4章 虚拟机性能监控与故障处理工具 4.1 概述 4.2 JDK的命令行工具 4.2.1 jps:虚拟机进程状况工具 4.2.2 jstat:虚拟机统计信息监视工具 4.2.3 jinfo:Java配置信息工具 4.2.4 jmap:Java内存映像工具 4.2.5 jhat:虚拟机堆转储快照分析工具 4.2.6 jstack:Java堆栈跟踪工具 4.2.7 HSDIS:JIT生成代码反汇编 4.3 JDK的可视化工具 4.3.1 JConsole:Java监视与管理控制台 4.3.2 VisualVM:多合一故障处理工具 4.4 本章小结 第5章 调优案例分析与实战 5.1 概述 5.2 案例分析 5.2.1 高性能硬件上的程序部署策略 5.2.2 集群间同步导致的内存溢出 5.2.3 堆外内存导致的溢出错误 5.2.4 外部命令导致系统缓慢 5.2.5 服务器JVM进程崩溃 5.2.6 不恰当数据结构导致内存占用过大 5.2.7 由Windows虚拟内存导致的长时间停顿 5.3 实战:Eclipse运行速度调优 5.3.1 调优前的程序运行状态 5.3.2 升级JDK 1.6的性能变化及兼容问题 5.3.3 编译时间和类加载时间的优化 5.3.4 调整内存设置控制垃圾收集频率 5.3.5 选择收集器降低延迟 5.4 本章小结 第三部分 虚拟机执行子系统 第6章 类文件结构 6.1 概述 6.2 无关性的基石 6.3 Class类文件的结构 6.3.1 魔数与Class文件的版本 6.3.2 常量池 6.3.3 访问标志 6.3.4 类索引、父类索引与接口索引集合 6.3.5 字段表集合 6.3.6 方法表集合 6.3.7 属性表集合 6.4 字节码指令简介 6.4.1 字节码与数据类型 6.4.2 加载和存储指令 6.4.3 运算指令 6.4.4 类型转换指令 6.4.5 对象创建与访问指令 6.4.6 操作数栈管理指令 6.4.7 控制转移指令 6.4.8 方法调用和返回指令 6.4.9 异常处理指令 6.4.10 同步指令 6.5 公有设计和私有实现 6.6 Class文件结构的发展 6.7 本章小结 第7章 虚拟机类加载机制 7.1 概述 7.2 类加载的时机 7.3 类加载的过程 7.3.1 加载 7.3.2 验证 7.3.3 准备 7.3.4 解析 7.3.5 初始化 7.4 类加载器 7.4.1 类与类加载器 7.4.2 双亲委派模型 7.4.3 破坏双亲委派模型 7.5 本章小结 第8章 虚拟机字节码执行引擎 8.1 概述 8.2 运行时栈帧结构 8.2.1 局部变量表 8.2.2 操作数栈 8.2.3 动态连接 8.2.4 方法返回地址 8.2.5 附加信息 8.3 方法调用 8.3.1 解析 8.3.2 分派 8.3.3 动态类型语言支持 8.4 基于栈的字节码解释执行引擎 8.4.1 解释执行 8.4.2 基于栈的指令集与基于寄存器的指令集 8.4.3 基于栈的解释器执行过程 8.5 本章小结 第9章 类加载及执行子系统的案例与实战 9.1 概述 9.2 案例分析 9.2.1 Tomcat:正统的类加载器架构 9.2.2 OSGi:灵活的类加载器架构 9.2.3 字节码生成技术与动态代理的实现 9.2.4 Retrotranslator:跨越JDK版本 9.3 实战:自己动手实现远程执行功能 9.3.1 目标 9.3.2 思路 9.3.3 实现 9.3.4 验证 9.4 本章小结 第四部分 程序编译与代码优化 第10章 早期(编译期)优化 10.1 概述 10.2 Javac编译器 10.2.1 Javac的源码与调试 10.2.2 解析与填充符号表 10.2.3 注解处理器 10.2.4 语义分析与字节码生成 10.3 Java语法糖的味道 10.3.1 泛型与类型擦除 10.3.2 自动装箱、拆箱与遍历循环 10.3.3 条件编译 10.4 实战:插入式注解处理器 10.4.1 实战目标 10.4.2 代码实现 10.4.3 运行与测试 10.4.4 其他应用案例 10.5 本章小结 第11章 晚期(运行期)优化 11.1 概述 11.2 HotSpot虚拟机内的即时编译器 11.2.1 解释器与编译器 11.2.2 编译对象与触发条件 11.2.3 编译过程 11.2.4 查看及分析即时编译结果 11.3 编译优化技术 11.3.1 优化技术概览 11.3.2 公共子表达式消除 11.3.3 数组边界检查消除 11.3.4 方法内联 11.3.5 逃逸分析 11.4 Java与CC++的编译器对比 11.5 本章小结 第五部分 高效并发 第12章 Java内存模型与线程 12.1 概述 12.2 硬件的效率与一致性 12.3 Java内存模型 12.3.1 主内存与工作内存 12.3.2 内存间交互操作 12.3.3 对于volatile型变量的特殊规则 12.3.4 对于long和double型变量的特殊规则 12.3.5 原子性、可见性与有序性 12.3.6 先行发生原则 12.4 Java与线程 12.4.1 线程的实现 12.4.2 Java线程调度 12.4.3 状态转换 12.5 本章小结 第13章 线程安全与锁优化 13.1 概述 13.2 线程安全 13.2.1 Java语言中的线程安全 13.2.2 线程安全的实现方法 13.3 锁优化 13.3.1 自旋锁与自适应自旋 13.3.2 锁消除 13.3.3 锁粗化 13.3.4 轻量级锁 13.3.5 偏向锁 13.4 本章小结
2021年06月22日
1,032 阅读
0 评论
0 点赞
2021-06-22
《图灵程序设计丛书:Java程序员修炼之道》Java经典图书 PDF下载
{card-default label="介绍" width=""}《Java程序员修炼之道》是每个Java工程师都必看,也是必须掌握里面知识的图书,他从Java 7 的新特性到,到Java编程技术,再到JVM,最后跨平台和跨语言做了详细的剖析。适合有一定Java基础并决定提高自身能力的Java工程师学习。{/card-default}下载地址{cloud title="" type="bd" url="http://pan.baidu.com/s/1o8wL5UE" password="lne2"/}目录第一部分 用Java 7做开发第1章 初识Java 7 21.1 语言与平台 21.2 Coin项目:浓缩的都是精华 41.3 Coin项目中的修改 71.3.1 switch语句中的String 71.3.2 更强的数值文本表示法 81.3.3 改善后的异常处理 91.3.4 try-with-resources(TWR) 111.3.5 钻石语法 131.3.6 简化变参方法调用 141.4 小结 15第2章 新I/O 172.1 Java I/O简史 182.1.1 Java 1.0到1.3 192.1.2 在Java 1.4中引入的NIO 192.1.3 下一代I/O-NIO.2 202.2 文件I/O的基石:Path 202.2.1 创建一个Path 232.2.2 从Path中获取信息 232.2.3 移除冗余项 242.2.4 转换Path 252.2.5 NIO.2 Path和Java已有的File类 252.3 处理目录和目录树 262.3.1 在目录中查找文件 262.3.2 遍历目录树 272.4 NIO.2的文件系统I/O 282.4.1 创建和删除文件 292.4.2 文件的复制和移动 302.4.3 文件的属性 312.4.4 快速读写数据 342.4.5 文件修改通知 352.4.6 SeekableByteChannel 372.5 异步 I/O操作 372.5.1 将来式 382.5.2 回调式 402.6 Socket和Channel的整合 412.6.1 NetworkChannel 422.6.2 MulticastChannel 422.7 小结 43第二部分 关键技术第3章 依赖注入 463.1 知识注入:理解IoC和DI 463.1.1 控制反转 473.1.2 依赖注入 483.1.3 转成DI 493.2 Java中标准化的DI 533.2.1 @Inject注解 543.2.2 @Qualifier注解 553.2.3 @Named注解 573.2.4 @Scope注解 573.2.5 @Singleton注解 573.2.6 接口Provider<T> 583.3 Java中的DI参考实现:Guice 3 593.3.1 Guice新手指南 593.3.2 水手绳结:Guice的各种绑定 623.3.3 在Guice中限定注入对象的生命周期 643.4 小结 66第4章 现代并发 674.1 并发理论简介 684.1.1 解释Java线程模型 684.1.2 设计理念 694.1.3 这些原则如何以及为何会相互冲突 704.1.4 系统开销之源 714.1.5 一个事务处理的例子 714.2 块结构并发(Java 5之前) 724.2.1 同步与锁 734.2.2 线程的状态模型 744.2.3 完全同步对象 744.2.4 死锁 764.2.5 为什么是synchronized 774.2.6 关键字volatile 784.2.7 不可变性 794.3 现代并发应用程序的构件 804.3.1 原子类:java.util. concurrent.atomic 814.3.2 线程锁:java.util. concurrent.locks 814.3.3 CountDownLatch 854.3.4 ConcurrentHashMap 864.3.5 CopyOnWriteArrayList 874.3.6 Queue 904.4 控制执行 954.4.1 任务建模 964.4.2 ScheduledThread-PoolExecutor 974.5 分支/合并框架 984.5.1 一个简单的分支/合并例子 994.5.2 ForkJoinTask与工作窃取 1014.5.3 并行问题 1024.6 Java内存模型 1034.7 小结 104第5章 类文件与字节码 1065.1 类加载和类对象 1075.1.1 加载和连接概览 1075.1.2 验证 1085.1.3 Class对象 1085.1.4 类加载器 1095.1.5 示例:依赖注入中的类加载器 1105.2 使用方法句柄 1115.2.1 MethodHandle 1125.2.2 MethodType 1125.2.3 查找方法句柄 1135.2.4 示例:反射、代理与方法句柄 1145.2.5 为什么选择MethodHandle 1165.3 检查类文件 1175.3.1 介绍javap 1175.3.2 方法签名的内部形式 1185.3.3 常量池 1195.4 字节码 1215.4.1 示例:反编译类 1215.4.2 运行时环境 1235.4.3 操作码介绍 1245.4.4 加载和储存操作码 1255.4.5 数学运算操作码 1255.4.6 执行控制操作码 1265.4.7 调用操作码 1265.4.8 平台操作操作码 1275.4.9 操作码的快捷形式 1275.4.10 示例:字符串拼接 1275.5 invokedynamic 1295.5.1 invokedynamic如何工作 1295.5.2 示例:反编译invokedynamic调用 1305.6 小结 132第6章 理解性能调优 1336.1 性能术语 1346.1.1 等待时间 1356.1.2 吞吐量 1356.1.3 利用率 1356.1.4 效率 1356.1.5 容量 1366.1.6 扩展性 1366.1.7 退化 1366.2 务实的性能分析法 1366.2.1 知道你在测量什么 1376.2.2 知道怎么测量 1376.2.3 知道性能目标是什么 1386.2.4 知道什么时候停止优化 1396.2.5 知道高性能的成本 1396.2.6 知道过早优化的危险 1406.3 哪里出错了?我们担心的原因 1406.3.1 过去和未来的性能趋势:摩尔定律 1416.3.2 理解内存延迟层级 1426.3.3 为什么Java性能调优存在困难 1436.4 一个来自于硬件的时间问题 1446.4.1 硬件时钟 1446.4.2 麻烦的nanoTime() 1446.4.3 时间在性能调优中的作用 1466.4.4 案例研究:理解缓存未命中 1476.5 垃圾收集 1496.5.1 基本算法 1496.5.2 标记和清除 1506.5.3 jmap 1526.5.4 与GC相关的JVM参数 1556.5.5 读懂GC日志 1566.5.6 用VisualVM查看内存使用情况 1576.5.7 逸出分析 1596.5.8 并发标记清除 1606.5.9 新的收集器:G1 1616.6 HotSpot的JIT编译 1626.6.1 介绍HotSpot 1636.6.2 内联方法 1646.6.3 动态编译和独占调用 1656.6.4 读懂编译日志 1666.7 小结 167第三部分 JVM上的多语言编程第7章 备选JVM语言 1707.1 Java 太笨?纯粹诽谤 1707.1.1 整合系统 1717.1.2 函数式编程的基本原理 1727.1.3 映射与过滤器 1737.2 语言生态学 1747.2.1 解释型与编译型语言 1757.2.2 动态与静态类型 1757.2.3 命令式与函数式语言 1767.2.4 重新实现的语言与原生语言 1767.3 JVM上的多语言编程 1777.3.1 为什么要用非Java语言 1787.3.2 崭露头角的语言新星 1797.4 如何挑选称心的非Java语言 1807.4.1 低风险 1817.4.2 与Java的交互操作 1817.4.3 良好的工具和测试支持 1827.4.4 备选语言学习难度 1827.4.5 使用备选语言的开发者 1827.5 JVM对备选语言的支持 1837.5.1 非Java语言的运行时环境 1837.5.2 编译器小说 1847.6 小结 185第8章 Groovy:Java的动态伴侣 1878.1 Groovy入门 1898.1.1 编译和运行 1898.1.2 Groovy控制台 1908.2 Groovy 101:语法和语义 1918.2.1 默认导入 1928.2.2 数字处理 1928.2.3 变量、动态与静态类型、作用域 1938.2.4 列表和映射语法 1958.3 与Java的差异——新手陷阱 1968.3.1 可选的分号和返回语句 1968.3.2 可选的参数括号 1978.3.3 访问限定符 1978.3.4 异常处理 1988.3.5 Groovy中的相等 1988.3.6 内部类 1998.4 Java不具备的Groovy特性 1998.4.1 GroovyBean 1998.4.2 安全解引用操作符 2008.4.3 猫王操作符 2018.4.4 增强型字符串 2018.4.5 函数字面值 2028.4.6 内置的集合操作 2038.4.7 对正则表达式的内置支持 2048.4.8 简单的XML处理 2058.5 Groovy与Java的合作 2078.5.1 从Groovy调用Java 2078.5.2 从Java调用Groovy 2088.6 小结 211第9章 Scala:简约而不简单 2129.1 走马观花Scala 2139.1.1 简约的Scala 2139.1.2 match表达式 2159.1.3 case类 2179.1.4 actor 2189.2 Scala能用在我的项目中吗 2199.2.1 Scala和Java的比较 2199.2.2 何时以及如何开始使用Scala 2209.2.3 Scala可能不适合当前项目的迹象 2209.3 让代码因Scala重新绽放 2219.3.1 使用编译器和REPL 2219.3.2 类型推断 2229.3.3 方法 2239.3.4 导入 2249.3.5 循环和控制结构 2249.3.6 Scala的函数式编程 2259.4 Scala对象模型:相似但不同 2269.4.1 一切皆对象 2269.4.2 构造方法 2289.4.3 特质 2289.4.4 单例和伴生对象 2309.4.5 case类和match表达式 2329.4.6 警世寓言 2349.5 数据结构和集合 2359.5.1 List 2359.5.2 Map 2389.5.3 泛型 2399.6 actor介绍 2429.6.1 代码大舞台 2429.6.2 用mailbox跟actor通信 2439.7 小结 244第10章 Clojure:更安全地编程 24510.1 Clojure介绍 24510.1.1 Clojure的Hello World 24610.1.2 REPL入门 24710.1.3 犯了错误 24810.1.4 学着去爱括号 24810.2 寻找Clojure:语法和语义 24910.2.1 特殊形式新手营 24910.2.2 列表、向量、映射和集 25010.2.3 数学运算、相等和其他操作 25210.3 使用函数和循环 25310.3.1 一些简单的Clojure函数 25310.3.2 Clojure中的循环 25510.3.3 读取器宏和派发器 25610.3.4 函数式编程和闭包 25710.4 Clojure序列 25810.4.1 懒序列 26010.4.2 序列和变参函数 26110.5 Clojure与Java的互操作 26210.5.1 从Clojure中调用Java 26210.5.2 Clojure值的Java类型 26310.5.3 使用Clojure代理 26410.5.4 用REPL做探索式编程 26410.5.5 在Java中使用Clojure 26510.6 Clojure并发 26510.6.1 未来式与并行调用 26610.6.2 ref形式 26710.6.3 代理 27110.7 小结 272第四部分 多语种项目开发第11章 测试驱动开发 27411.1 TDD概览 27511.1.1 一个测试用例 27611.1.2 多个测试用例 28011.1.3 深入思考红—绿—重构循环 28211.1.4 JUnit 28311.2 测试替身 28511.2.1 虚设对象 28611.2.2 存根对象 28711.2.3 伪装替身 29011.2.4 模拟对象 29511.3 ScalaTest 29611.4 小结 298第12章 构建和持续集成 30012.1 与Maven 3相遇 30212.2 Maven 3入门项目 30312.3 用Maven 3构建Java7developer项目 30512.3.1 POM 30512.3.2 运行示例 31112.4 Jenkins:满足CI需求 31412.4.1 基础配置 31512.4.2 设置任务 31612.4.3 执行任务 31912.5 Maven和Jenkins代码指标 32012.5.1 安装Jenkins插件 32112.5.2 用Checkstyle保持代码一致性 32212.5.3 用FindBugs设定质量标杆 32312.6 Leiningen 32512.6.1 Leiningen入门 32612.6.2 Leiningen的架构 32612.6.3 Hello Lein 32712.6.4 用Leiningen做面向REPL的TDD 32912.6.5 用Leiningen打包和部署 33012.7 小结 332第13章 快速Web开发 33313.1 Java Web框架的问题 33413.1.1 Java编译为什么不好 33513.1.2 静态类型为什么不好 33513.2 选择Web框架的标准 33613.3 Grails入门 33813.4 Grails快速启动项目 33813.4.1 创建域对象 34013.4.2 测试驱动开发 34013.4.3 域对象持久化 34213.4.4 创建测试数据 34313.4.5 控制器 34313.4.6 GSP/JSP页面 34413.4.7 脚手架和UI的自动化创建 34613.4.8 快速周转的开发 34713.5 深入Grails 34713.5.1 日志 34713.5.2 GORM:对象关系映射 34813.5.3 Grails插件 34913.6 Compojure入门 35013.6.1 Hello Compojure 35013.6.2 Ring和路由 35213.6.3 Hiccup 35313.7 我是不是一只水獭 35313.7.1 项目设置 35413.7.2 核心函数 35713.8 小结 359第14章 保持优秀 36114.1 对Java 8的期待 36114.1.1 lambda表达式(闭包) 36214.1.2 模块化(拼图Jigsaw) 36314.2 多语言编程 36514.2.1 语言的互操作性及元对象协议 36514.2.2 多语言模块化 36614.3 未来的并发趋势 36714.3.1 多核的世界 36714.3.2 运行时管理的并发 36714.4 JVM的新方向 36814.4.1 VM的合并 36814.4.2 协同程序 36914.4.3 元组 37014.5 小结 372
2021年06月22日
845 阅读
0 评论
0 点赞
2021-06-22
《Java编程思想 第四版》Thinking in Java 经典书籍 中文完整版 PDF下载
{card-default label="介绍" width=""}Thinking in java是一本经典的java学习图书,本书共22章,包括操作符、控制执行流程、访问权限控制、复用类、多态、接口、通过异常处理错误、字符串、泛型、数组、容器深入研究、JavaI/O系统、枚举类型、并发以及图形化用户界面等内容。这些丰富的内容,包含了Java语言基础语法以及高级特性,适合各个层次的Java程序员阅读。{/card-default}下载地址百度云盘下载地址(提取密码:isnx):链接:http://pan.baidu.com/s/1skEGhjv目录第1章 对象导论1.1 抽象过程1.2 每个对象都有一个接口1.3 每个对象都提供服务1.4 被隐藏的具体实现1.5 复用具体实现1.6 继承1.6.1 “是一个”(is-a)与“像是一个”(is-like-a)关系1.7 伴随多态的可互换对象1.8 单根继承结构1.9 容器1.9.1 参数化类型(范型)1.10 对象的创建和生命期1.11 异常处理:处理错误1.12 并发编程1.13 Java与Internet1.13.1 Web是什么1.13.2客户端编程1.13.3 服务器端编程1.22 总结第2章 一切都是对象2.1 用引用操纵对象2.2 必须由你创建所有对象2.2.1 存储到什么地方2.2.2 特例:基本类型2.2.3 Java中的数组2.3 永远不需要销毁对象2.3.1 作用域2.3.2 对象的作用域2.4 创建新的数据类型:类2.4.1 域和方法2.4.2 基本成员默认值2.5 方法、参数和返回值2.5.1 参数列表2.6 构建一个Java程序2.6.1 名字可见性2.6.2 运用其他构件2.6.3 static 关键字2.7 你的第一个Java程序编译和运行2.8 注释和嵌入式文档2.8.1 注释文档2.8.2 语法2.8.3 嵌入式HTML2.8.4 一些标签示例2.8.5 文档示例2.9 编码风格2.10 总结2.11 练习第3章 操作符3.1 更简单的打印语句3.2 使用Java操作符3.3 优先级3.4 赋值3.4.1 方法调用中的别名问题3.5 算术操作符3.5.1 一元加、减操作符3.6 自动递增和递减3.7 关系操作符3.7.1 测试对象的等价性3.8 逻辑操作符3.8.1 短路3.9 直接常量3.9.1 指数记数法3.10 按位操作符3.11 移位操作符3.12 三元操作符 if-else3.13 字符串操作符 + 和 +=3.14 使用操作符时常犯的错误3.15 类型转换操作符3.15.1 截尾和舍入3.15.2提升3.16 Java没有“sizeof”3.17 操作符小结3.18 总结第4章 控制执行流程4.1 true和false4.2 if-else4.3 迭代4.3.1 do-while4.3.2 for4.3.3 逗号操作符4.4 Foreach语法4.5 return4.6 break和 continue4.7 臭名昭著的“goto”4.8 switch4.9 总结第5章 初始化与清理5.1 用构造器确保初始化5.2 方法重载5.2.1 区分重载方法5.2.2 涉及基本类型的重载5.2.3 以返回值区分重载方法5.3 缺省构造器5.4 this关键字5.4.1 在构造器中调用构造器5.4.2 static的含义5.5 清理:终结处理和垃圾回收5.5.1 finalize()的用途何在5.5.2 你必须实施清理5.5.3 终结条件5.5.4 垃圾回收器如何工作5.6 成员初始化5.6.1 指定初始化5.7 构造器初始化5.7.1 初始化顺序5.7.2. 静态数据的初始化5.7.3. 显式的静态初始化5.7.4. 非静态实例初始化5.8 数组初始化5.8.1 可变参数列表5.9 枚举类型5.10 总结第6章 访问权限控制第7章 复用类第8章 多态第9章 接口第10章 内部类第11章 持有对象第12章 通过异常处理错误第13章 字符串第14章 类型信息第15章 泛型第16章 数组第17章 容器深入研究第18章 Java I/O系统第19章 枚举类型第20章 注解第21章 并发第22章 图形化用户界面
2021年06月22日
1,443 阅读
0 评论
0 点赞
2021-06-06
java多线程之ThreadLocal类
ThreadLocal是⼀个本地线程副本变量⼯具类。内部是⼀个弱引⽤的Map来维护。这⾥不详细介绍它的原理,⽽是只是介绍它的使⽤,以后有独⽴章节来介绍ThreadLocal类的原理。有些朋友称ThreadLocal为线程本地变量或线程本地存储。严格来说,ThreadLocal类并不属于多线程间的通信,⽽是让每个线程有⾃⼰”独⽴“的变量,线程之间互不影响。它为每个线程都创建⼀个副本,每个线程可以访问⾃⼰内部的副本变量。ThreadLocal类最常⽤的就是set⽅法和get⽅法。package com.company; public class ThreadLocalDemo { static class ThreadA implements Runnable{ private final ThreadLocal<String> threadLocal; public ThreadA(ThreadLocal<String> threadLocal){ this.threadLocal=threadLocal; } @Override public void run() { threadLocal.set("A"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThreadA输出:" + threadLocal.get()); } } static class ThreadB implements Runnable{ private final ThreadLocal<String> threadLocal; public ThreadB(ThreadLocal<String> threadLocal){ this.threadLocal=threadLocal; } @Override public void run() { threadLocal.set("B"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("ThreadB输出:" + threadLocal.get()); } } public static void main(String[] args){ ThreadLocal<String> threadLocal = new ThreadLocal<>(); new Thread(new ThreadA(threadLocal)).start(); new Thread(new ThreadB(threadLocal)).start(); } }
2021年06月06日
826 阅读
0 评论
0 点赞
2021-06-06
Java线程间的通信之等待/通知机制
上⾯⼀种基于“锁”的⽅式,线程需要不断地去尝试获得锁,如果失败了,再继续尝试。这可能会耗费服务器资源。⽽等待/通知机制是另⼀种⽅式。Java多线程的等待/通知机制是基于Object类的wait()⽅法和notify(),notifyAll()⽅法来实现的。{message type="success" content="notify()⽅法会随机叫醒⼀个正在等待的线程,⽽notifyAll()会叫醒所有正在等待的线程。"/}前⾯我们讲到,⼀个锁同⼀时刻只能被⼀个线程持有。⽽假如线程A现在持有了⼀个锁lock并开始执⾏,它可以使⽤lock.wait() 让⾃⼰进⼊等待状态。这个时候,lock这个锁是被释放了的。这时,线程B获得了lock这个锁并开始执⾏,它可以在某⼀时刻,使⽤lock.notify(),通知之前持有lock锁并进⼊等待状态的线程A,说“线程A你不⽤等了,可以往下执⾏了”。{message type="warning" content="需要注意的是,这个时候线程B并没有释放锁lock,除⾮线程B这个时候使⽤lock.wait()释放锁,或者线程B执⾏结束⾃⾏释放锁,线程A才能得到lock锁。"/}package com.company; import java.util.stream.IntStream; public class WaitAndNotify { private static Object lock = new Object(); static class ThreadA implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadA:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } static class ThreadB implements Runnable{ @Override public void run() { synchronized (lock){ IntStream.range(1,5).forEach(i->{ System.out.println("ThreadB:"+i); lock.notify(); try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(1000); new Thread(new ThreadB()).start(); } } {message type="info" content="需要注意的是等待/通知机制使⽤的是使⽤同⼀个对象锁,如果你两个线程使⽤的是不同的对象锁,那它们之间是不能⽤等待/通知机制通信的。"/}
2021年06月06日
875 阅读
0 评论
1 点赞
2021-06-06
Java线程间的通信之锁与同步
在Java中,锁的概念都是基于对象的,所以我们⼜经常称它为对象锁。线程和锁的关系,我们可以⽤婚姻关系来理解。⼀个锁同⼀时间只能被⼀个线程持有。也就是说,⼀个锁如果和⼀个线程“结婚”(持有),那其他线程如果需要得到这个锁,就得等这个线程和这个锁“离婚”(释放)。在我们的线程之间,有⼀个同步的概念。什么是同步呢,假如我们现在有2位正在抄暑假作业答案的同学:线程A和线程B。当他们正在抄的时候,⽼师突然来修改了⼀些答案,可能A和B最后写出的暑假作业就不⼀样。我们为了A,B能写出2本相同的暑假作业,我们就需要让⽼师先修改答案,然后A,B同学再抄。或者A,B同学先抄完,⽼师再修改答案。这就是线程A,线程B的线程同步。可以以解释为:线程同步是线程之间按照⼀定的顺序执⾏。为了达到线程同步,我们可以使⽤锁来实现它。我们先来看看⼀个⽆锁的程序:package com.company; import java.util.stream.IntStream; public class NoneLock { static class ThreadA implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } static class ThreadB implements Runnable { @Override public void run() { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } public static void main(String[] args) { new Thread(new ThreadA()).start(); new Thread(new ThreadB()).start(); } } 某次的运行结果那我现在有⼀个需求,我想等A先执⾏完之后,再由B去执⾏,怎么办呢?最简单的⽅式就是使⽤⼀个“对象锁”:package com.company; import java.util.stream.IntStream; public class ObjectLock { private static final Object lock = new Object(); static class ThreadA implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadA:" + i); }); } } } static class ThreadB implements Runnable { @Override public void run() { synchronized (lock) { IntStream.range(1, 100).forEach(i -> { System.out.println("threadB:" + i); }); } } } public static void main(String[] args) throws InterruptedException { new Thread(new ThreadA()).start(); Thread.sleep(10); new Thread(new ThreadB()).start(); } }
2021年06月06日
918 阅读
0 评论
0 点赞
2020-12-28
java8 list统计(求和、最大、最小、平均)
list.stream().mapToDouble(User::getHeight).sum()//和 list.stream().mapToDouble(User::getHeight).max()//最大 list.stream().mapToDouble(User::getHeight).min()//最小 list.stream().mapToDouble(User::getHeight).average()//平均值
2020年12月28日
1,284 阅读
0 评论
0 点赞
2020-11-20
Java金额格式化去掉小数点后不需要的零
平时我们在开发过程中,金额一般都是格式化成特定位数,比如人民币金额一般格式化成10.25元这种,但是有时候,我们在打印一些小数时,不希望显示小数点后无用的0,比如3.20输出3.2,这时候就需要使用NSFormat类了。 BigDecimal bigDecimal = new BigDecimal("3.20"); NumberFormat numberFormat = NumberFormat.getInstance(); System.out.println(numberFormat.format(bigDecimal));
2020年11月20日
1,572 阅读
0 评论
0 点赞
2020-09-26
Mac查看已安装的jdk版本以及目录
最近学习https,想着借助java自带的keytool配置一下springboot的htts,因为需要进入%java_home%/bin。查看java目录命令如下/usr/libexec/java_home -V
2020年09月26日
1,526 阅读
0 评论
1 点赞
2019-07-10
修改tomcat配置映射去掉URL中的项目名
Tomcat文件目录conf/server.xml:host节点下添加<Context path="" docBase="projectname" debug="0" reloadable="true"/> 注意:在项目部署了以后在修改,修改了以后重启tomcat,修改了以后会影响到tomcat的控制台页面的运行 <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="projectname" debug="0" reloadable="true"/> </host>
2019年07月10日
1,274 阅读
0 评论
0 点赞
2019-05-05
jsp中文乱码问题
初学JSP,尤其是Tomcat环境,经常会因为中文汉字字符集设置问题导致中文乱码,本文就这一问题提出解决方案,解决中文乱码问题,供各位参考,我采用的方案是统一字符集至UTF-8,同时避免GB2312所带来的中文字符集不够用的隐患,需注意的地方有三点,默认情况下是英文字符集。Tomcat 的 server.xml 文件,设置服务器端口工作方式Servlet 和 JavaBean 对字符串字符集处理的统一JSP页面的字符集统一完成这三点统一,中文想乱码都难,如果使用MySQL的话,数据表也需要做UTF-8统一。修改Tomcat的server.xml文件,该文件位于 tomcat/conf,红色部分为添加部分,也就是当前使用的HTTP端口的连接方式的设置。找到Connector 标签,使 Tomcat 服务器以UTF-8模式进行工作,从底层对乱码进行处理,修改如下:<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 运行代码内设置如下:JavaBean 和 Servlet 内需要处理中文的地方之前,或者所有函数最前端加上request.setCharacterEncoding ("UTF-8"); response.setCharacterEncoding ("UTF-8");避免在 JavaBean 和 Servlet 内出现汉字乱码。JSP代码中的 JAVA 字符编码设置,在页面上对乱码进行处理。<%@page contentType="text/html"%> <%@page pageEncoding="UTF-8"%>红色为制定JSP处理字符采用UTF-8编码处理方式。<div class="dp-highlighter nogutter"><div class="bar"></div><ol start="1" class="dp-j"><li class="alt"><span><span><%request.setCharacterEncoding (</span><span class="string">"UTF-8"</span><span>);%> </span></span></li></ol></div>JSP内JAVA代码设定接收参数为UTF-8编码JSP 内 HTML 头的编码设置,页面处理以UTF-8,避免显示乱码。<form action=index.jsp method="post"><h3>Please Input Your Name:</h3> <input type="text" size="30" name="中文名字" value="" > <input type=submit value="提交"> </form>接收代码如下:<% // 通过二进制传递的参数,因为UTF-8的设置,无须转换,直接中文操作,而不会出现乱码。 String temp1 = request.getParameter ("yourname"); …… %>采用get方式略有不同,若只采用以上设定,遇中文参数,因编码不同,会导致部分文字信息丢失,所以在提交前务必进行编码,这里用到两个函数java.net.URLDecoder.decode 和java.net.URLDecoder.encode,分别是编码和解码。<a href=" <%=request.getContextPath()%>/index.jsp?传递的参数名= <%=java.net.URLEncoder.encode (传递的汉字变量,"UTF-8")%>"> <%=超链接热点显示内容%> </a>作为参数传递的中文,由 java.net.URLEncoder.encode函数将要发送的变量解析为16进制数字编码,进行URL传递,接收代码如下:<%String str = request.getParameter ("传递的参数名");%> 由此,获得参数后的 str 内将是正确的中文信息,完全避免了乱码的显示。可用 java.net.URLDecoder.decode 函数例如<% String str1 = java.net.URLDecoder.decode(request.getParameter("传递的参数名"),"UTF-8"); %>
2019年05月05日
1,122 阅读
0 评论
1 点赞
1
...
3
4
5