以下文字为网络摘抄学习.
另外,其中一些术语的翻译,是我自己的”创作“,我不知道别人是怎样翻译的。如果有不当的地方,希望指正。
堆( Heap)是 Java 程序的对象生活的地方,包含活的对象,死的对象以及剩余内存。
当对象不能被运行中的程序的指针所到达时,这些对象成为”垃圾“。
JVM 的堆大小决定了 VM 花费在收集垃圾上的时间和频度。
收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。
如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。
如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。
调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。
在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。
堆划分为两个区域:新生代和旧生代。
新生代又分为:Eden 和两片生存空间(survivor spaces)。其中保证有一片空间在任何时间是空的,当垃圾收集发生时, Eden 中的活的对象复制到下一片生存空间,对象就在生存空间之间复制,直到到达最大门限值(老化),然后复制到旧生代。
Eden 是新的对象分配的地方。
很多对象分配以后很快成为垃圾,这些对象称为具有 "infant mortality."
对象生存的时间越长,需要的收集时间也越长,因此,收集变慢。
你的应用建立和释放对象的速度决定了垃圾收集的频度。因此,在编程时,应注意使用对象的缓冲,而不是新建立对象。
大多数对象在新生代就已经死去,因此你能有效的调整垃圾收集。如果你能安排大多数对象的生存期小于一个收集时间,那么,垃圾收集是十分高效的。
错误的”代“配置会导致频繁的垃圾收集,影响系统性能。
如果系统花费很多的时间收集垃圾,请减小堆大小。
一次完全的垃圾收集应该不超过 3-5 秒。
一般说来,你应该使用物理内存的 80% 作为堆大小。
在最大工作负荷的时候,监视 WebLogic 的性能。
使用 -verbosegc 选项测量有多少时间和资源用于垃圾收集。
打开垃圾收集的详细信息输出以及重定向:
% java -ms64m -mx64m -verbosegc -classpath $CLASSPATH
-Dweblogic.domain=mydomain -Dweblogic.Name=clusterServer1
-Djava.security.policy==/bea/weblogic6x/lib/weblogic.policy
-Dweblogic.management.server=192.168.0.101:7001 -Dweblogic.management.username=system
-Dweblogic.management.password=systemPassword weblogic.Server >> logfile.txt
在 Solaris 系统上,采用下面的命令:
weblogic.Server > server.out 2>&1
Java HotSpot VM 选项
标准的选项在各种平台都已经有介绍:
http://java.sun.com/j2se/1.3/docs/tooldocs/win32/java.html
http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html
http://java.sun.com/j2se/1.3/docs/tooldocs/linux/java.html
以 -X 开头的选项都为非标准选项(并不能在所有的 VM 上实现),在后续的版本中可能会不通知而变更。
由于 -XX 选项需要特别的系统权限,因此不建议随便使用。
在 1.3.0 之前的版本, J2SDK 的 Solaris 版本带有一个虚拟机的实现叫做 Exact VM(EVM),从 1.3.0 开始这个虚拟机被 Java HotSpot VM 所取代。
Java HotSpot VM 目前认识下面的 -X 选项:
-Xincgc 使用训练 GC
-Xnoincgc 不是用训练 GC(缺省)
-XX:MaxHeapFreeRatio=<Maximum> 最大堆剩余百分比(缺省 70)
-X:MinHeapFreeRation=<Minimum> 堆最小剩余百分比(缺省 40)
-Xint 只作解析 (不作 JIT 编译)
-XX:+UseBoundThreads 绑定用户级别的线程 (只针对 Solaris)
-Xmn<Size> 设置年轻一代的大小( young generation )(只对 1.4)
对象分配在 Eden,并且在这里死亡,当 Eden 满时,引起一个小的收集(minor collection),一些生存的对象被移动到旧生代,如果旧生代需要收集,则引起大收集(major collection ),这会比较缓慢。
如果 GC 成为瓶颈,那么需要指定代的大小,检查 GC 的详细输出,研究 GC 参数对性能的影响。
旧生代的收集采用 mark-compact 的方式,其中的一部分叫做”永久代“(permanent generation)很特别,他包括了 JVM 自身的所有反映数据(reflective data),例如类以及方法。
暂停时间的含义是应用因为垃圾收集而显示出来的短暂停顿。
吞吐量的含义是在一段比较长的时间内,没有用在垃圾收集的时间和总时间的百分比。
减少暂停时间的办法可以采用小的年轻代和增量收集,但是这以牺牲吞吐率为代价。
Footprint 是一批工作进程的集合,以页和缓冲行数计量,在物理内存有限或者有很多处理器的系统里,footprint 可代表伸缩性。
Promptness 是对象死去的时间和内存变为可用时的时间差,在分布系统中(包括 RMI)需要考虑。
很大的新生代能提高吞吐率,但是牺牲了 footprint 和 promptness。
Solaris 的 footprint 可以采用 pmap 命令来查看。
[GC 325407K->83000K(776768K), 0.2300771 secs]
[GC 325816K->83372K(776768K), 0.2454258 secs]
[Full GC 267628K->83769K(776768K), 1.8479984 secs]
上面的三行是 GC 的详细输出,我们可以看到两次小收集和一次大收集。箭头前后的两个数字代表 GC 后活的对象的组合长度。括号内的数字代表合计的空间,等于堆大小减去一片生存空间。
除非你遇到暂停的问题,否则,可以分配足够的内存给 JVM,缺省的 64MB 总是太小。
设置 -Xms 和 -Xmx 为同样的值能提高 JVM 的预测,但是如果你的选择不对的话, JVM 不会补偿。
当增加处理器时,记得增加内存,因为分配可以并行进行,而 GC 不是并行的。
NewSize 和 MaxNewSize 绑定新生代的长度的低端和高端,设置为一样大小时和 -Xms 和 -Xmx 一样解决新生代的预测时间。
如果生存空间太小,拷贝直接进入旧生代,如果太大的话,会空闲在那里。
除非你碰到过渡的大收集或者暂停时间,否则分配足够的内存给新生代,缺省的 MaxNewSize (32MB) 往往太小。
如果需要的话,最大的永久代大小可以使用 MaxPermSize 增加。
直接的 GC 调用可以采用 -XX:+DisableExplicitGC 来关闭。
对于大服务器而言,1.4 的 JVM 能提供 64 bit 寻址能力,提供更大的新生代大小,并发收集来减少大收集引起的暂停的影响。
Java HotSpot Client VM 主要用于减少应用启动时间以及内存的 footprint 。
Java HotSpot Server VM 和 Java HotSpot Client VM 类似,但是在最大性能上作了调整。用于长期运行的服务应用。
Solaris 和 Linux 的 J2SE 1.3 随带 Java HotSpot Server VM 预安装。
分享到:
相关推荐
标题中提到了JVM原理、JVM调优、JVM内存模型和JAVA并发,这些都是Java虚拟机(JVM)相关的核心概念。JVM是运行Java字节码的虚拟计算机,为Java提供了一个跨平台的环境,确保Java程序可以在不同的操作系统上运行而...
Java虚拟机(JVM)是Java程序运行的核心,它负责解释和执行字节码,为Java应用程序提供了一个跨平台的运行环境。JDK(Java Development Kit)包含了开发和运行Java程序所需的所有工具,包括JVM。当我们谈论"jdk,jvm...
Java虚拟机(JVM)是Java程序运行的基础,它是一个抽象的计算机系统,负责执行Java字节码。本文将深入探讨JVM的启动过程及其基本原理。 首先,我们需要理解JVM的基本概念。JVM是Java Virtual Machine的缩写,它是...
在这个压缩包中,"JVM图解.png"可能是对JVM内部结构的可视化表示,"JVM图解"可能是一个详细的文档,解释了JVM的工作原理,而"JVM指令手册 中文版"则提供了JVM可执行的所有指令的详细信息。下面,我们将深入探讨JVM的...
### JVM 详细介绍:掌握 JVM 的各个组成部分与功能 #### 一、Java 源文件编译及执行 Java 应用程序的核心在于源文件的编译与执行。不同于 C/C++ 这类需要针对不同平台进行编译的语言,Java 采用了一种更为灵活的...
SAP JVM 8.1 64位是一个专为SAP系统设计的Java虚拟机,它基于Oracle的Java Development Kit (JDK) 进行优化,以满足SAP应用程序的特定需求。SAP JVM旨在提高性能、可靠性和安全性,同时确保与SAP产品的无缝集成。...
JVM(Java Virtual Machine,Java虚拟机)是运行所有Java程序的假想计算机,是Java程序的运行环境,负责执行指令、管理数据、内存、寄存器等,是实现Java跨平台特性的关键部分。JVM指令手册详细记录了JVM的所有操作...
【狂神说JVM探究】是一份集合了多种格式的学习资料,主要涵盖了Java虚拟机(JVM)的基础知识。这份资料出自B站上的【狂神说Java】系列教程,为快速入门JVM提供了详实的笔记。以下是根据这些资源可能包含的一些关键...
### JVM必知必会知识点梳理 #### 1. JVM的定义与层次 Java虚拟机(JVM)具有多重含义: - **一套规范**:即Java虚拟机规范,定义了Java虚拟机应该具有的行为。 - **一种实现**:例如HotSpot、J9、JRockit,它们都是...
Java虚拟机(JVM)是Java程序运行的核心组件,它负责解释和执行字节码,为开发者提供了跨平台的运行环境。"jvm视频及笔记"这个资源显然是一份全面学习JVM的材料,结合了视频教程和书面笔记,帮助学习者深入理解JVM的...
【jvm-mon基于控制台的JVM监视】 `jvm-mon`是一款实用的工具,它允许开发者通过控制台界面实时监控Java虚拟机(JVM)的状态。在Java开发过程中,性能分析是至关重要的,因为良好的性能能提升用户体验,降低服务器...
JVM 输出 GC 日志导致 JVM 卡住 JVM 输出 GC 日志导致 JVM 卡住是一个常见的问题,尤其是在高并发和高性能应用中。这个问题的根源在于 JVM 的垃圾回收机制(Garbage Collection,GC),它会在 JVM 运行时周期性地...
在Java开发领域,JVM(Java Virtual Machine)是运行所有Java程序的核心,它负责解析字节码并执行程序。深入理解JVM的内核原理、诊断技巧以及优化方法对于提升应用性能至关重要。本教程——“深入JVM内核—原理、...
46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...
### 深入解析JVM:Java虚拟机的精髓与挑战 #### JVM概览与重要性 JVM,即Java Virtual Machine(Java虚拟机),是Java程序员必须掌握的核心技术之一。初学者通常从简单的“HelloWorld”程序开始,逐渐接触更复杂的...
JVM(Java虚拟机)是Java语言运行的基础,它负责执行Java字节码,并且是Java跨平台特性的关键实现。JVM的主要职责包括加载Java程序、验证字节码、将字节码转换成机器码执行、内存管理、垃圾回收和提供安全机制等。...
JVM面试资料。 JVM结构:类加载器,执行引擎,本地方法接口,本地内存结构; 四大垃圾回收算法:复制算法、标记-清除算法、标记-整理算法、分代收集算法 七大垃圾回收器:Serial、Serial Old、ParNew、CMS、Parallel...
在上述提供的文件信息中,我们看到一系列关于Java虚拟机(JVM)的知识点。文件主要包括一个链接指向视频资源、云析学院的讲师信息、以及课件的主要内容概要。内容概要被分为三个部分:基础篇、高级篇和优化篇,并...
《深入JVM内核—原理、诊断与优化》是一份深度探索Java虚拟机(JVM)的视频教程,旨在帮助开发者全面理解JVM的工作机制,掌握性能诊断技巧,并能进行有效的优化。本教程覆盖了从基础到高级的JVM主题,不仅适用于Java...