第一部分 用java7做开发

第一章 初始java7

java7中的新特性

  • switch支持String
  • 支持100_000_000数值表示法
  • 新的异常处理
    • | 连接多个异常
    • final Exception 抛出实际异常
  • try-with-resources(TWR)语法
  • 钻石语法
  • 简化变参方法调用

第二章 新I/O

这个部分需要‘写写看’才能更深刻的理解

  • Paths工具类使用
  • Files工具类实现文件在CRUD等操作
  • 通过Files.newDirectoryStream(path, "*.html")查找指定path下所有以.html结尾的文件
  • 通过继承SimpleFileVisitor实现更复杂的功能,如:目录及子目录下所有.html文件的查找等(这个功能很强大,可以实现很多之前必须用‘递归’才能搞定的问题!)
  • 使用FileSystems.getDefault().newWatchService()监听文件的CRUD等操作
  • FileChannel的使用
  • 异步IO

第二部分

第三章 依赖注入

这章主要讲‘依赖注入’的编程思想

IOC(Inversion of Control)包含DI(Dependency Injection)

DI优势

  • 松耦合
  • 高内聚
  • 易测试
  • 高重用
  • 代码简洁

第四章 现代并发

java.util.concurrent设计原则:

  • 安全性(并发类型安全性)
  • 活跃度
  • 性能
  • 重用性

并发系统开销:

  • 锁与监测
  • 环境切换次数
  • 线程的个数
  • 调度
  • 内在的局部性
  • 算法设计

关键字

  • volatile

原子类

  • java.util.concurrent.atomic

线程锁

  • java.util.concurrent.locks

    ReentrantLock的使用 ReentrantReadWriteLock 读多写少时使用,性能更好

并发集合

  • ConcurrentHashMap
  • CopyOnWriteArrayList

Queue

  • BlickingQueue

    • WorkUnit,使用工作单元,如:Queue<TaskWorkUnit<Mytask>>

      public class TaskWorkUnit<T> {
      private final T task; public T getTask() {
      return task;
      } public TaskWorkUnit(T task) {
      this.task = task;
      }
      }
  • TransferQueue 的使用

任务建模

  • Callable
  • Future
  • FutureTask

分支/合并框架

  • ForkJoinPool
  • ForkJoinTask
    • RecursiveAction 无结果返回
    • RecursiveTask 返回结果

java内在模型(JMM)

  • 之前发生(Happens-Before)与 同步约束(Synchronous-With)

    • Has-A 与 Is-A
  • 传递性:a>b,b>c,则a>c

第五章 类文件与字节码

类加载

  • 加载

    • 读取.class文件
  • 连接
    • 验证
    • 准备
    • 解析
  • 初始化

类加载器

  • 根(引导)类加载器
  • 扩展类加载器
  • 应用(系统)类加载器
  • 定制类加载器

方法句柄

  • MethodHandle

javap命令

操作码 - 加载与存储操作码 - 数据运算操作码 - 执行控制操作码 - 调用操作码 - 平台操作操作码

第6章 理解性能调优

性能术语

等待时间(Latency)
吞吐量(Throughput)
利用率(Utilization)
效率(Efficiency)
容量(Capacity)
扩展性(Scalability)
退化(Degradation)

调优困难的平台特性主要是

线程调度
垃圾收集(GC)
即时(JIT)编译

硬件时钟

  • RTC
  • 8254
  • TSC 应用最广泛
  • HPET 最新
  • nanoTime()与currentTimeMillis()

缓存未命中

内存区域

  • 伊甸园(Eden Space)
  • 幸存者乐园(Survivor Space)
  • 终身颐养园(Old Generation)
  • PermGen

    栈保存原始型局部变量和引用,堆中保存对象

年轻代收集 与 完全收集

安全点

GC 相关

-Xms<几MB>m      --堆初始化值(默认2MB)
-Xmx<几MB>m --堆最大值(默认64MB)
-Xmn<几MB>m --堆中年轻代大小
-XX:-DisableExplicitGC --系统内调用System.gc()不产生任何作用

读懂GC 日志

-XX:+PrintGCDetails
-XX:+PrintGCDateStamps --gc操作时间戳
-XX:+PrintGCApplicationConcurrentTime --应用线程运行情况下用在GC上的时间

GC 方法

并发标记清除(CMS:Concurrent Mark-sweep)
-XX:+UseConcMarkSweepGC --打开cms收集器
-XX:+CMSIncrementalMode --增量模式(一般都需要)
-XX:+CMSIncrementalPacing --配合增量模式使用,自动调整每次执行垃圾回收的幅度(一般都需要)
-XX:+UseParNewGC --并发收集年轻代
-XX:+ParallelGCThreads=<N> --GC使用的线程数 G1垃圾收集器
-XX:+UseG1GC --打开G1收集
-XX:MaxGCPauseMillis =50 --G1一次收集中暂停时间在50ms内
-XX:GCPauseIntervalMillis=200ms   --2次收集的时间间隔在200ms以上 输出编译日志
-XX:+PrintCompilation --输出编译日志 注:
s --方法是同步的
! --方法有异常处理
% --当前栈替换(OSR)

HotSpot 编译

  • 客户端编译器:编译决定更保守,编译效率慢
  • 服务端编译器:编译决定更大胆,效率高
  • 实时java

java程序员修炼之前笔记(前半部分)的更多相关文章

  1. Java程序员修炼之道 之 Logging(1/3) - Logback 配置(转)

    转自紫风乱写:http://www.blogjava.net/justfly/archive/2014/08/10/416768.html,建议大家去原处学习 写在前面的话: 作为<Java程序 ...

  2. java程序员修炼之道

    今天在论坛里看到了一位工作10年的java大牛总结的java程序员修炼之道,看完后给出的评价是:字字玑珠,深入人心,猛回头,自己一无是处··· 大牛告诉我们应该好好学习与修炼以下知识与技能 Java语 ...

  3. Java程序员修炼之路

    作者简介:王成委,CSDN知识库特邀编辑,Java高级工程师,熟悉Java编程语言和Oracle数据库.专注于高并发架构设计和大数据存储方向的研究. 我们为什么选择Java 大多数人选择Java可能只 ...

  4. 《Java程序员修炼之道》

    原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock( ...

  5. java程序员修炼之道——大牛告诉我们应该好好学习与修炼以下知识与技能

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 一:Java语言学习(对线程(thread),串行化,反射,网络编程,JNI技术, ...

  6. 9本java程序员必读的书(附下载地址)

    本文列出的9本书在Java程序员界都是被认为很棒的书.当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java.这个问题也就表明,相对于其他的教程和博客,Java书籍还 ...

  7. Java程序员必读的9本书

    本文列出的9本书在Java程序员界都是被认为很棒的书.当一个程序员开始初学Java时,他的第一个问题应该是如何选择一本书来作为指导学习Java.这个问题也就表明,相对于其他的教程和博客,Java书籍还 ...

  8. PHP笔记——java程序员看懂PHP程序

    PHP笔记——java程序员看懂PHP程序   php是一种服务器端脚本语言,类型松散的语言. <?php   ?>       xml风格 <script language=”ph ...

  9. 前后端分离时代,Java 程序员的变与不变!

    事情的起因是这样的,有个星球的小伙伴向邀请松哥在知乎上回答一个问题,原题是: 前后端分离的时代,Java后台程序员的技术建议? 松哥认真看了下这个问题,感觉对于初次接触前后端分离的小伙伴来说,可能都会 ...

随机推荐

  1. PyQt 5事件和信号

    信号槽Signals & slots sld.valueChanged.connect(lcd.display) # 将滚动条的valueChanged信号连接到lcd的display插槽 # ...

  2. RAC环境TNS-12541报错处理

    按照前文所述搭建好RAC环境后,发现在rac2上面无法查看到listener的状态,如下: [oracle@rac2 ~]$ lsnrctl status LSNRCTL for Linux: Ver ...

  3. 在线pubmed

    ESearch(文本搜索) eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi http://eutils.ncbi.nlm.nih.gov/entr ...

  4. struts2的搭建和简单的例子(采用struts-2.5.2版本)

    struts框架的概述: 当2001年初,Struts的第一个版本在apache网站上发布,它提供了一种分离视图和业务应用逻辑的web应用方案. 在Struts诞生之前,开发人员都是在jsp里写入处理 ...

  5. C 语言 - 分支、跳转和循环语句

    if 条件判断语句 if 语句结构 格式: if (表达式) { 语句; } 如果表达式成立,就执行大括号中的语句:否则跳过该 if 语句 #include <stdio.h> int m ...

  6. 用Theano学习Deep Learning(三):卷积神经网络

    写在前面的废话: 出了托福成绩啦,本人战战兢兢考了个97!成绩好的出乎意料!喜大普奔!撒花庆祝! 傻…………寒假还要怒学一个月刷100庆祝个毛线………… 正题: 题目是CNN,但是CNN的具体原理和之 ...

  7. day-9心得

    操作系统发展史 手工操作(无操作系统) 1946年第一台计算机诞生--20世纪50年代中期,还未出现操作系统,计算机工作采用手工操作方式. 手工操作程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入 ...

  8. [z]【Bash命令行处理】[详解]

    (转自:http://www.linuxsir.org/bbs/thread99465.html) 我看很多兄弟写脚本或命令时出现错误的主要原因,是因为不了解bash的命令行处理.我在这里总结了一下, ...

  9. Spring实战之环境与profile

    1.配置profile bean Spring为环境相关的bean所提供的解决方案其实与构建时的方案没有太大的差别.当然,在这个过程中需要根据环境决定该创建哪个bean和不创建哪个bean.不过Spr ...

  10. 跟着太白老师学python day11 闭包 及在爬虫中的基本使用

    闭包的基本概念: 闭包 内层函数对外层函数的变量(不包括全局变量)的引用,并返回,这样就形成了闭包 闭包的作用:当程序执行时,遇到了函数执行,它会在内存中开辟一个空间,如果这个函数内部形成了闭包, 那 ...