首页 > 技术文章 > JVM

ng1991 2017-11-13 15:46 原文

一、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、线程对变量的所有操作(读取,赋值)等都必须在工作内存中进行,而不能直接读写内存中的变量

 

推荐阅读