文档库 最新最全的文档下载
当前位置:文档库 › 基于实时性的java虚拟机垃圾收集算法

基于实时性的java虚拟机垃圾收集算法

基于实时性的java虚拟机垃圾收集算法
基于实时性的java虚拟机垃圾收集算法

收稿日期:2010-03-13;修回日期:2010-04-28

基金项目:四川省科技计划项目(2008GZ0003);四川省科技攻关项目(07GG006-019)

作者简介:白江涛(1983-),男,硕士,主要研究方向为软件过程技术与方法;钟勇(1966-),男,研究员,博导,主要研究方向为软件过程技术与方法;朱颢东(1980-),男,博士,CCF 会员,主要研究方向为软件过程技术与方法、文本挖掘、智能信息处理(damianfang001@163.com ).

基于实时性的Java 虚拟机垃圾收集算法

*

白江涛,钟

勇,朱颢东

(中国科学院成都计算机应用研究所,成都610041)

要:提出了一种适用于实时性环境的Java 虚拟机垃圾收集算法。该算法对增量式收集器中堆空间的划分

方式、引用跟踪等方面进行了改进,以减少垃圾收集带来的不确定性暂停,并可以使用户指定一个时间段内垃圾收集导致应用程序暂停的最长时间,从而使其适用于实时性环境。实验结果表明,该算法有效减少了暂停的频率和时长。

关键词:垃圾收集;实时性;增量式收集器;堆空间划分;引用追踪中图分类号:TP18

文献标志码:A

文章编号:1001-3695(2010)09-3431-03

doi :10.3969/j.issn.1001-

3695.2010.09.061Real-time garbage collection algorithm in Java virtual machine

BAI Jiang-tao ,ZHONG Yong ,ZHU Hao-dong

(Chengdu Institute of Computer Application ,Chinese Academy of Sciences ,Chengdu 610041,China )

Abstract :This paper described a garbage collection algorithm for real-time environment.The algorithm improved the division of heap and reference tracking of the incremental garbage collection algorithm for reducing the uncertain pauses caused by gar-bage collection ,

furthermore ,and provided user to give a biggest time value that the application paused in a certain period.All of these made it suitable for real-time environment.Experiment results show that this algorithm does reduce the frequency and

duration of pauses.

Key words :garbage collection (GC );real-time ;incremental garbage collection ;division of heap ;reference tracking

0引言

垃圾收集机制(GC )是Java 语言的一大优势,它实现了对

内存的自动收集与重用,使程序员可以集中精力于算法和程序的逻辑设计,提高软件的质量和生产效率,最重要的是极大减少内存泄露情况的发生。但由于GC 的运行,通常会导致应用程序中的不确定性暂停,暂停的频率和时长都不可预测,使得Java 语言在传统上并不适合开发实时应用程序,限制了其在工业控制、新兴的实时网络游戏等领域的应用。

提高Java 实时性的一个重要方面就是提高GC 的实时性,其基本思想是将垃圾收集导致的暂停限制在一个可控的范围内,满足实时应用程序低暂停时间

[1]

的要求。目前已经有了

针对实时性要求而优化的垃圾收集器,如增量式收集器。本文首先介绍这些收集器,在其基础上进行改进,使其更好地适用于实时性环境,并通过实验验证了改进后的效果。

1

实时性GC 分析

1.1

GC 对性能影响的来源1)造成当前运行线程的停顿

传统GC 采用Stop-the-World [1]的方式运行,运行时,所有其他的线程都被暂停,直到GC 工作完成。

2)遍历对象引用的开销

如果JVM 中的对象很多,那遍

历完所有存活对象必将是很大的开销。

3)清理和回收垃圾的开销遍历完对象引用之后,对垃

圾的清理和回收也有较大的开销。这部分开销可能包括复制

内存块、更新对象引用等。1.2

分代收集器(generational GC )

分代垃圾收集基于一个事实,即绝大多数对象存活的时间很短。研究表明,

在大多数程序中,绝大多数对象(超过90%)都是临时对象,存活的时间很短[2]

。从而将堆空间按照对象

的生命周期划分为不同的区域,

每个区域根据对象的生命周期不同采用不同的垃圾收集算法[2]

。如图1,是Sun 公司的JVM

堆的分代图,灰色部分表示年轻代区域,年轻代可以再分,将存

活的对象逐代提升。

由于分代收集算法在大多数时候都只需对年轻代进行垃圾回收[2]

,有效减少了遍历标记阶段的计算量和停顿时间,有

较高的垃圾回收率。

1.3

增量式收集器(incremental GC )

增量式收集器仍采用分代的方式,并对实时性作了进一步优化。简单地说,增量式收集器就是通过一定的算法,把一个长时间的中断,划分为很多个小的中断,通过这种方式减少垃

圾收集对用户程序的影响。虽然增量式收集在整体性能上可能不如传统垃圾收集器的效率高

[3]

,但是它能够减少程序的

第27卷第9期2010年9月计算机应用研究

Application Research of Computers Vol.27No.9Sep.2010

最长停顿时间。

图2就表示了增量式收集器和传统收集器的比较。其中灰色部分表示线程占用CPU 的时间

Sun JDK 提供的HotSpot JVM 支持增量式垃圾收集,它采用Train GC 算法,基本思想是:在堆中老代与年轻代之间创建一个新区域。这些堆区域划分为火车(train ),每个火车又分为

一系列的车厢(car ),

每个车厢可以分别收集[3]

,这样每次收集时仅对若干车厢进行,因此可以得到很短的收集暂停。

不过这种方法也有很大的不足:a )对象之间引用的维护会很复杂,

增加了应用程序和垃圾收集的工作量;b )尽管垃圾收集引发的暂停缩短,但是垃圾收集的周期,以及每次收集的时间还是不确定。

2实时性GC 的改进

1)堆空间的划分方式

新算法中将堆空间划分为多个固定大小的区域(region ),

如图3所示的R 1 R 4,同时在每个区域上保留代的概念,以利用分代收集算法的高效率

这样划分的好处有:

a )对堆中的对象进行遍历标记时,可以更好地并行执行;

b )垃圾收集以这些区域为单位进行,回收时可以仅回收一部分区域,

增加了灵活性,同时较之增量收集器也减少了维护区域内对象之间引用的复杂性;

c )更大的好处在于,因为区域大小固定,所以允许JVM 指定在某个时间段内GC 所导致的应用暂停的最大时间为多少,通过预测在这个时间内可以完整回收若干区域,这对实时性应用来说非常重要。

假设允许暂停的最大时间为T ,预测收集每个区域的平均时间为t (包括标记和清理的时间),规定一个阈值L ,表示每次GC 所能收集的区域数的最大值。这样就得到在暂停的时间段内可以进行的垃圾回收次数为(T /tL +1)的整数值。因此垃圾收集的频率和每次收集的时间就可以确定了,适当调整参数的值,完全可以使系统达到一种准实时响应的效果。

2)引用追踪

堆空间划分多个区域后,区域之间的对象引用通过记录集

来维护,如图3所示的r s 1 r s 4。每个区域都有一个对应的记录集。其中包含了引用当前区域中对象的区域的对象的指针,如在图3的r s 1中就记录了一条从R 2中的S 对象到R 1中的O 对象的引用。由于除了GC 外应用也会造成区域中对象的引用关系不断地发生改变,每个应用的线程都有一个关联的记录集log ,用于缓存和序列化线程运行时对区域间引用关系的修改。如果造成的改变仅为同一区域中的对象之间的关联,则不记录log ;如造成的改变为跨区域中的对象的关联,则记录到线程的记录集log 中,待垃圾收集进行时,log 中的记录被处理,相关的区域的记录集表更新。

3)收集过程

(1)首先从每个区域的根集[4]出发,对本区域的对象进行标记,由于区域之间相对独立,可以利用多CPU 或多线程对所有区域并行处理,这一步要暂停应用的执行。

(2)按照(1)步中扫描到的对象进行遍历,以识别这些对象的下层对象的活跃状态,这一步中会涉及对象之间跨区域引用的情况,并对区域的记录集及时更新。在此期间应用线程可以并发执行,修改的对象的依赖关系则记录到线程的记录集log 中。

(3)把应用线程中存在的记录集log 的内容进行处理,并相应地修改区域对应的记录集,这一步需要暂停应用,且并行运行。

(4)根据区域中活跃对象所占的空间大小(Byte )进行排序,首先回收活跃对象空间小以及回收耗时短(预估出来的时间)的区域;回收的方法为将此区域中的活跃对象复制到另外的区域中,并根据指定的GC 所能占用的时间来估算能回收多少区域。

整个收集过程如图4所示,

GC 线程的双箭头表示并行运行。3实验结果与分析

实验采用几种典型的应用来对新算法和增量式垃圾回收

算法,

在回收效率、平均暂停时间、暂停次数等方面进行比较。其中新算法用C 语言实现,增量式垃圾回收算法直接使用Sun JDK1.4.1(更高版本已不支持[5])中所带的,使用参数-Xincgc 启用

[6]

在参数设置上,增量式收集器将最大堆空间设为64MB (使用参数-Xmx [6]),其他采用默认设置;新算法中最大堆空间也设为64MB ,堆内域的数量为10。

应用包括一款游戏软件(game )、一个实时温度监控系统(temperature )、一个股票应用软件(stock )和一段产生较多垃圾

·

2343·计算机应用研究第27卷

对象的程序(program )。从表1中可以看出,新算法在有效压缩GC 引起的暂停时间和暂停次数的同时,均大幅提高了垃圾回收的效率,最大的增幅有两倍多,这主要得益于堆空间划分方式对并行收集的良好支持。

表1

算法的执行结果

应用效率/千字节/ms

平均暂停时间/ms

暂停次数新算法增量式GC 新算法增量式GC 新算法增量式GC

game 7.84.05.98.82539temperature 5.73.16.29.41736stock 5.22.45.08.22344program

11.8

9.6

5.5

7.9

9

25

通过对堆空间域数量参数的调节发现,垃圾收集的效率随着域数量的增加呈抛物线性变化,开始性能的提升得益于分代收集算法的思想,当域数量增大到一定程度时,维护引用、遍历标记对象以及垃圾清理的开销都会变大,

从而降低了收集的效率。而暂停时间和频率因为最大暂停时间的限制,保持在一个相对稳定的状态。

4结束语

本文提出了一种对Java 堆空间的新的划分方法,将因垃

圾收集而导致的程序暂停时间和次数限制在一个可控的范围内,

并可以通过相关参数的调节,达到一个最优的状态,满足了实时性应用所要求的短暂停,同时保持了一个较高的收集效率。

参考文献:

[1]BAKER H G.List processing in real-time on a serial computer [J ].

Communications of the ACM ,1978,21(4):280-294.

[2]谌宁,覃征.基于嵌入式Java 虚拟机的垃圾回收算法.[J ]

.计算机应用,

2005,25(1):218-223.[3]GOETZ B.Java theory and practice :Garbage collection in the HotSpot

JVM [EB /OL ].[2003-11-25].http ://www.ibm.com /developer-works /library /j-jtp11253/index.html ?S _TACT =105AGX52&S _CMP =cn-a-j.

[4]YUASA T.Real-time garbage collection on general-purpose machines

[M ].NewYork :Elsevier Science Inc ,1990.

[5]Tuning garbage collection with the 1.4.2Java virtual machine [EB /

OL ].[2003].http ://java.sun.com /docs /hotspot /gc1.4.2/.[6]A collection of JVM options [EB /OL ].[2007].http ://blogs.sun.

com /watt /resource /jvm-options-list.html.

[7]SACHINDRAN N ,ELIOT J ,MOSS B.Mark-copy :fast copying GC

with less space overhead [C ]//Proc of the 18th ACM SIGPLAN OO-PSLA.New York :ACM ,2003:326-343.

[8]BIRON B ,SCIAMPACONE R.Real-time Java [M ].Beijing :O ’Reil-ly ,2007.

[9]张宁,熊光泽.基于关键引用验证的分布式实时垃圾搜集器[J ].

计算机应用研究,

2009,26(11):4036-4038.[10]赵苑苑,王万诚,黄广君,等.无用内存单元自动回收过程的实时

性问题研究[J ]

.计算机应用与软件,2006,23(2):137-139.[11]DETLEFS D ,FLOOD C ,HELLER S ,et al .Garbage-first garbage col-lection [EB /OL ].[2009].http ://research.sun.com /jtech /pubs /04-g1-paper-ismm.pdf.

(上接第3408页)不仅包含了基于浏览速度的计算方法,而且进

一步引入了基于有效信息的算法,更客观地考虑了影响兴趣度权值的因素

5结束语

为了提高用户兴趣分类及其兴趣度计算的准确性,在原有

方法基础上,考虑特征词语义以及在文本层面的重要性,引入加权语义网对文本相似度进行计算;在计算用户兴趣度时,提出有效信息概念及其计算方法,更准确描述了浏览时间对用户兴趣度的影响。实验证明,该方法提高了用户分类的准确性,提高了兴趣度计算的准确性。个性化用户兴趣建模是一个比较复杂的过程,本文方法仍需进一步改进:a )由于WordNet 是一个英文词汇网,本文相似度计算只适合英文站点,未来的研究中,进行中文语义方面的研究。b )更全面地考虑用户其他浏览行为,进一步提高兴趣度权值的计算精度。参考文献:

[1]WU Yi-hung ,CHEN Yong-chuan ,CHEN A L P.Enabling persona-lized recommendation on the Web based on user interests and beha-

viors [C ]//Proc of the 11th International Workshop on Research Is-sues in Data Engineering.Washington DC :IEEE Computer Society ,2001:17-24.

[2]陈冬玲,王大玲,于戈.支持个性化检索的User Profile 研究概述

[J ].小型微型计算机系统,2008,29(10):1903-1907.

[3]GAUCH S ,CHAFEE J ,PRETSCHNER A.Ontology-based persona-lized search and browsing [J ].Web Intelligence and Agent Sys-tems ,2003,1(3):219-234.

[4]KIM H.Learning implicit user interest hierarchy for Web personaliza-tion [D ].Florida :Institute of Technology ,2005.

[5]TAKAMA Y ,ISHIBASHI T.M2VSM :extension of vector space

model by introducing meta keyword [C ]//Proc of World Automation Congress.Hawaii :World Automation Congress Proceedings ,2008:179-184.

[6]GANESAN P ,GARCIA-MOLINA H ,WIDOM J.Exploiting hierar-chical domain structure to compute similarity [J ].ACM Trans on In-formation Systems ,2003,21(1):64-93.

[7]YANG Zhen ,LEI Jian-jun ,Wang Jian ,et al .Improved VSM for in-cremental text classification [C ]//Proc of International Evectrohic Conference on Computer Science.[S.l.]:AIP Conference Procee-dings ,

2008:369-373.[8]郭庆琳,李艳梅,唐琦.基于VSM 的文本相似度计算的研究

[J ].计算机应用研究,2008,25(11):3256-3258.

[9]LARSEN B ,AONE C.Fast and effective text mining using linear-time document clustering [C ]//Proc of International Conference on Knowledge Discovery and Data Mining.California :ACM Press ,2006:16-22.

·

3343·第9期白江涛,等:基于实时性的Java 虚拟机垃圾收集算法

水上垃圾清理装置 论文

水上垃圾清理装置 1 论文摘要 1.1中文摘要 摘要 随着我国现代化进程的加快、垃圾产生量的增加,水上漂浮垃圾的数量也日益增多,而现有人工清理方式不仅效率低下,而且带有一定的危险性。鉴于此,我们设计了这个水上垃圾清理装臵,以实现对漂浮垃圾环保、高效的收集。【关键词】垃圾收集清理环保节能

目录 1 论文摘要 (1) 1.1 中文摘要 (1) 1 引语 (1) 2 作品简介 (1) 3 作品分类 (1) 4 设计目的 (1) 5 设计基本思路 (1) 6 作品原理简介 (1) 7 作品模型图片及照片 (1) 8 使用说明 (3) 9 作品主要创新点 (3) 10 作品可行性 (4) 11 技术特点优势分析 (4) 12 适应范围 (5) 13 市场分析 (5) 14 经济效益预测 (5) 15 推广价值 (5) 16 结束语 (7)

1 引语 自古中华民族就以秀丽的山河文明于世,而在改革开放三十多年之后,我们要以更加美好的景色欢迎世界各地的友人。但随着现代化的加快,我们看到的却已不是美丽的山河,而是工业文明所导致的环境污染,以及由此所引发的种种疾病,灾难。有鉴于此,我们设计了这个水上垃圾清理装臵,希望以此为祖国环境保护尽自己的绵薄之力。 2作品简介 本作品利用船只自身行进过程与水面的相对运动,带动垃圾收集器工作,达到收集清理水面漂浮垃圾的目的。广泛适用于河面,湖面,海面等垃圾比较多的区域。具有环保、无污染、收集效率高、操作简单、成本低廉等特点。 3作品分类 机械控制与能源化工类 4设计目的 本作品是专为清理河流湖泊及海面上的漂浮垃圾而设计的。机械化的设计不仅无需外加动力,美观的外形也成为水上一道靓丽的风景线,亦可起到宣传环保意识的作用。 5设计基本思路 河流湖泊漂浮垃圾多,人工清理费时费力。本作品主要利用船只作为收集清理载体,配合本作品加以简单改装,即可实现利用船只的闲余能源清理漂浮垃圾的目的。 6作品原理简介 船只前进过程中,水流的冲击力使位于船只后方的叶轮转动,叶轮带动传送带的转动。传送带上的传送收集袋在随传送带转动的过程中把位于收集口后方的垃圾收集起来。随着传送带的转动,传送收集袋运动至后方的收集器上方,并随传送带转动,将垃圾倒入收集器中。此收集过程往复循环。 7作品模型图片及照片

Java虚拟机(JVM)参数配置说明

Java虚拟机(JVM)参数配置说明 在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。 JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“O utOfMem ory”类型的错误。呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。 为了说明这些参数,还需要说说JDK中的命令行工具一些知识做铺垫。 首先看如何获取这些命令配置信息说明: 假设你是windows平台,你安装了J2SDK,那么现在你从cmd控制台窗口进入J2SDK安装目录下的bin目录,然后运行java命令,出现如下结果,这些就是包括java.exe工具的和J VM的所有命令都在里面。 ----------------------------------------------------------------------- D:\j2sdk15\bin>java Usage: java [-options] class [args...] (to execute a class) or java [-options] -jar jarfile [args...] (to execute a jar file) where options include: -client to select the "client" VM -server to select the "server" VM -hotspot is a synonym for the "client" VM [deprecated] The default VM is client.

JVM的垃圾回收机制小读

JVM的垃圾回收机制小读 技术2010-05-09 19:41:04 阅读20 评论2 字号:大中小订阅 今天下午突然遇到了一个内存漏洞的问题,所以上网查了查,结果看到了一篇文章,说的是jvm的垃圾回收机制,下面粘过来,看了好久才看完的,说的思路有点含糊,还给带了点代码,这样还不错……对JVM 的内存管理机制有加深了一层理解哈………… 下面是那篇文章,喜欢的可以看看…………O(∩_∩)O………… Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立, 但是它们不需要程序代码来显式地释放。 引言 Java的堆是一个运行时数据区,类的实例(对象)从中分配空间。Java虚拟机(JVM)的堆中储存着正在运行的应用程序所建立的所有对象,这些对象通过new、newarray、anewarray和multianewarray等指令建立,但是它们不需要程序代码来显式地释放。一般来说,堆的是由垃圾回收来负责的,尽管JVM规范并不要求特殊的垃圾回收技术,甚至根本就不需要垃圾回收,但是由于内存的有限性,JVM在实现的时候都有一个由垃圾回收所管理的堆。垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能。 垃圾收集的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾收集意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。事实上,除了释放没用的对象,垃圾收集也可以清除内存记录碎片。由于创建对象和垃圾收集器释放丢弃对象所占的内存空间,内存会出现碎片。碎片是分配给对象的内存块之间的空闲内存洞。碎片整理将所占用的堆内存移到堆 的一端,JVM将整理出的内存分配给新的对象。 垃圾收集能自动释放内存空间,减轻编程的负担。这使Java 虚拟机具有一些优点。首先,它能使编程效率提高。在没有垃圾收集机制的时候,可能要花许多时间来解决一个难懂的存储器问题。在用Java 语言编程的时候,靠垃圾收集机制可大大缩短时间。其次是它保护程序的完整性,垃圾收集是Java语言 安全性策略的一个重要部份。 垃圾收集的一个潜在的缺点是它的开销影响程序性能。Java虚拟机必须追踪运行程序中有用的对象,而且最终释放没用的对象。这一个过程需要花费处理器的时间。其次垃圾收集算法的不完备性,早先采用的某些垃圾收集算法就不能保证100%收集到所有的废弃内存。当然随着垃圾收集算法的不断改进以及软硬件运行效率的不断提升,这些问题都可以迎刃而解。 垃圾收集的算法分析

用于近海垃圾收集的两栖机器人

用于近海垃圾收集的两栖机器人 摘要:设计方案来源于水陆两用垃圾收集船,考虑到沙滩地形的复杂性,采用履带式,使其在沙滩行走时更具稳定性。设计垃圾收集两栖机器人主要为打捞水面垃圾和陆地垃圾收集提供操作灵活的设备。机械设备是垃圾收集两栖机器人的重要组成部分,该方案重点介绍船体与履带、中心转塔支柱、垃圾收集器等的机械构造的设计。 正文: 机械机构设计: 该作品主要是以船为主体,履带不仅提供在沙滩上的动力,而且提供水面上前进的动力。 船体与履带: 船的基本尺寸为:0.2m*0.15m

穿的周身为塑料密封材料,穿的上部(即船的顶部甲班为太阳能板)船身为流线型减轻阻力 船体的内部构造如下图所示: 履带采用四轮、四马达设计,船体内部用齿轮进行履带轮的传动,中间为蓄电池及控制电路 履带轮较之履带突出一部分改装为轮桨腿式,在水面上靠此

结构前进。轮浆腿的材料为铝片 形状如下图所示: 也可采用我们先前讨论的方案进行设计。 垃圾收集器: 水面垃圾收集: 海面垃圾收集器外观呈簸箕形状,三面用铝板做成,而铝板上被扎成“千疮百孔”,上面有无数个孔眼,以让海水通过。用铝板的目的是:铝板质轻且不易生锈,成本较低 形状如下图的中间部分。

垃圾收集器与中心与中心转塔支柱连在一起,工作时将它放下与海面平行,船驶过时将漂浮的垃圾收入囊中。不工作时利用中心转塔支柱将其抬起。 垃圾收集器采用收割机式滚筒 两个马达,独立的动力系统 材料均为橡胶

中心转塔支柱: 中心转塔支柱采用吊桥式结构,自由度少(两个自由度),未定性更高,材料主要为铝片、细钢丝、滑轮等,成本低。 电源系统: 主要由蓄电池及太阳能板供给能源 蓄电池采用铅蓄电池 电压为10v 尺寸44*35*90mm 太阳能板的尺寸船体甲板一样 容量为150MA 电压为6v

垃圾回收机制

浅谈JAVA垃圾回收机制 摘要:垃圾回收机制是JAVA的主要特性之一,在对垃圾回收机制进行概述之后,本文从“失去引用”和“离开作用域”这两个角度分析了JAVA程序中的对象在何种条件下满足垃圾回收的要求。最后,本文简要介绍了垃圾回收机制的两个特性。 关键词:JAVA;垃圾回收机制;离开作用域;失去引用;自动性;不可预期性 作为一种适应于Internet计算环境、面向对象并具有平台无关性的编程语言,JAVA早已确立了在IT界的地位,并因网络日益广泛的应用而变得越来越重要。因此,在高校中JAVA也逐渐受到更多教师和学生的重视。 实际上,JAVA源自C++语言。但JAVA语言避免了C++中晦涩的结构,成功翻越了多重继承机制的恼人问题;JAVA的垃圾回收机制显著地提高了生产率,降低了复杂度;在网络背景下使用虚拟机,以及有关安全性和动态加载的一系列设计选择,迎合了正在出现的需求和愿望。这些特性使Java不仅成为现有程序员的武器,而且也为新的程序员创造了繁荣的市场空间。在JAVA语言的上述特性中,本文主要分析其垃圾回收机制。 一、JAVA垃圾回收机制概述 在VB、C++等某些程序设计语言中,无论是对象还是动态配置的资源或内存,都必须由程序员自行声明产生和回收,否则其中的资源将不断消耗,造成资源的浪费甚至死机。由于要预先确定占用的内存空间是否应该被回收是非常困难的,这就导致手工回收内存往往是一项复杂而艰巨的工作。因此,当使用这些程序设计语言编程时,程序员不仅要考虑如何实现算法以满足应用,还要花费许多精力考虑合理使用内存避免系统崩溃。 针对这种情况,JAVA语言建立了垃圾回收机制。JAVA是纯粹的面向对象的编程语言,其程序以类为单位,程序运行期间会在内存中创建很多类的对象。这些对象在完成任务之后,JAVA 的垃圾回收机制会自动释放这些对象所占用的空间,使回收的内存能被再次利用,提高程序的运行效率。垃圾回收不仅可以提高系统的可靠性、使内存管理与类接口设计分离,还可以使开发者减少了跟踪内存管理错误的时间,从而把程序员从手工回收内存空间的繁重工作中解脱出来。 JAVA垃圾回收机制另一个特点是,进行垃圾回收的线程是一种低优先级的线程,在一个Java 程序的生命周期中,它只有在内存空闲的时候才有机会运行。 下面本文从“对象的失去引用”和“对象离开作用域”这两个方面进行分析,探讨JAVA程序中的对象什么时候可以被当作垃圾来进行回收。 二、对象的失去引用 通过下面的一段JAVA程序(例1),我们可以讨论程序中的对象是否已经符合垃圾回收的条

Java虚拟机工作原理(JVM)

As the Java V irtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions. Java虚拟机是基于栈的(stack-based machine)。几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。 1Java体系结构介绍 Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems: 1.1 Java体系结构包括哪几部分? Java体系结构包括4个独立但相关的技术 the Java programming language →程序设计语言 the Java class file format →字节码文件格式 the Java Application Programming Interface→应用编程接口 the Java V irtual Machine →虚拟机 1.2 什么是JVM java虚拟机和java API组成了java运行时。 1.3 JVM的主要任务。 Java虚拟机的主要任务是装载class文件并执行其中的字节码。 Java虚拟机包含了一个类装载器。 类装载器的体系结构 二种类装载器 启动类装载器 用户定义的类装载器 启动类装载器是JVM实现的一部分 当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。 1.4 为什么java容易被反编译? ●因为java程序是动态连接的。从一个类到另一个类的引用是符号化的。在静态连接的 可执行程序中。类之间的引用只是直接的指针或者偏移量。相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。

java垃圾回收机制

上次讲到引用类型和基本类型由于内存分配上的差异导致的性能问题。那么今天就来聊一下和内存释放(主要是gc)有关的话题。 事先声明一下:虽说sun公司已经被oracle吞并了,但是出于习惯,同时也为了偷懒节省打字,以下仍然称之为sun公司。 ★jvm的内存 在java虚拟机规范中(具体章节请看“这里”),提及了如下几种类型的内存空间: ◇栈内存(stack):每个线程私有的。 ◇堆内存(heap):所有线程公用的。 ◇方法区(method area):有点像以前常说的“进程代码段”,这里面存放了每个加载类的反射信息、类函数的代码、编译时常量等信息。 ◇原生方法栈(native method stack):主要用于jni中的原生代码,平时很少涉及。 关于栈内存(stack)和堆内存(heap),已经在上次的帖子中扫盲过了,大伙儿应该有点印象。由于今天咱们要讨论的“垃圾回收”话题,主要是和堆内存(heap)有关。其它的几个玩意儿不是今天讨论的重点。等以后有空了,或许可以单独聊一下。 ★垃圾回收机制简介 其实java虚拟机规范中并未规定垃圾回收的相关细节。垃圾回收具体该怎么搞,完全取决于各个jvm的设计者。所以,不同的jvm之间,gc的行为可能会有一定的差异。下面咱拿sun官方的jvm来简单介绍一下gc的机制。 ◇啥时候进行垃圾回收? 一般情况下,当jvm发现堆内存比较紧张、不太够用时,它就会着手进行垃圾回收工作。但是大伙儿要认清这样一个残酷的事实:jvm进行gc的时间点是无法准确预知的。因为gc启动的时刻会受到各种运行环境因素的影响,随机性太大。 虽说咱们无法准确预知,但如果你想知道每次垃圾回收执行的情况,还是蛮方便的。可以通过jvm的命令行参数“-xx:+printgc”把相关信息打印出来。 另外,调用system.gc()只是建议jvm进行gc。至于jvm到底会不会做,那就不好说啦。通常不建议自己手动调用system.gc(),还是让jvm自行决定比较好。另外,使用jvm命令行参数“-xx:+disableexplicitgc”可以让system.gc()不起作用。 ◇谁来负责垃圾回收? 一般情况下,jvm会有一个或多个专门的垃圾回收线程,由它们负责清理回收垃圾内存。 ◇如何发现垃圾对象? 垃圾回收线程会从“根集(root set)”开始进行对象引用的遍历。所谓的“根集”,就是正在运行的线程中,可以访问的引用变量的集合(比如所有线程当前函数的参数和局部变量、当前类的成员变量等等)。垃圾回收线程先找出被根集直接引用的所有对象(不妨叫集合1),然后再找出被集合1直接引用的所有对象(不妨叫集合2),然后再找出被集合2直接引用的所有对象......如此循环往复,直到把能遍历到的对象都遍历完。 凡是从根集通过上述遍历可以到达的对象,都称为可达对象或有效对象;反之,则是不可达对象或失效对象(也就是垃圾)。 ◇如何清理/回收垃圾? 通过上述阶段,就把垃圾对象都找出来。然后垃圾回收线程会进行相应的清理和回收工作,包括:把垃圾内存重新变为可用内存、进行内存的整理以消除内存碎片、等等。这个过程会涉及到若干算法,有兴趣的同学可以参见“这里”。限于篇幅,咱就不深入聊了。 ◇分代 早期的jvm是不采用分代技术的,所有被gc管理的对象都存放在同一个堆里面。这么做的缺点比较明显:每次进行gc都要遍历所有对象,开销很大。其实大部分的对象生命周期都很短(短命对象),只有少数对象比较长寿;在这些短命对象中,又只有少数对象占用的内存空间大;其它大量的短命对象都属于小对象(很符合二八原理)。 有鉴于此,从jdk 1.2之后,jvm开始使用分代的垃圾回收(generational garbage collection)。jvm把gc相关的内存分为年老代(tenured)和年轻代(nursery)、持久代(permanent,对应于jvm规范的方法区)。大部分对象在刚创建时,都位于年轻代。如果某对象经历了几轮gc还活着(大龄对象),就把它移到年老代。另外,如果某个对象在创建时比较大,可能就直接被丢到年老代。经过这种策略,使得年轻代总是保存那些短命的小对象。在空间尺寸上,年轻代相对较小,而年老代相对较大。 因为有了分代技术,jvm的gc也相应分为两种:主要收集(major collection)和次要收集(minor collection)。主要收集同时清理年老代和年轻代,因此开销很大,不常进行;次要收集仅仅清理年轻代,开销很小,经常进行。 ★gc对性能会有啥影响? 刚才介绍了gc的大致原理,那gc对性能会造成哪些影响捏?主要有如下几个方面: ◇造成当前运行线程的停顿 早期的gc比较弱智。在它工作期间,所有其它的线程都被暂停(以免影响垃圾回收工作)。等到gc干完活,其它线程再继续运行。所以,早期jdk的gc一旦开始工作,整个程序就会陷入假死状态,失去各种响应。

水面垃圾清理机器说明书

专业课程设计说明书 题目:水面垃圾清理机器的设计 指导教师:何韶君 班级:机械设计制造及其自动化专业142班设计者:杨威威 学号:2014031224 校院:大连民族大学机电工程学院

目录 专业课程设计说明书 (1) 一.摘要 (2) 二.Abstract (3) 三.引言 (4) 四.机器人结构设计 (4) 四.1 整体结构设计理念 (4) 四.2 整体结构设计 (5) 四.3 垃圾收集装置设计 (6) 四.4 垃圾辅助收集装置设计 (7) 五.船重和排水量的计算 (7) 六.最大吃水深度的计算 (8) 七.动力装置设计 (8) 八.硬件设计 (10) 八.1系统总体设计 (10) 八.2电源模块 (11) 八.3电机驱动模块 (11) 八.4无线传输模块 (12) 八.5继电器模块 (12) 八.6主程序设计 (13) 九.影像收集系统设计 (13) 十.工作参数,待机和工作时长 (14) 十一. 垃圾收集特性及参数 (14) 十二.外观特性 (15) 十三. 控制方式 (15) 十四. 成本报告 (15) 十六. 市场分析 (19) 十六.1 市场推广 (19) 十六.2 盈利模式 (20) 结束语 (20) 参考文献: (20) 一.摘要 本文为解决现如今小型封闭水面垃圾清理耗费人力物力等问题,设计制作了一款由人工辅助远程遥控进行水面垃圾清理的机器人。水面垃圾打捞船针对水面环境污染的问题,主要致力于中小型湖泊河流等水域的固体垃圾清理,如塑料袋、饮料瓶,树枝树叶以及其它易清理的水面垃圾。实现水面垃圾清理的机械化与自动化,整个打捞过程无需人工直接参与,安全性非常好,效率大约是人工打捞的几十倍,水面越大、距离越远效果越显著。本文主要对水面垃圾自动打捞船进行了船体结构、动力装置、打捞及传输装置、垃圾存储装置以及其他零部件的设计、计算及校核等。分析了水面垃圾自动打捞船需要实现的功能要求,

java虚拟机详解 免费

深入理解JVM 1 Java技术与Java虚拟机 说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成: Java编程语言、Java类文件格式、Java虚拟机和Java应用程序接口(Java API)。它们的关系如下图所示: 图1 Java四个方面的关系 运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件)。最后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。从上图也可以看出Java平台由Java虚拟机和Java应用程序接口搭建,Java 语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:

在Java平台的结构中, 可以看出,Java虚拟机(JVM) 处在核心的位置,是程序与底层操作系统和硬件无关的关键。它的下方是移植接口,移植接口由两部分组成:适配器和Java操作系统, 其中依赖于平台的部分称为适配器;JVM 通过移植接口在具体的平台和操作系统上实现;在JVM 的上方是Java的基本类库和扩展类库以及它们的API,利用Java API编写的应用程序(application) 和小程序(Java applet) 可以在任何Java平台上运行而无需考虑底层平台, 就是因为有Java虚拟机(JVM)实现了程序与操作系统的分离,从而实现了Java 的平台无关性。 那么到底什么是Java虚拟机(JVM)呢?通常我们谈论JVM时,我们的意思可能是: 1. 对JVM规范的的比较抽象的说明; 2. 对JVM的具体实现; 3. 在程序运行期间所生成的一个JVM实例。 对JVM规范的的抽象说明是一些概念的集合,它们已经在书《The Java Virtual Machine Specification》(《Java虚拟机规范》)中被详细地描述了;对JVM的具体实现要么是软件,要么是软件和硬件的组合,它已经被许多生产厂商所实现,并存在于多种平台之上;运行Java程序的任务由JVM的运行期实例单个承担。在本文中我们所讨论的Java虚拟机(JVM)主要针对第三种情况而言。它可以被看成一个想象中的机器,在实际的计算机上通过软件模拟来实现,有自己想象中的硬件,如处理器、堆栈、寄存器等,还有自己相应的指令系统。 JVM在它的生存周期中有一个明确的任务,那就是运行Java程序,因此当Java程序启动的时候,就产生JVM的一个实例;当程序运行结束的时候,该实例也跟着消失了。下面我们从JVM的体系结构和它的运行过程这两个方面来对它进行比较深入的研究。 2 Java虚拟机的体系结构 刚才已经提到,JVM可以由不同的厂商来实现。由于厂商的不同必然导致JVM在实现上的一些不同,然而JVM还是可以实现跨平台的特性,这就要归功于设计JVM时的体系结构了。 我们知道,一个JVM实例的行为不光是它自己的事,还涉及到它的子系统、存储区域、数据类型和指令这些部分,它们描述了JVM的一个抽象的内部体系结构,其目的不光规定实现JVM时它内部的体系结构,更重要的是提供了一种方式,用于严格定义实现时的外部行为。每个JVM都有两种机制,一个是装载具有合适名称的类(类或是接口),叫做类装载子系统;另外的一个负责执行包含在已装载的类或接口中的指令,叫做运行引擎。每个JVM又包括方法区、堆、Java栈、程序计数器和本地方法栈这五个部分,这几个部分和类装载机制与运行引擎机制一起组成的体系结构图为:

JAVA垃圾回收机制论文

JAVA的垃圾回收机制探究 摘要:垃圾回收机制是java的主要特性之一,在对垃圾回收机制的意义进行概述之后,文章分析了java程序中的对象在何种条件下满足垃圾回收的要求以及在垃圾回收中应该注意的几个问题。 关键词:java;垃圾回收机制 中图分类号:tp312文献标识码:a文章编号:1007-9599 (2011) 24-0000-01 java garbage collection mechanism study wang xin (daqing petroleum administration communications company,daqing163453,china) abstract:java garbage collection mechanism is one of the main features of the garbage collection mechanism for an overview of the meaning,the paper analyzes the objects in the java program to meet the conditions under which the requirements of garbage collection and garbage collection should be noted a few questions. keywords:java;garbage collection mechanism 一、垃圾收集的意义 在c++中,对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。jvm的

水面垃圾智能收集装置

华北水利水电大学 大学生创新训练项目研究报告 项目名称:水面垃圾智能联合收集装置 项目负责人:沈杰 项目所属学院:机械学院 指导教师:

一、研究目标 传统的清洁方式是人工打捞清理,这种方式效率低且劳动强度大,适用于各种水域范围。随着科技的进步与社会的发展,人工打捞清理的效率低下和劳动强度大的缺点越来越突出了,随后出些了自动垃圾打捞船。自动打捞船对漂浮废物可自动打捞,也就是在船只航行的过程中依托水流的力气将打捞的树枝、水生植物、塑料袋等漂浮废物送入船舱内,可快速的大量清理废物,缩短保洁时刻。比起人工打捞有显着的优势,节省人力,降低劳动强度。但是为了保证清洁效率这些船设计的都很大,适用于大中型水域环境,无法使用于人们日常生活总经常接触到的小型水域环境。我们的项目为解决目前城市河道及风景区水域及小流域水面垃圾收集的问题,本项目拟设计一款小型全自动的水面垃圾收集装置,采用视觉传输技术,自动控制技术,特殊的结构方案等,将垃圾识别,收集,实现垃圾打捞的智能化、一体化、高效化,从而真正实现智能化作业。 二、研究过程 本次设计想要设计出一套水面垃圾自动清洁船控制系统,最终欲实现的主要任务目标有: (1)小船的基本航行功能,包括前进、后退、停止、加减速等; (2)识别水面垃圾并能进行回收。 整个系统设计由船体及推进装置、主控制芯片、电机和电机驱动电路、供电电源以及图像识别传感器等构成。 1.船体及推进装置 船体的构造与设计直接决定小船能否安全运行以及运行是否顺畅,推进装置的选择与设计将影响小船的运行效率以及安全性、稳定性等。为了保证小船能够安全、稳定、高效地在水面行驶,我们必须对智能小船的外型构造以及推动装置进行合理的选择与设计,保证各个组成部分能够相互配合。 船体应按空间大小,运行稳定,坚固性等要求来设计,我们使用过纯3D打印船体(重量小),雪弗板拼装船体(空间大,重量大),DIY塑料船体(重量小,使用方便)。 2.主要控制系统 主控系统是实现智能船无线控制的中枢,主控系统的工作正常与否直

深入理解Java虚拟机笔记(带目录)

目录 1.虚拟机内存结构 (1) 2.对象在内存中的布局 (3) 3.判断对象是否死亡 (4) 4.引用的4中情况 (4) 5.垃圾收集算法 (5) 6.HotSpot虚拟机算法实现 (6) 7.如何在GC发生时让所有线程都要附近的安全点停下 (6) 8.垃圾收集器 (7) 9.GC日志 (9) 10.内存分配 (10) 11.Class类文件的结构 (10) 12.类的生命周期 (13) 13.类加载器 (15) 14.运行时栈帧的结构 (16) 15. 方法调用 (18) 16. 分派 (19) 17.虚方法表 (19) 18.Java内存模型(JMM) (19) 19.内存间的交互 (20) 20.volatile变量 (20) 21.原子性 (21) 22.可见性 (22) 23.有序性 (22) 24.先行发生原则 (22) 25.Java线程调度 (23) 26.线程的状态 (24) 27.线程安全 (25) 28.线程安全的实现方法 (26) 29.锁优化 (27) 30.编译优化技术 (29) 1.虚拟机内存结构 线程私有:虚拟机栈,本地方法栈,程序计数器 线程共享:堆,方法区(包括运行时常量池)

1.1程序计数器 当前程序锁执行的字节码行号指示器,记录下一条需要执行的 指令。 1.2虚拟机栈 生命周期与线程相同,每个方法在执行时都会创建一个栈帧。 方法执行的过程,就是栈帧入栈到出栈的过程。 栈帧用于存放局部变量表,操作数栈,动态链接,方法出口等 信息。 局部变量表存放了编译期可知的基本数据类型和对象引用。1.3 本地方法栈 为虚拟机使用到的Native方法服务。 目前HotSpot虚拟机将本地方法栈和虚拟机栈合二为一。 1.4堆 存放对象实例,所有线程共享。 1.5 方法区(永久代) 存放被虚拟机加载的类信息,常量,静态变量,即时编译器编 译后的代码等。

详细介绍Java垃圾回收机制

详细介绍Java垃圾回收机制 垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。 引用计数收集器 引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用都一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b 引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。 优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较利。 缺点:无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0. 跟踪收集器 早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。 下一步,GC要删除不可到达的对象。删除时,有些GC只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多GC可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。

水面垃圾自动打捞船的设计(毕业设计)

摘要 水面垃圾自动打捞船针对水面环境污染的问题,主要致力于中小型湖泊河流等水域的固体垃圾清理,如塑料袋、饮料瓶,树枝树叶以及其它易清理的水面垃圾。实现水面垃圾清理的机械化与自动化,整个打捞过程无需人工参与,安全性非常好,效率大约是人工打捞的几百倍,水面越大、风浪越大效果越显著。 本文主要对水面垃圾自动打捞船进行了船体结构、动力装置、打捞及传输装置、垃圾存储装置以及其他零部件的设计、计算及校核等。分析了水面垃圾自动打捞船需要实现的功能要求,在实际环境背景下,研究了水面垃圾自动打捞船的系统构成及功能、各零部件的的设计方法以及系统的实现方式。 此设计除了动力装置与其他船类大体相似,实现打捞和传输的装置以及垃圾存储装置都有一定的创新性设计。采用链齿轮与链条的传动带动传输带的形式,以及船体前方挡板引导装置和叶轮的设计都使得水面垃圾的收集更加有效率。此外,垃圾存储装置采用的是三个可替换式的存储箱,其底部设计为多孔式,使得水面垃圾的收集更加方便,可执行性有所加强。 本文还附有部分水面垃圾收集船的结构图,装配图,零件图,以便详细的说明设计过程。 关键字:水面垃圾自动打捞船环境保护结构设计

Abstract An autonomous ship for cleaning the garbage floating on a lake is designed for the water pollution problems,mainly to solid waste on small and medium sized lakes , rivers and other waters,such as plastic bags,bottles,leaves,twigs,and other surface trash which is easy to clean. To achieve clean the water garbage mechanized and automatically , the entire salvage process without human intervention , security is very good , efficiency is about hundreds of times than artificial salvage. The greater the surface and more significant storms, the greater the effect is. This essay focuses on the design,computing and checking of hull structure , power plant, salvage and transport equipment,garbage storage devices and other components of the an autonomous ship . In the case of the understanding of the results of the design required to achieve the functional requirements, as well as the actual environmental background to study the design of the structure and function of the water garbage sweeper system . This power plant design in addition to the other boat classes are generally similar . And garbage storage devices, the device to achieve salvage and transport have some innovative designs.Form of the sprockets and the chain transmission is driven by a transmission belt,and the hull in front of the baffle means and the guide surface of the impeller are designed so that garbage collection more efficient.In addition, garbage storage device uses three replaceable storage tank , the bottom is designed to porous surface garbage collection more convenient, enforceability has been strengthened . This article is also append the structure and assembly drawings , parts diagram of the autonomous ship for cleaning the garbage floating on a lake for a detailed description of the design process. Keywords: The water waste;Automatic cleaning ship;environmental protection; Structural Design

深入理解java虚拟机

深入理解java虚拟机 (一)虚拟机内存划分 Java虚拟机在执行Java程序时,会把它管理的内存划分为若干个不同的数据区。这些区域有不同的特性,起不同的作用。它们有各自的创建时间,销毁时间。有的区域随着进程的启动而创建,随着进程结束而销毁,有的则始终贯穿虚拟机整个生命周期。 Java虚拟机运行时内存区域主要分为七部分,分别是:程序计数器,Java虚拟机栈,本地方法栈,方法区,Java堆,运行时常量池,直接内存。 如上图所示(图片来源于网络): 蓝色区域包裹的部分为运行时几个数据区域: 白色的部分为线程私有的,既随着线程的启动而创建。每个线程都拥有各自的一份内存区域。它们是:JAVA栈(JAVA STACK),本地方法栈(NATIVE METHOD STACK),和程序计数器(PROGRAM COUNTER REGISTER)。 黄色部分是线程共享的,所有的线程共享该区域的内容。他们是: 方法区(METHOD AREA),堆(HEAP)。 我们分别来介绍这些区域。 (1)程序计数器(program counter register)

学过计算机组成原理的都知道计算机处理器中的程序计数器。当处理器执行一条指令时,首先需要根据PC中存放的指令地址,将指令由内存取到指令寄存器中,此过程称为“取指令”。与此同时,PC中的地址或自动加1或由转移指针给出下一条指令的地址。此后经过分析指令,执行指令。完成第一条指令的执行,而后根据PC取出第二条指令的地址,如此循环,执行每一条指令。 处理器的程序计数器是指寄存器,而java程序计数器是指一小块内存空间。java代码编译字节码之后,虚拟机会一行一行的解释字节码,并翻印成本地代码。这个程序计数器盛放的就是当前线程所执行字节码的行号的指示器。在虚拟机概念模型中,字节码解释器工作室就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理等都依赖于它。 Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,因此为了线程切换后还能恢复执行位置,每条线程都需要一个独立的程序计数器。 如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果执行的是Java Native方法,这个计数器值为空。 而且程序计数器是Java虚拟机中没有规定任何OutOfMemoryError的区域。 (2)虚拟机栈 Java虚拟机栈(VM Stack)也是线程私有的,因此它的生命周期也和线程相同。它存放的是Java方法执行时的数据,既描述的是Java方法执行的内存模型:每个方法开始执行的时候,都会创建一个栈帧(Stack Frame)用于储存局部变量表、栈操作数、动态链接、方法出口等信息。每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈的过程。经常有人把Java内存分为堆内存和栈内存,这种是比较粗糙的分法,很大原因是大多数程序‘猿’最关注的,与对象内存分配最密切的区域就是堆和栈。局部变量表存放的是编译器可知的各种基本数据类型(boolean 、byte、int、long、char、short、float、double)、对象引用(reference类型)和returnAddress类型(它指向了一条字节码指令的地址)。其中64bit长度的long和double会占用两个局部变量空间(Slot),其余的数据类型只占用一个。局部变量表所需的内存空间是在编译时期确定的,在方法运行期间不会改变局部变量表的大小。在Java虚拟机规范中,对这部分区域规定了两种异常:1、当一个线程的栈深度大于虚拟机所允许的深度的时候,将会抛出StackOverflowError异常; 2、如果当创建一个新的线程时无法申请到足够的内存,则会抛出OutOfMemeryError异常。 (3)本地方法栈 本地方法栈(Native Method Stack)与虚拟机栈所发挥的作用是十分相似的,他们之间的区别不过是虚拟机栈为Java方法字节码服务,而本地方法栈则为Native方法服务。在虚拟机规范中对本地方法使用的语言和使用方法与数据结构没有强制规定,因此具体的虚拟机可

Elasticsearch Java虚拟机配置详解

JVM参数Elasticsearch默认值Environment变量 -Xms 256m ES_MIN_MEM -Xmx 1g ES_MAX_MEM -Xms and -Xmx ES_HEAP_SIZE -Xmn ES_HEAP_NEWSIZE -XX:MaxDirectMemorySize ES_DIRECT_SIZE -Xss 256k -XX:UseParNewGC + -XX:UseConcMarkSweepGC + -XX:CMSInitiatingOccupancyFraction 75 -XX:UseCMSInitiatingOccupancyOnly + -XX:UseCondCardMark (commented out) 首先你注意到的是,Elasticsearch预留了256M到1GB的堆内存。 这个设置适用于开发和演示环境。开发人员只需要简单的解压发行包,再执 行./bin/elasticsearch -f就完成了Elasticsearch的安装。当然这点对于开发来说非常棒,并且在很多场景下都能工作,但是当你需要更多内存来降低Elasticsearch负载的时候就不行了,你需要比2GB RAM更多的可用内存。

ES_MIN_MEM/ES_MAX_MEM是控制堆大小的配置。新的ES_HEAP_SIZE变量是一个更为便利的选择,因为将堆的初始大小和最大值设为相同。也推荐在分配堆内存时尽可能不要用内存的碎片。内存碎片对于性能优化来说非常不利。 ES_HEAP_NEWSIZE是可选参数,它控制堆的子集大小,也就是新生代的大小。 ES_DIRECT_SIZE控制本机直接内存大小,即JVM管理NIO框架中使用的数据区域大小。本机直接内存可以被映射到虚拟地址空间上,这样在64位的机器上更高效,因为可以规避文件系统缓冲。Elasticsearch对本机直接内存没有限制(可能导致OOM)。 由于历史原因Java虚拟机有多个垃圾收集器。可以通过以下的JVM参数组合启用: JVM parameter Garbage collector -XX:+UseSerialGC serial collector -XX:+UseParallelGC parallel collector -XX:+UseParallelOldGC Parallel compacting collector -XX:+UseConcMarkSweepGC Concurrent-Mark-Sweep (CMS) collector -XX:+UseG1GC Garbage-First collector (G1) UseParNewGC和UseConcMarkSweepGC组合启用垃圾收集器的并发多线程模式。UseConcMarkSweepGC自动选择UseParNewGC模式并禁用串行收集器(Serial collector)。在Java6中这是默认行为。 CMSInitiatingOccupancyFraction提炼了一种CMS(Concurrent-Mark-Sweep)垃圾收集设置;它将旧生代触发垃圾收集的阀值设为75.旧生代的大小是堆大小减去新生代大小。这告诉JVM当堆内容达到75%时启用垃圾收集。这是个估计的值,因为越小的堆可能需要越早启动GC。 UseCondCardMark将在垃圾收集器的card table使用时,在marking之前进行额外的判断,避免冗余的store操作。UseCondCardMark不影响Garbage-First收集器。强烈推荐在高并发场景下配置这个参数(规避card table marking技术在高并发场景下的降低吞吐量的负面作用)。在ElasticSearch中,这个参数是被注释掉的。 有些配置可以参考诸如Apache Cassandra项目,他们在JVM上有类似的需求。 总而言之,ElastciSearch配置上推荐: 1. 不采用自动的堆内存配置,将堆大小默认最大值设为1GB 2.调整触发垃圾收集的阀值,比如将gc设为75%堆大小的时候触发,这样不会影响性能。 3.禁用Java7默认的G1收集器,前提是你的ElasticSearch跑在Java7u4以上的版本上。JVM进程的内存结果 JVM内存由几部分组成: Java代码本身:包括内部代码、数据、接口,调试和监控代理或者字节码指令 非堆内存:用于加载类 栈内存:用于为每个线程存储本地变量和操作数

相关文档