java-guide's Issues
文件操作
- 先进行标准化处理,再进行文件路径校验
使用getCanonicalPath()
,禁止使用getAbsolutePath()
- 从ZipInputStream中解压文件需要进行安全检查
https://wiki.sei.cmu.edu/confluence/display/java/IDS04-J.+Safely+extract+files+from+ZipInputStream
- xml注入
https://wiki.sei.cmu.edu/confluence/display/java/IDS16-J.+Prevent+XML+Injection
https://wiki.sei.cmu.edu/confluence/display/java/IDS17-J.+Prevent+XML+External+Entity+Attacks
类加载
Class.forName和ClassLoader.loadClass都能加载类,这两者在加载类时的区别?
异常分类
Java中所有异常,都继承自java.lang.Throwable类。Throwable有两个直接子类,Error类和Exception类。
Exception可分为执行异常(RuntimeException)和检查异常(Checked Exceptions)两种。
隐藏、遮蔽、遮掩
-
隐藏(hide):子类与父类间
-
遮蔽(shadow):类内部
-
遮掩(obscure):类内部
逃逸分析
即时编译器判断对象逃逸的依据有两个:一是看对象是否被存入堆中,二是看对象是否作为方法调用的调用者或者参数
https://zhuanlan.zhihu.com/p/69136675
逃逸分析必须在serer模式下才会开启,逃逸分析带来的优化点是:
-
栈上分配
-XX: +DoEscapeAnalysis
-
标量替换
-XX: +EliminateAllocations
-
锁消除
无法保证逃逸分析的性能消耗一定能高于其他的消耗。逃逸分析自身需要进行一系列的复杂分析,这其实是一个相对耗时的过程。
部分逃逸分析是一种附带了控制流信息的逃逸分析。它将判断新建对象真正逃逸的分支,并且支持将新建操作推延至逃逸分支
锁
- Synchronized
- ReentrantLock
- ReentrantReadWriteLock
- StampedLock
- 乐观锁LongAdder
异步编程
Promise 模式 CompletableFuture
内存模型
硬件内存模型
硬件内存模型的目标是为了让汇编代码能够运行在一个具有一致性的内存视图上。
指令重排相关知识点
- Store Buffer
- Store Forwarding
- Invalid Queue
- 写屏障
- 内存屏障
java内存模型
屏蔽了硬件和操作系统的内存访问差异,实现了让Java程序都能够按照预期的方式来运行。
内存读写指令
作用于主存 作用于工作线程
lock:锁定 load:载入
unlock:解锁 use:使用
read:读取 assign:赋值
write:写入 store:存储
happens-before原则
- 程序顺序原则
- 锁定原则
- volatile原则
- 线程启动原则
- 线程结束原则
- 中断原则
- 终结器原则
- 传递性原则
重载方法
具有不同的方法签名,相同的方法名
Java语法:方法签名 = 方法名 + 参数类型 + 参数顺序
JVM:方法签名 = 方法名 + 参数类型 + 参数顺序 + 返回值类型
EntryList与WaitSet
创建线程的方法
安全点 && 安全区域
程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置被称为安全点(safe point)
安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域的任何位置开始GC都是安全的。
io模型
副作用表达式
互斥锁的属性
-
PTHREAD_MUTEX_THREAD_NP:这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的进程将会形成一个等待队列,并且在解锁后按照优先级获取到锁,这种策略可以确保资源分配的公平性。
-
PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁。允许同一个线程对同一个锁成功获取多次,并且通过unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新进行竞争。
-
PTHREAD_MUTEX_ERRORCHECK_NP:检错锁。如果一个线程请求同一个锁,则返回EDEADLK,否则与PTHREAD_MUTEX_THREAD_NP类型动作相同,这样就保证了当不允许多次加锁时不会出现最简单情况下的死锁。
-
PTHREAD_MUTEX_ADAPTIVE_NP:适应锁。动作最简单的锁类型,仅仅等待解锁后进行重新竞争。
浅拷贝 vs 深拷贝
To Donnie
java8日期
jdk8中,考虑使用Instant代替Date,LocalDateTime代替Calendar,DateTimeFormatter代替SimpleDateFormat
JVM锁降级
类的卸载机制
接口Interface
不能用protected
,final
,private
修饰,可用abstract
修饰
默认的属性是public static final
默认的方法修饰是 public abstract
加密算法
禁止使用私有的加密算法,禁止使用弱加密算法。
推荐的加密算法有:
-
对称加密算法: AES
-
非对称加密算法:RSA
-
数字签名算法: DSA,ECDSA
-
安全哈希算法: SHA256,如果使用哈希算法来存储口令,则必须加入盐值,salt至少应该包含8字节且是安全随机数
浮点数比较
浮点数比较相等的方法是绝对值得差值要小于1E-6F
java.lang.Process对象
java.lang.Runtime类的exec()方法与相关联的ProcessBuilder.start()方法可以被用来调用外部程序进程。
java.lang.Process对象包含一个输入流,输出流,错误流。
如何打破双亲委派机制
及时编译器代码优化
方法内联
- 通过设置JVM参数来减小热点阈值或增加方法体阈值,以便更多的方法可以进行内联,但这种方法意味着需要占用更多地内存
- 在编程中,避免在一个方法中写大量代码,习惯使用小方法体
- 尽量使用final、private、static关键字修饰方法,编码方法因为继承,会需要额外的类型检查
字段访问相关优化
- 字段读取优化
- 字段存储优化
- 死代码消除
即时编译器将沿着控制流缓存字段存储、读取的值,并在接下来的字段读取操作时直接使用该缓存值。这要求生成缓存值的访问以及使用缓存值的读取之间没有方法调用、内存屏障,或者其他可能存储该字段的节点。
即时编译器还会优化冗余的字段存储操作。如果一个字段的两次存储之间没有对该字段的读取操作、方法调用以及内存屏障,那么即时编译器可以将第一个冗余的存储操作给消除掉。
死代码消除的两种形式。第一种是局部变量的死存储消除以及部分死存储消除。它们可以通过转换为Sea-of-Nodes IR来完成。第二种则是不可达分支。通过消除不可达分支,即时编译器可以精简数据流,并且减少编译时间以及最终生成机器码的大小。
循环优化
- 循环无关代码外提
- 循环展开
- 其他循环优化(循环判断外提、循环剥离)
向量化
向量化优化借助的是CPU的SIMD指令,即通过单条指令控制多组数据的运算。它被称为CPU指令级别的并行。
Thread
使用Thread对象的setUncaughtExceptionHandler 方法注册未捕获异常处理者
安全检查
安全检查主要是指调用SecurityManager执行的安全检查。
临界区
指的是某一块代码区域,它同一时刻只能由一个线程执行
静态链接 vs 动态链接 && 早期绑定 vs 晚期绑定
自旋锁
- TicketLock
- CLHlock
- MCSlock
JIT
契约式设计、防御式编程
沙箱安全机制
java安全模型的核心就是Java沙箱(sandbox)
沙箱主要限制系统资源访问
沙箱是一个限制程序运行的环境。沙箱机制就是将Java代码限定在JVM特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证对代码的有效隔离,防止对本地系统造成破坏。
SQL注入
SQL注入是指原始SQL查询被恶意动态更改成一个与程序预期完全不同的查询。执行更改后的查询可能会导 致信息泄露或者数据被篡改。防止SQL注入的方式主要有以下三类:
- 使用参数化查询
- 对不可信数据进行白名单校验
- 对不可信数据进行转码
参数化查询是优先考虑使用的,简单有效,还能提高访问性能。
lock comxchg
PECS原则(Producer Extends Consumer Super)
- 频繁往外读取内容的,适合用 <? extends T>
- 经常往里插入的,适合用 <? super T>
To PP
kubernates:
Borg, Omega, and Kubernetes
《Kubernetes in Action》
(https://kubernetesbootcamp.github.io/kubernetes-bootcamp/)
https://github.com/veggiemonk/awesome-docker
https://github.com/ramitsurana/awesome-kubernetes
Kubernetes tips & tricks
Achieving CI/CD with Kubernetes
How to Set Up Scalable Jenkins on Top of a Kubernetes Cluster
10 Most Common Reasons Kubernetes Deployments Fail Part I 和 Part II
How to Monitor Kubernetes ,一共有4个篇章
Logging in Kubernetes with Fluentd and Elasticsearch
Kubernetes Monitoring: Best Practices, Methods, and Existing Solutions
Kubernetes 101 - Networking
Kubernetes networking 101 - Pods
Kubernetes networking 101 - Services
Kubernetes networking 101 - (Basic) External access into the cluster
Kubernetes Networking 101 - Ingress resources
Getting started with Calico on Kubernetes
The New Stack eBook Series ,非常完整和详实的 Docker 和 Kubernetes 生态圈的所有东西。
Book 01: The Docker Container Ecosystem
Book 02: Applications & Microservices with Docker & Containers
Book 03: Automation & Orchestration with Docker & Containers
Book 04: Network, Security & Storage with Docker & Containers
Book 05: Monitoring & Management with Docker & Containers
Book 06: Use Cases for Kubernetes
Book 07: State of the Kubernetes Ecosystem
Book 08: Kubernetes Deployment & Security Patterns
Book 09: CI/CD with Kubernetes
Book 10: Kubernetes solutions Directory
Book 11: Guid to Cloud-Native Microservices
为什么程序运行后5s创建的对象,对象头中锁的信息是偏向锁,而之前创建的都是无锁状态?
GC调优策略
- 降低Minor GC频率
- 降低Full GC的频率
- 减少创建大对象
- 增大堆内存空间
- 选择合适的GC回收器
this逃逸问题
this 逃逸是指在构造函数返回之前其他线程就持有该对象的引用. 调用尚未构造完全的对象的方法可能引发令人疑惑的错误。
并发编程建议
1)AQS建议补充countdownlatch
2)建议补充volatile关键字及synchronized关键字的用法及区别
3)补充CAS相关概念
4)新增atomic原子类相关内容及实例
不要增加重载或隐藏方法的可访问性
对于实现了java.lang.Cloneable接口的类,应该将方法clone()的可访问性从protected增加为public
禁止向Runtime.exec()方法或 java.lang.ProcessBuilder类传递不可信数据
对输入数据进行检查和净化
对不可信字段进行转码处理 -> 开源组件esapi
SPI机制
编译和运行JMH项目
jvm slot为什么是四个字节
JavaAgent
- CGlib
- AspectJ
- JavaAgent
判断一个类型是否属于“不再被使用的类”?
- 该类所有的实例都已经被回收,也就是Java堆中不存在该类及其任何派生子类的实例
- 加载该类的类加载器已经被回收
- 该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力。
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.