1. java 虚拟机概述和基本概念
所谓虚拟机,就是一台虚拟的机器,
Visual Box 和VMare 为系统虚拟机,
java虚拟机属于程序虚拟机.
java虚拟机有多种
此款虚拟机: Sun Classic Vm 已经淘汰了(第一款商用虚拟机)
纯解释器的方式来执行java代码,
如果想要编译的化 必须使用外挂的形式
就得使用jit编译.
Exact VM : 准确是内存管理
编译器和解释器混合工作 以及两级即时编译器
只在Solaris平台发布
常见的: Sun Hotspot (内置了jit编译器)
历史:
优势:
2006年开源...
常见的:Bea JRockit
世界上最快的java虚拟机
专注服务端应用
优势
1.垃圾收集器
2. MissionControl 服务套件
常见的: IBM J9
IBM Technology for Java virtual Machine
IT4j
Dalvik 虚拟机 安卓的应用平台
dex dalvik Executalbe
Microsoft JVM 微软虚拟机
Azul VM 高性能虚拟机 完全碾压 hotspot
Liquid VM 高性能虚拟机
Taobao VM 虚拟机
KVM虚拟机: 简单.轻量 高度可移植
在手机平台运行
原理:
1. java虚拟机的运行时区域
线程独占区: 栈,程序计数器,本地方法栈
线程共享区: 方法区,堆
对象的创建和回收
对象的创建 就是内存分配
对象首先在Eden分配
大对象直接进入老年代
长期存活的对象进入到老年代
空间分配担保
逃逸分析以及栈上分配
如何判断对象为垃圾对象
我的理解是 失去引用的对象为垃圾对象
这里就涉及到了 判断垃圾对象的算法
1.引用计数法
自动把 失去引用的对象 减1,为0 就为垃圾对象
有引用就加1,
这样的话 带来一个问题
就是 堆中对象 互相引用的 始终不能回收
所以 效率和性能不高
所以引出了 第2中算法
为可达性分析法
2.可达性分析法
可达性分析法弥补了 引用计算法的不足
因为 会把失去引用的对象中引用的对象一并找出来
如何回收呢?
垃圾收集算法
1. 标记-清除算法 效率不高
2.复制算法 适用于新生代
3. 标记整理清除算法 适用于老年代
4.分代收集算法 结合上面2和3 的算法
回收首先需要 垃圾收集器
垃圾收集器有
serial,parnew, parallel, cms, g1
推荐 查看
1.serial :
单线程的,
Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器
应用场景 :桌面应用 分配内存较小的
2.parnew :
除了多线程外,其余的行为、特点和Serial收集器一样;
应用场景
在Server模式下,ParNew收集器是一个非常重要的收集器,因为除Serial外,目前只有它能与CMS收集器配合工作;
但在单个CPU环境中,不会比Serail收集器有更好的效果,因为存在线程交互开销。
3.parallel
用在服务端默认的垃圾收集器
针对吞吐量的
Parallel Scavenge收集器
4. cms 是一个并行的垃圾收集器
边垃圾 边 垃圾
5. g1 目前最高端的垃圾收集器
工具:
命令行工具:
jps
jstat
jinfo
jmap
jhat
jstart
图形化工具
jConsole
VisualVM
案例:
就是经验
java虚拟机的基本机构:
a.类加载子系统
b.方法区
c.java堆
d.直接内存
e.java栈
f.本地方法栈
g.PC寄存器
h.垃圾回收系统
i.执行引擎
2.堆,栈,方法区
3.了解虚拟机参数
4.垃圾回收概念和算法,及对象的分代转换
5.垃圾收集器
6.Tomcat性能影响实验
7.性能监控工具
对象的创建:
如果同时创建对象会发生线程安全问题
默认是parallel 因为新生代是 PSYongGen
最小堆内存 -xms20M
最大堆内存 -xmx20M
新生代 -xmn10M
-XX:SurvivorRatio=8 这是配置新生代eden大小
大对象大小配置:
-XX:PretenureSizeThreshold=6M
长期存活的对象配置:
-XX:MaxTenuringThreshold 默认值是15次
模拟应该是 for循环几次
空间分配担保
--XX:+HandlePromotionFailure
--XX:-HandlePromotionFailure 减号是禁用
默认式开启状态 我们可以禁用
这些都是参数配置
网友评论