没有合适的资源?快使用搜索试试~ 我知道了~
JVM内存管理、调优与监控考据
5星 · 超过95%的资源 需积分: 10 17 下载量 128 浏览量
2013-07-14
13:11:33
上传
评论 1
收藏 439KB DOCX 举报
温馨提示
试读
44页
考据,即广泛收集资料,比较分析,去伪存真,总结精要的意思。 为什么要以“考据”的形式研究Java应用管理和调优(包括内存、线程等)并撰写这篇文章? 因为“Java应用管理和调优”这一主题不仅涉及理论也涉及实践,要做对、做好管理和调优既需要理论又需要实践:这其中,很多理论是艰深的(如涉及计算机体系结构),很多实践是细碎的(如参数调优涉及很多细节,要考虑很多因素)。因此目前并没有一份完善的、官方的最佳实践存在,各种资料可谓“百家争鸣、百花齐放”,说直白点,却是良莠不齐,泥沙俱下。
资源推荐
资源详情
资源评论
JVM 内存管理、调优与监控考据
前言
本文为什么称之为“考据”
考据,即广泛收集资料,比较分析,去伪存真,总结精要的意思。
为什么要以“考据”的形式研究 应用管理和调优(包括内存、线程等)并撰写这篇文章?
因为“ 应用管理和调优”这一主题不仅涉及理论也涉及实践,要做对、做好管理和调优
既需要理论又需要实践:这其中,很多理论是艰深的(如涉及计算机体系结构),很多实
践是细碎的(如参数调优涉及很多细节,要考虑很多因素)。因此目前并没有一份完善的
官方的最佳实践存在,各种资料可谓“百家争鸣、百花齐放”,说直白点,却是良莠不齐,
泥沙俱下。
造成这一问题的一个重要原因是 虚拟机的概念模型与实现分离: 虚拟机规范是一
个很粗略的规范,对很多细节没有给出明确规定,给实现留下了很大的发挥空间。例如,
在你系统掌握了 规范中设定的 内存布局后(通过两个途径:学习 规范、学习
《》),会发现具体的虚拟机实现(如 )的内存布局并
不能与规范中的一一对应:规范中的一些子空间在具体实现中被合并了,一些子空间被移
动了,更可怕的是具体实现中各个内存区域的名字、用途与规范中的并不吻合!这导致了
很多误解。
另一个例子是, 规范中说很多子区域(如堆)都不需要是连续的空间,但具体实现
()却要求内存空间连续(并因此,极大限制了 可用内存的最大值)。
另一方面,虚拟机自身提供的用户监控的接口(如 )或监控工具(如
)在名词和概念上与规范、实现的官方文档也不统一),例如 内部监控接口将
内存分为堆内存与非堆内存两部分()。文档中并未说
明非堆内存包含哪些区域,根据实际测试和参考 等工具的构造,这里的非堆内存
应该只包含 和 。但在很多地方,非堆内存的含义指 管理的内存中
除去 剩下所有的部分(例如栈空间)。但在 接口中,堆内
存与非堆内存的总和却貌似并不等于整个 应用管理的内存。
除 了 含 混 , 还 有 部分 知 识 未 讲 完 整 、 到 位 。 例 如 , 多 份 官 方 文 档 都 涉 及 了
( !)问题的分析与解决,但 有多类(目前,我看到过的有 " 类,
其 #、$、" 在实践中见过):
#
$
% &'()
" *+,
- .*/
像官方的《》只提及了 #、$、%。
由于每种 的解决方案都很不相同(甚至相反),对于初学者若是不清楚其中的区别,
很可能南辕北辙。
深入研究过 管理和调优后你会发现,几乎其中的每个知识点都要花很大功夫才能搞清
楚,更可怕的是发现有些知识点到最后都搞不清楚:你会发现好几种不同的说法,每种都
言之有理。也是因为这种境地,需要以“考据”的形式列出所有向左的言论,而不是简单的
给出一个我认为正确的结论。在 管理和调优这个领域,大多数人都是“二道贩子”,人
云亦云(既不清楚内部原理、也未严谨实验,只是断章取义了别人的东西,而别人的东西
又是从另一个别人那断章取义来的——由于知识能力有限,我现在也是个二道贩子),因
此考据就更加重要了。为让读者了解所有知识点的出处,本文引用的所有材料均会标明出
处,如若觉得我曲解了原文意思可凭原文指正。
备忘
不只有一种实现! 官方的是 ,此外还有 0 的和 的(&1)及一
些开源社区的实现。
下文的讨论多数针对 。
我们要做什么?
内存管理有三个目标:
# 适当配置,以使 应用不会因为内存不足而挂掉
$ 尽量提高吞吐量
% 尽量降低延迟时间(一方面,降低暂停时间的最大值;二,控制垃圾收集的时间和与
应用运行总时间的比)
其中第一个目标为根本和前提:先保证安全,再谈性能。
配置和调优任务,从供给与需求角度看可分为两类:
# 在资源一定的情况下,能分配多少内存给 ,能支撑多大的负载?
$ 要支撑目标负载,期望硬件资源和配置是怎样的?
负载细分为多个方面(根据 内存结构),包括能支撑多少线程并发,能加载多少类,
能分配多少对象等等。
在确定总量指标后,还需要进一步调优各子空间的参数(如年轻代与老代比例),调优相
关性能参数(如最大暂停时间)。
名词
持久代,,,,
基础知识
JVM 边界
什么叫“一个 2?
一台机器上可以安装多个版本的 ,准确说,是多个版本的 .34&5。
每个 是一个进程。一个物理机器上可以运行多个 。
每次执行 ) 或 +) 时创建一个虚拟机。
①
程序将在默认 中启动。可以通过 6 查看当前默认的 。
②
虽说每个 )4+)(进程)都是一个 ,但并不是所有 (或者说进程)都
会在操作系统进程列表中出现。即你在进程中看到的个 )4+) 进程的数量可能
并不等于实际运行的 进程(虚拟机)的数量。获取准确列表的方法是运行 命令
(778 59*)。
:
;<441=+4',4$>%>$--4?,?@A@1*!+
+),!)+)++!!!+
+)+B2
C
;<441=+4',4#DEF-%#4??????????
G,<
+1++,
@*B+#>+,H
7+<
!
*+*I!,!
)!!,
,+)J>K+!&,5),@,
+,@,+L)!
/L
M++/L!,@++
*+,*!!,*7;
*+,,+/,
+,M,*!!*
,*,!!
一个 Java 进程(应用)所用的内存
按照前面的讨论,一个 进程,即一个 ,它使用的所有的内存称 。
④
更准确的定义是 所用的所有内存,不包括 N 自己管理的内存。
⑤
一个关键问题是, 进程会不会与其他进程共享某块内存区域。如果进程间不共享内存,
使用的内存不交叠,则分析会容易些。
究竟是否存在共享区域,不同资料存在不同说法:
《N.5577&O7L7N5》认为不会共享,原文是:
.+但它后又说:“N
*+7*72不能通过 7,但通过
自身或操作系统是可以的?
但 《 O !5 》 提 及 内 存 可 能被 共 享 , “ &?
**+2。
P
;<44+++)4,44$--F"
Q
《N.5577&O7L7N5》
R
见《N.5577&O7L7N5》,原文是:
N+*),@
进程内存划分
下图来自《N.5577&O7L7N5》
区别: 与 !
平时所称的堆(用于分配 对象)是 ,或称 *, 是
的一部分。
《+》中的划分是:
《 内存组成》
⑥
的内存区域的划分与 规范和《》中的相
似。
S
;<44+++?4*4+4#%%>"DE-FTF--
剩余43页未读,继续阅读
资源评论
- 江湖沧海客2014-08-24绝对的好资源,Doc格式,对JVM的方方面面讨论的很详细; 深入Java的人,运维人员必备。
ReDreamport
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功