java实战



reflection, classLoader, 
google guava

垃圾收集算法:标记-清除算法、复制算法、标记-整理算法、分代收集算法

CMS收集器“标记-清除”:初始标记、并发标记、重新标记、并发清除。其中初始标记、重新标记仍需“stop the world”。整个过程耗时最长的是并发标记和并发清除
初始标记:标记一下GC Roots能直接关联到的对象,速度很快
并发标记:进行GC Roots Tracing的过程
重新标记:修正并发标记期间,因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录,停顿时间一般比初始标记长一些,但远比并发标记的时间短
CMS缺点:对CPU资源非常敏感;无法处理浮动垃圾(Floating Garbage);因“标记-清除”产生大量空间碎片

G1“标记-整理”

-Xmx3550m -Xms3550m -Xmn2g   -Xss128k
jvm最大值, jvm最小值,年轻代大小,线程堆栈大小
-XX:NewSize=n, -XX:MaxNewSize=n


java 反射
  • classLoader (kafka migrating from 0.7 to 0.8 使用到该技术)
  • java Reflection
能够分析类能力的程序称为 反射
Field: getType
Method
Constructor
  • java 类名.class
Class<?> demo1=Class.forName("LogTest");
Class<?> demo2=new LogTest().getClass();
Class<?> demo3=LogTest.class;  // java虚拟机一开始的时候是不加载这个类的所以这个类的一些静态变量之类的董事是不存在的,只有当你第一次使用这个类的时候虚拟机才会加载这个类。在虚拟机当中存在Class这个类,其他的 类的名称加上.class(即类名.class)是这个类的一个对象。当我们需要使用这个类的时候可以用class的函数通过类名.class来加载这个类或者直接通过使用这个类来让虚拟机加载你的类.

类名.class是一个关联于类的对象。对于每一个类型都对应一个Class对象(基本类型除外)
Class对象描述的是类的信息,包括静态属性、方法等,它是在类加载的时候生成的。
当要生成一个类型的对象是会先去检查是否已经存在该类的Class对象,否则视为该类为被加载!

String.class是能对类名的引用取得在内存中该类型class对象的引用
new String().getClass()是通过实例对象取得用取得在内存中该实际类型class对象的引用 (这个方法是从java.lang.Object类继承过来的)
因为在java虚拟机中对现一个类文件,它只加载一个class对象所以它们取得的是在同一内存位置的对象,所以可以用“==”来比较判断。
如:String.class==new String().getClass()  返回的应该是true
  • 实例与对象
MyClass myClass=new MyClass();
new的时候在堆中新建了一个对象。这个对象是MyClass的实例。其中myClass是该对象的引用。
  • java 调试
jmx 工具:jconsole, jvisualVM
 

内存泄露分析
jmap -dump:format=b,file=xxx.bin pid   pid是java程序pid、
jhat  -J-mx512m -port <端口号:默认为7000> xxx.bin  -mx512m表示所用最大内存512m

MAT:
./ParseHeapDump.sh xxxx.bin

  • java transient



ReetrantLock, Funnels, Optional<T>, eventBus
  • java 泛型总结,泛型中<? extends T>和<? super T> 差别

public static void fun(Info< ?> temp){  // 可以接收任意的泛型对象 
public static void fun(Info< ? extends Number> temp){ // 只能接收Number及其Number的子类
public static void fun(Info< ? super String> temp){ // 只能接收String或Object类型的泛型
  1. public void upperBound(List<? extends Date> list, Date date)  
  2. {  
  3.     Date now = list.get(0);  
  4.     System.out.println("now==>" + now);  
  5.     //list.add(date); //这句话无法编译  
  6.     list.add(null);//这句可以编译,因为null没有类型信息  
  7. }  

  1. public void lowerBound(List<? super Timestamp> list)  
  2. {  
  3.     Timestamp now = new Timestamp(System.currentTimeMillis());  
  4.     list.add(now);  
  5.     //Timestamp time = list.get(0); //不能编译  
  6. }  
<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过add()来加入元素。你或许还觉得为什么add(T)不行?因为<? extends T>是T的某种子类,能放入子类的容器不一定放入超类,也就是可能不能放入T.
<? super T>这里比较容易使用,没<? extends T>这么多限制,这里的意思是,以T类为下限的某种类,简单地说就是T类的超类。但为什么add(T)可以呢?因为能放入某一类的容器一定可以放入其子类,多态的概念。

extends 是继承父类,只要那个类不是声明为final, 或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就用到了implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
  • java正则
  • java native

  • 更改jar文件

zip -d file.jar unwanted_file.txt
jar uf file.jar wanted_file.txt

 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/data/hadoop/logs/gc-jobtracker.log
jvm的启动参数
log的地址你可以换一下 
jmap -histo pid
jstat -gccause 
stat -gcnewcapacity 21642
jstat -gccapacity 22504
java GC:http://stackoverflow.com/questions/2101518/difference-between-xxuseparallelgc-and-xxuseparnewgc
  • swap
内存的分页(paging)、交换(swap ping)、锁和线程的上下文切换。
如果JVM运行在内存不足的机器上,它的内存堆可能会被交换出去

  • Runnable、Callable、Executor、Future、FutureTask关系
Callable可以有返回值,

  • buffer
1) 有读和写两种模式
2) flip(): remaining大小为写入多少就有多少;rewind(): remaining大小为buffer的大小

ByteBuffer buffer = ByteBuffer.allocate(100);
byte[] bytes = new byte[26];
char ch = 'a';
for (byte c: bytes) {
System.out.println(ch);
c = (byte)ch;
ch ++;
buffer.put(c);
}
//buffer.flip(); // remaining() = 100
buffer.rewind(); // remaining() = 74

http://ifeve.com/buffers/

适用性:LinkedBlockingQueue 发送消息队列(有消息就发送,无消息阻塞); ConcurrentLinkedQueue 读取消息队列(无消息break)

http://blog.csdn.net/xpwang168/article/details/9037373

  • HashMap, HashTable, LinkedHashMap, TreeMap
  • CLI
即Command Line Interface,也就是"命令行接口"
  • slf4j (log4j)
Simple Logging Facade for Java (SLF4J)

只需要将对应的日志系统所需要的jar包文件(包括slf4j提供的jar包和日志系统自身依赖的jar包,例如:slf4j-log4j12-1.5.10.jar和log4j.1.2.jar)放入classpath即可,slf4j可以自动探测具体使用哪种日志系统,这种技术被称为静态绑定。

slf4j与log4j的组合:slf4j-api-1.7.6.jar, log4j-1.2.15.jar, slf4j-log4j12-1.7.6.jar. log4j.properties

slf4j和logback组合:slf4j-api-1.7.6.jar, log4j-over-slf4j-1.7.5.jar, logback-classic-1.0.13.jar, logback-core-1.0.13.jar. logback.xml
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值