一、???????????? 深入理解Java虚拟机
JVM是一个用来模拟实际机器的计算机软件
JVM解释并运行Java语言编译后所形成的中间码
微软虚拟机曾经最快
Android也有虚拟机(不遵循sun的规范)
?
?
一次编译,多次运行(跨平台)、but still needs jvm form different platforms
?
2??????? Jvm内存分配
1、? 堆heap: 对象
2、? 栈stack: 变量(在针上面,并指向堆中的对象,执行完pop出去)
3、? 代码区:常量、类及其定义
?
C语言内存泄露(问题在栈stack)
GC(垃圾回收,同时带来负担,调优调GC)
GC收集是一个将程序不再使用的对象实例自动销毁并释放其所占用的资源的过程
垃圾收集只针对堆(heap)里的对象
?
Java平台的垃圾收集使程序员不需要手动管理对象的销毁过程,简化了开发,减少了造成内存泄露的可能。
?
Jvm的监控器:在bin中有诊断工具,jVisualVm.exe监控虚拟机运行情况
?
垃圾回收时间合理应控制在<5%
?
要不断的测试以调优性能。
要用大量的数据来发现问题。
?
2??????? 垃圾收集方法的发展
1、? 引用计数器法(有引用时加1,没引用时减1,检查堆中的对象的引用计数是否为0,是则释放掉。同时看GC什么时候运行。)
堆如果越大,GC要先扫描,则扫描时间更长。GC扫描时,会造成系统长时间的停顿。
?
优点:简单易用,速度快,CPU消耗低
问题:内存碎片问题(无法解决的)、堆越大时间越多、循环引用(如:双向链表,可扩展的集合。在树状列表,无法解决;对象a引用b,b引用c,c引用d,d引用a;引起内存泄露)
缺点:不能循环引用
?
?
2、? 对象图法
对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。
?
步骤:
1.?????? 标记(浏览对象图,并作标记,比较耗时)
2.?????? 清除(删掉有删除标记的。)
3.?????? 压缩(整理内存的过程,搬动内存的地址,匀出大块内存出来)
PS:不同虚拟机实现不同。安排不同的时间去安排工作。
?
优点:克服引用技术的缺点。解决循环引用。
缺点:执行速度较慢;会导致其它线程停顿。
(压缩的时候会独占,要重新赋值,其它线程不可以跑,导致整个虚拟机停顿。)
可能会同时运行。
?
S1=null;
?
?
?
?
对象图法―实现
1)? 复制收集器(把声明的堆空间分成两半,当发现不够用时,把所有需要使用的对象按顺序搬到另一半b,原来的一半a则剩下的全是不用的,则删除,然后b再搬回)
问题:内存空间增长很快且不可消除时,如cache。利用率高,搬动无意义。
不可回收的对象增长得很快,本来分配1G,但因为分两半,实际可用512M,可能更快内存溢出。
适用性:存在大量临时性的占用内存的情况。
?
2)? 增量收集器:分块收集,平均分成多少块,每一块均等。
3)? 分代收集器:在前两种之后提出的方法。在上面的基础之上。
基础要点:每一块对象不同,在分块收集的前提下,某一块可能存放某一特征的对象。来减少垃圾回收的频度。
分成三块:大小不一样,每一块里边实施不同的算法,每一块收集不同类型的对象,新对象永远产生在第一块,可能:第一块1/4,第二块1/2,第三块1/4
第一块:可以简单的扫描算法(如引用计数算法),当第一块不够用时,则作一次扫描,则使用复制方法将“还需要用的”放到第二块中。则这时第一块可以清空。这样,第2,3块不需要使用垃圾收集。当第2块满时,则作一次更详细的扫描,再调到第3块(第3块则是很长时间存在的,一般会一直存在。)
如果第3块也满了,则要3块作一次整的垃圾收集了。
?
?
分代:集合了增量和复制收集的方法。减少垃圾收集的频度,减少对用户使用的影响。
?
?
?
???????? 堆如何进行分代的
有如下三种区域:使用不同的算法,运行效率不一样。
1)? 年轻
2)? 老年
3)? 永久
java -jar tune_t001.jar 10000
?
?
?
二、JavaEE架构
1、? jdbc
1)? 它是第一个面向企业的应用。
2)? Java ee 应用中非常重要的
3)? 其性能好坏常常决定整个系统的性能
?
Application àjdbc api)àJDBC Driver(规范)à上层Api、下层api
除非你知道数据库文件的格式及读取方法,才可绕过jdbc这一层。
?
2005年企业级系统不成熟,存在很多系统问题,容易down机或性能差。
再后来,框架成熟。
?
在Weblogic里调优,通过datasource来访问数据库,拿到我们的连接,再去访问数据库。
在这样的情况,weblogic才提供相应的监控手段。
如果对oracle熟悉,可以不用上面的,可以用oracle本身的监控工具。
?
可能问题:
1、? 数据库连接不释放。(很容易监测,可以监测连接数,可以直接看oracle的连接数情况,max conection),现在很多orm框架(hibernate,ibatis)可以避免这个问题。
2、? 连接缓冲池
3、? 过于依赖数据库(用户使用页面,在什么页面放什么广告,
文件和数据库的性能是100倍的,静态化)
像facebook,他们不用数据库,性能太差。
?
?
2??????? JNDI
问题:
1、? 依赖网速带宽
2、? 查找和认证用户时间比较多
?
?
2????? JTA(java transaction api)
需要跨越数据库的支持时,需要用到jta,属于global数据库,平常我们用的是local数据库
JPS:每秒事务数(loadrunner自己制定的事务数)
TPS:和上面是两回事