读书_JVM高级特性与最佳实践

好多章节看不懂.

JDK1.4  正则表达式,异常链,NIO,日志,JAXP,
JDK5    自动拆装箱,泛型,动态注解,枚举,可变长参数,Foreach, 改进的内存模型,Concurrent并发包, Atomic***

64位JVM需要付出内存,速度等性能降低的代价.  JDK提供了UseCompressedOops指针压缩选项节省内存消耗, 但进一步降低了速度.

Java运行时数据区域,  堆/方法区/VM Stack/Native Method Stack/Program Counter Register

如果线程请求的栈深度大于虚拟机允许的大小, 抛出StackOverflowError, 如果虚拟机在堆中动态扩展栈时, 内存不足, 抛出OutOfMemoryError.

对象实例会在堆上分配内存,  但栈上分配/标量替换会导致一些微妙的变化.

方法区在HotSpot有时叫做永久堆,   运行时常量池在此区域,  数字/字符串常量,String.intern()都会将变量实例加入池.

常量池还包括类/方法描述符,  用于动态链接.


DirectBuffer将在本地堆中分配内存,  不在Java堆中.  -Xmx只控制Java堆,  当Java堆过大, 挤占了直接内存需要的空间, 可能造成未预料的OutOfMemoryError

-Xss定义了栈的最大值,  -Xoss设置本地栈大小(HotSpot忽略此值)


Unsafe.class.


GC判断对象是否存活的算法
1,应用计数算法,  Java并未使用, 其很难解决相互循环引用问题.
2,根搜索算法, 定义几种根对象, 如栈本地变量/类静态变量/方法区常量...应用的变量. 从GC Roots不可达的对象为可回收对象.


重写了finalize()方法的对象可以复活,  只要其把自己直接或间接链到一个根对象上.


GC算法:  标记-清除,  复制 , 标记-整理,  分代.

GC收集器:  
新生代: 一般使用复制算法.
Serial, 简单高效, 对于单CPU环境, 内存占用不大的程序, 非常有效.
ParNew, Serial的多GC线程版本.
ParallelScavenge,  与ParNew基本一样, 只是它是一个吞吐率优先GC,  提供MaxGCPauseMillis/GCTimeRatio参数.

老生代: 一般使用标记-整理或标记-清除算法.
Serial Old  老生代单行程GC, 
Parallel Old
CMS

G1不再明确把内存分为新生/老生代,  而是分成多个大小固定的区域, 使用标记-整理算法优先回收垃圾最多的区域. 性能优秀.

大对象直接进入老生代,如大byte[], 大字符串. 一定要避免短命的大对象. 

HotSwap:代码热替换技术,  BTrace.可以对运行的程序动态改变类的行为(一般为加些打印日志),进而进行调试的一个工具。

VisualVM is a visual tool integrating several commandline JDK tools and lightweight profiling capabilities. Designed for both production and development time use, it further enhances the capability of monitoring and performance analysis for the Java SE platform

VisualVM plugins:MBeans Browser/Visual GC Plugin/BTrace ....

java class 文件魔数 0xCAFEBABE

HotSpot采用解释器与编译器并存的架构, 解释器启动速度快, 占内存少, 随时时间的推移, 编译器把频繁调用的代码编译成本地代码, 以获取更高的执行效率.

HotSpot缺省采用解释器与编译器配合的方式工作,  称为Mixed Mode; 可以使用-Xcomp/-Xint强制使用编译或解释模式.

Mixed Mode: 监控热点代码, 将其编译.

HotSpot 包含两种编译器 Client/Server Compiler . 虚拟机根据自身版本和宿主机器硬件自动选择运行模式, 也可显式指定.

Client/Server又被称为C1/C2编译器,   C1编译进行简单优化, 编译速度快; C2优化较充分, 得到的本地代码质量高,运行速度快.

JDK1.7启用了分层编译策略.  +TieredCompilation
0层: 解释执行; 1层: C1编译, 简单优化; 2层: C2编译, 充分优化.   

代码优化的手段通常有:  内联, 冗余访问消除, 无用代码消除, 公共子表达式消除, 逃逸分析(栈上分配/同步消除/标量替换), 锁优化(自适应自旋/锁消除/锁粗化/轻量锁/偏向锁...)

class hierachy analysis,虚方法通常不能内联,因为只有在运行时才能决定调用继承体系中的某个方法,   而Java方法缺省就是虚方法,  但这并不意味着只有final方法虚拟机才会使用内联优化. 虚拟机会使用激进内联优化, 当检测到了小概率的多态调用时, 会回到解释状态,取消内联.

volatile保证了变量的对所有线程的可见性,并禁止指令重排,  但由于Java中大部分运算并非原子操作,  如int++,  故同样有多线程安全问题.

Class Data Sharing 为提高启动速度,  Client VM可以使用缓存文件以避免常规的系统类加载,  jre/bin/client/classes.jsa


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值