一、GC
1、GC主要管理内存的方法区和堆
2、判定对象是否存活算法
----引用计数法
给对象添加一个引用计数器count,有一个地方引用它时count+1,引用失效时count-1,当count=0时引用失效,此时回收。
无法解决对象间相互循环引用的问题。
----可达性分析
通过一系列 "GC Root" 的对象作为起点,从这些节点开始向下搜索,搜索路径称为引用链,不在引用链上的对象,此对象不可用。
GCRoot对象包括
a.虚拟机栈(栈帧中的本地变量表)中引用的对象。
b.方法区中类静态属性引用的对象。
c.方法区中常量引用的对象。
d.native方法引用的对象。
3、宣告一个对象的死亡
至少经历两次标记过程。
第一次:发现没有与GCRoot连接的引用链。
----判定是否执行finalize()方法,没有必要执行的情况 a.对象没有覆盖finalize()方法 b.jvm已调用过finalize()
----若执行,则将对象放于F-Queue对列,稍后由jvm自建的finalizer线程执行finalize方法。
第二次:若想要在finalize中拯救自己,需要与引用链上的任一对象关联,譬如把自己赋值给某个类变量或者对象的成员变量。
4、垃圾收集算法
----标记清除
效率:标记清除效率不高
产生大量不连续内存碎片,需分配内存较大对象时,不得不提前触发另一次垃圾回收。
----复制算法
内存分为大小相同的两块,每次使用一块,当一块内存用完,将剩余存活的对象复制到另一块内存,清除自身。
----标记整理
让存活对象向另一端移动
----分代收集
新生代:复制算法
老年代:标记整理或清除算法
二、常用设置
1、-Xms -Xmx 设置堆大小
2、-Xmn 设置新生代大小
3、-XX:SurvivorRatio=8 决定新生代中Eden区与Survivor区空间比例为8:1
三、对象分配
1、大对象直接进入老年代
大对象:需要大量连续内存空间的java对象,典型有很长的字符串,数组。
-XX:PretenureSizeThreshold 大于这个值直接进入老年代
2、对象优先在Eden分配,长期存活的对象进入老年代
如果对象在Eden经过第一次minorGC仍然存在,移入survivor,并且age+1,对象在survivor区中熬过一次minorGC,age+1。
当age>=15(默认值),晋升到老年代中,晋升阈值由-XX:MaxTenuringThreshold设置。
四、java bin文件夹中工具
1、jps: jvm process status tool 指定系统内所有hotspot虚拟机进程
2、jstat: 用于收集hotspot虚拟机各方面运行数据
3、jinfo: 显示虚拟机配置信息
4、jmap: 生成虚拟机内存存储快照(heapdump 文件)
5、jhat: 用于分析headdump文件,它会建立一个http/html服务器,让用户在浏览器上查看分析结果,地址是?
6、jstack:显示虚拟机的线程快照
五、多线程
1、计算机的运算速度与他的存储和通信子系统速度差距太大,大量的时间都花费在磁盘IO网络通信或数据库访问上。
2、衡量一个服务器性能的高低好坏,每秒事务处理数TPS是重要的指标之一,它代表一秒内服务端的响应请求总数。
3、物理计算机读写速度:寄存器>高速缓存>内存
4、缓存一致性:每个处理器都有自己的缓存,又共享同一个内存
5、java定义一种java内存模型,屏蔽各种硬件操作系统的内存访问差异
6、线程对变量的所有操作(读取,赋值)等都必须在工作内存中进行,而不能直接读写内存中的变量