JAVA

JAVA这两年

JAVA 这两年最重要的项目就是GRAAL的正式版发布。 GRAAL能做什么? 让解释性程序例如JAVA, JS 运行的更快: AOT编译为宿主二进制可执行文件, 启动时间小于100ms, 像C, GO, ERLANG一样的执行速度 更低的内存占用:只占用传统的JVM应用20%的内存 听起来是不是该项目为函数计算做准备的? 是,但不完全是。 GRAAL的官方目标是提供一个统一的虚拟机执行平台,支持如下运行环境: JavaScrip Python Ruby R JVM 语言(Java, Scala, Groovy, Kotlin, Clojure) LLVM语言 (C , C++) 而且不同语言之间零成本互相调用 安装 wget https://github.com/oracle/graal/releases/download/vm-19.2.1/graalvm-ce-linux-amd64-19.2.1.tar.gz tar zxvf graalvm-ce-linux-amd64-19.2.1.tar.gz export PATH=$PATH:$GRAAL_HOME/bin 检查 js --version GraalVM JavaScript (GraalVM CE Native 19.2.1) 安装native-image gu install native-image gu available Downloading: Component catalog from www.graalvm.org ComponentId Version Component name Origin -------------------------------------------------------------------------------- llvm-toolchain 19.

Dockering Java 8

Improve docker container detection and resource configuration usage https://blog.softwaremill.com/docker-support-in-new-java-8-finally-fd595df0ca54 https://www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html

Groovy Notes

Allow more ways of creating objects using literals Introduce new datatypes together with their operators and expressions. Closure simple abbreviated syntax of closures: after a method call, put code in braces with parameters delimited from the closure body by an arrow. log = '' (1..10).each{ log += it } assert log == '12345678910' log = '' (1..10).each{ counter -> log += counter } assert log == '12345678910' A second way of declaring a closure is to directly assign it to a variable:

Lang Java Spring Cloud

spring-cloud-greenwich-release To get started with Maven with a BOM (dependency management only): <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Greenwich.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> </dependencies>

Lang Java Spring Boot V2

JVM bind with IPv4 Disable IPv6 address lookups when -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Stack=true Spring构造注入不需要加@Autowired spring在4.x版本后就推荐使用构造器的方式的来注入fileld 官方推荐理由 单一职责: 当使用构造函数注入的时候,你会很容易发现参数是否过多,这个时候需要考虑你这个类的职责是否过大,考虑拆分的问题;而当使用@Autowired注入field的时候,不容易发现问题 依赖不可变: 只有使用构造函数注入才能注入final 依赖隐藏:使用依赖注入容器意味着类不再对依赖对象负责,获取依赖对象的职责就从类抽离出来,IOC容器会帮你自动装备。这意味着它应该使用更明确清晰的公用接口方法或者构造器,这种方式就能很清晰的知道类需要什么和到底是使用setter还是构造器 降低容器耦合度: 依赖注入框架的核心思想之一是托管类不应依赖于所使用的DI容器。换句话说,它应该只是一个普通的POJO,只要您将其传递给所有必需的依赖项,就可以独立地实例化。这样,您可以在单元测试中实例化它,而无需启动IOC容器并单独进行测试(使用一个可以进行集成测试的容器)。如果没有容器耦合,则可以将该类用作托管或非托管类,甚至可以切换到新的DI框架。 Spring Boot Actuator <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> Actuator comes with most endpoints disabled. Thus, the only two available by default are /health and /info. management.endpoints.web.exposure.include=* by default, all Actuator endpoints are now placed under the /actuator path mvn dependency:tree [INFO] +- org.springframework.boot:spring-boot-starter-data-jpa:jar:2.1.4.RELEASE:compile [INFO] | +- org.

Effective Coding Java

JAVA 基础 JAVA 基础

Java编码规范

JAVA 开发规范 目标: 容易维护 健壮 可复用 分类 指导 编码 UTF-8 注释 支持Swagger git模式 PR(pull-request) / merge request 代码静态检查 遵守风格规范 代码提交 必须通过review 测试 所有代码都有单元测试 集成测试 所有代码必须通过集成测试才能提交到分支或主干 编码风格

Maven Mirror

阿里云Maven中央仓库为 阿里云云效 提供的公共代理仓库 打开 maven 的配置文件( windows 机器一般在 maven 安装目录的 conf/settings.xml ), 在标签中添加 mirror 子节点: <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>

Java Notes

线程同步模式:用户态和内核态 线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式 就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态, 而用户模式就是不需要切换到内核态,只在用户态完成操作。 用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。 内核模式下的方法有:事件,信号量,互斥量 volatile 关键字 volatile 提供多线程共享变量可见性和禁止指令重排序优化: 对于可见性,Java 提供了 volatile 关键字来保证可见性。 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存,当 有其他线程需要读取时,它会去内存中读取新值 禁止指令重排序优化,写操作一定在读操作之后 值传递 当一个对象被当作参数传递到一个方法后,此方法可改变 这个对象的属性,并可返回变化后的结果 Java诊断利器Arthas curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar [arthas@9208]$ thread 1 "main" Id=1 TIMED_WAITING at [email protected]/java.lang.Thread.sleep(Native Method) at [email protected]/java.lang.Thread.sleep(Thread.java:339) at [email protected]/java.util.concurrent.TimeUnit.sleep(TimeUnit.java:446) JVM MEMORY MODEL javax.net.ssl.SSLException: Received fatal alert: protocol_version On Java 1.8 default TLS protocol is v1.2. On Java 1.6 and 1.7 default is obsoleted TLS1.