CN106293878B - 一种在jvm中动态计算对象重用价值的方法 - Google Patents
一种在jvm中动态计算对象重用价值的方法 Download PDFInfo
- Publication number
- CN106293878B CN106293878B CN201610638600.XA CN201610638600A CN106293878B CN 106293878 B CN106293878 B CN 106293878B CN 201610638600 A CN201610638600 A CN 201610638600A CN 106293878 B CN106293878 B CN 106293878B
- Authority
- CN
- China
- Prior art keywords
- value
- jvm
- sstruct
- class
- pointer
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45504—Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
- G06F9/45516—Runtime code conversion or optimisation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
- G06F9/45533—Hypervisors; Virtual machine monitors
- G06F9/45558—Hypervisor-specific management and integration aspects
- G06F2009/45583—Memory management, e.g. access or allocation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明是一种在JVM中动态计算对象重用价值的方法,用于Java虚拟机中。本发明在程序开始运行时,JVM在内存中为程序新建一块存放统计数据的区域Sspace;修改JVM的类加载器,在加载一个类的时候,在方法区为该类的类信息新增指针P,为该类在Sspace中分配一个统计数据结构Sstruct,指针P指向该类对应的数据结构Sstruct;数据结构Sstruct用于统计类对象的重用价值、上次GC执行前后该类对象存活的个数、本次GC前该类对象的存活个数等。采用本发明方法,可分析出在程序运行过程中可重用的价值较高的对象,从而可反复利用这种对象的内存,减少因为垃圾回收所带来的性能损失,减少出现卡顿的几率。
Description
技术领域
本发明属于计算机应用技术领域,具体地说,是指一种在JVM(Java虚拟机)中动态计算对象重用价值的方法。
背景技术
Android应用程序常常会在使用中出现一些卡顿的情况。Android应用程序大部分都是使用Java语言编写的,在程序正确编写的情况下,这种卡顿很多都是由JVM引起的。在程序正常运行的时候,如果大量对象分配后快速死亡接着重新分配或者大量对象长期不使用占用内存,容易引起虚拟机对内存垃圾进行收集(Garbage Collection)。内存垃圾收集器对内存对象进行回收是一种机械式的管理并且是一种耗时的工作,就会对当前程序的运行造成影响,出现卡顿的情况。如果能重用一些死亡的对象,减少垃圾回收的时间,就有可能减少出现卡顿的几率。
发明内容
本发明针对上述问题,提出一种在程序运行中确定应用程序中对象重用价值的方法,下次有用户安装相同应用程序时,在程序编译时可以使用统计的结果对相应对象的分配进行优化,同时统计的结果也可以反馈给开发人员用以改进相应程序。
本发明提供的一种在Java虚拟机中动态计算对象重用价值的方法,实现方案是:
(1)在程序开始运行时,JVM在内存中为程序新建一块存放统计数据的区域Sspace;
(2)修改JVM的类加载器ClassLoader,在加载一个新类的时候,在方法区为该类的类信息新增一个指针P,为该类在Sspace中分配一个数据结构Sstruct,指针P指向该类对象运行时统计的数据结构Sstruct;
(3)为一个类分配的数据结构Sstruct中,包含四个参数和一个指针;四个参数为:该类对象的重用价值V,执行完上次GC之后该类对象存活的个数O,上次GC前该类对象的个数B,在下次GC前该类对象的个数A;指针R指向该类在方法区的类信息。在Sstruct初始化时,将V、B、O、A均置为0,将R指向类信息在方法区的地址;GC代表内存垃圾回收。
在执行本次GC时,对每个类对象,根据下式计算重用价值v:
然后,将v增加到对应的V上。
本发明的优点与积极效果在于:采用本发明方法,可分析出在程序运行过程中可重用的价值较高的对象,从而可反复利用这种对象的内存,减少因为垃圾回收所带来的性能损失,减少出现卡顿的几率。
附图说明
图1是本发明在JVM中动态计算对象重用价值方法中记录并处理数据的流程图;
图2是本发明实现在JVM中动态计算对象重用价值时修改和新增的数据结构示意图;
图3是本发明方法在新增对象时的处理方法示意图;
图4是一次GC发生时对象个数增减的示意图;
图5是垃圾回收的示意图。
具体实施方式
下面将结合附图和实施例对本发明作进一步的详细说明。
本发明的技术方案可以在内存管理芯片硬件内部实现,也可以遵照所述实现方案,完全或部分由软件实现。本发明通过对Java虚拟机的修改,在Java程序运行时,修改过后的Java虚拟机会记录下来该Java程序运行的信息。
本发明的在Java虚拟机中动态计算对象重用价值的方法,整体流程如图1所示。首先,在程序开始运行时,JVM在内存中将为程序新建一块存放统计数据的区域Sspace,如图2所示。当内存垃圾收集器开始工作后,它将按照图1所示流程,在内存中新建的Sspace中记录在每次GC(Garbage Collection,内存垃圾回收)前后,各个对象的个数。然后根据统计的数据,计算每次GC时每类对象的重用价值,累加得到最后的结果。
图1中给出的方法,在Java虚拟机加载新的类或者内存垃圾收集器中发生“新增对象”、“开始GC”、“标记到存活对象”、“结束GC”等事件时均可被反复触发。
图1中,“开始”表示本发明在虚拟机中开始工作。
第一步,判断JVM“是否加载新类”,如果“是”,则在Sspace中为其分配一个对应的Sstruct,并将对应的Sstruct初始化,如图2所示,完成后结束本方法对本次触发事件的处理;如果“否”,则继续下一步判断。
第二步,将判断内存垃圾收集器“是否新增对象”,如果“是”,则修改对应的Sstruct中的A值,如图3所示,完成后结束本方法对本次触发事件的处理;如果“否”,则继续下一步判断。
第三步,将判断内存垃圾收集器“是否GC”,如果“是”,则计算所有Sstruct上次GC后每个对象的重用价值v,将值累加至V上,然后清零O值,完成后结束本方法对本次触发事件的处理;如果“否”,则继续下一步判断。
对于某类对象,v的计算公式如下:
其中,atan为反正切函数。
第四步,将判断内存垃圾收集器“是否标记到存活对象”,如果“是”,则修改对应的Sstruct中的O值,如图5所示,完成后结束本方法对本次触发事件的处理;如果“否”,则继续下一步判断。
第五步,将判断内存垃圾收集器“是否结束GC”,如果“是”,则对所有的Sstruct进行清理,在每个Sstruct中,将A值赋给B,O值赋给A,完成后结束本方法对本次触发事件的处理;如果“否”,则继续下一步判断。
“结束”表示结束本方法对本次触发事件的处理。
图2展示的是本地修改的数据结构和新增的数据结构。在程序运行时,在内存中开辟一个空间Sspace用于存放程序需要统计的信息。在Sspace中,对每个Java类都利用一个数据结构Sstruct存储统计信息。
需要修改JVM的类加载器ClassLoader,在加载一个类的时候,在方法区为每个类的类信息新增一个指针P,为该类在Sspace中分配如图2所示的额外数据结构Sstruct,将P指向该类对象运行时统计的数据结构Sstruct。在Sstruct初始化时,将V、B、O、A均置为0,将R指向类信息在方法区的地址。
在一个类的Sstruct数据结构中,V存储的是该类对象的重用价值,O代表的是执行完上次GC之后该类对象存活的个数,B代表的上次GC前该类对象的个数,A代表的是在本次GC前该类对象的个数。指针R指向该类在方法区的类信息。
图3展示了新分配一个对象时需要处理的部分。当Java虚拟机执行到一个NEW指令时,通过该对象的类型,取到该类的统计数据的结构体Sstruct的地址,将结构体Sstruct中的数据A加一即可,说明在下次GC发生之前,该类对象的个数增加了一个。
图4展示的是本地程序统计分析可重用对象价值的基本分析方法。程序运行时经过GC后,被垃圾回收收集的对象,如果在下次GC之前相同类型的对象又需要申请分配内存,那么这种对象的内存就可以被反复的利用。减少因为垃圾回收所带来的性能损失。
例如,在一次执行GC前,类D的存活对象有n个,类D的存活对象简称为对象D,执行完GC后对象D还剩a个,到下次执行GC前对象D又变为x个。对于一个类而言,如果对象的个数越多,那么该类对象的可重用价值就越高。并且,如果n比a大并且小于等于x时,该对象D进行重用会取得较好的效果。因此计算一个对象在一次GC时的重用价值时,可以采取如下的公式:
因此,在每次开始GC时,可以计算上次GC发生时的各个类型对象重用价值并将该值加至对应的V值上面。
图4中的对象E是类E的存活对象,对象F是类F的存活对象,同理,可计算在本次GC时每类对象的重用价值,对象E和对象F的重用价值分别为:
将得到的value(E)、value(F)加至对应的V值上面。
图5展示的是垃圾回收时的示意图。在进行垃圾回收时,先清零Sspace中所有Sstruct中的O值,然后每次标记到存活对象时,就将该对象对应的数据结构Sstruct中的O值加一即可。
当本次垃圾回收结束之后,每类对象的O值表示了现在存活的对象的个数。须将Sstruct中A值赋给B,表示上次GC之后的个数是本次GC之前的个数。再将O值赋给A,代表本次GC之后的对象个数为O,等待有NEW指令时再增加A值。
在程序运行结束后,将Sspace中的数据导出,并根据每个数据的指针R能够导出该数据对应的对象的详细信息。这时,调用排序算法,即可分析出在程序运行过程中可重用的价值较高的对象。
Claims (5)
1.一种在JVM中动态计算对象重用价值的方法,其特征在于,通过下面过程实现:
(1)在程序开始运行时,JVM在内存中为程序新建一块存放统计数据的区域Sspace;
(2)修改JVM的类加载器ClassLoader,在加载一个新类的时候,在方法区为该类的类信息新增一个指针P,为该类在Sspace中分配一个数据结构Sstruct,指针P指向统计运行时该类对象数据的数据结构Sstruct;
(3)为一个类分配的数据结构Sstruct中,包含四个参数和一个指针;四个参数为:该类对象的重用价值V,执行完上次GC之后该类对象存活的个数O,上次GC前该类对象的个数B,在本次GC前该类对象的个数A;指针R指向该类在方法区的类信息;在Sstruct初始化时,将V、B、O、A均置为0,将R指向类信息在方法区的地址;GC代表内存垃圾回收;
在内存垃圾收集器中开始GC事件时,对每个类对象,根据下式计算重用价值v,
然后,将v增加到对应的V上,并清零O值。
2.根据权利要求1所述的一种在JVM中动态计算对象重用价值的方法,其特征在于,所述的JVM中,在内存垃圾收集器中发生新增对象事件时,修改对应的Sstruct中的A值,使A加1。
3.根据权利要求1所述的一种在JVM中动态计算对象重用价值的方法,其特征在于,所述的JVM中,在内存垃圾收集器中发生标记到存活对象事件时,修改对应的Sstruct中的O值,使O加1。
4.根据权利要求1所述的一种在JVM中动态计算对象重用价值的方法,其特征在于,所述的JVM中,在内存垃圾收集器中结束GC事件时,对所有的Sstruct进行清理,在每个Sstruct中,将A值赋给B,O值赋给A。
5.根据权利要求1所述的一种在JVM中动态计算对象重用价值的方法,其特征在于,所述的在JVM中动态计算对象重用价值的方法,在程序运行结束后,将Sspace中的数据导出,并根据每个数据结构Sstruct的指针R导出该类对象的统计信息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610638600.XA CN106293878B (zh) | 2016-08-05 | 2016-08-05 | 一种在jvm中动态计算对象重用价值的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610638600.XA CN106293878B (zh) | 2016-08-05 | 2016-08-05 | 一种在jvm中动态计算对象重用价值的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106293878A CN106293878A (zh) | 2017-01-04 |
CN106293878B true CN106293878B (zh) | 2019-08-27 |
Family
ID=57665680
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610638600.XA Active CN106293878B (zh) | 2016-08-05 | 2016-08-05 | 一种在jvm中动态计算对象重用价值的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106293878B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110020314B (zh) * | 2017-12-21 | 2023-09-29 | 阿里巴巴(中国)有限公司 | Web页面数据处理方法、装置、计算设备和存储介质 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101169759A (zh) * | 2007-11-08 | 2008-04-30 | Ut斯达康通讯有限公司 | 应用程序级的内存管理方法 |
CN101221535A (zh) * | 2008-01-25 | 2008-07-16 | 中兴通讯股份有限公司 | Java虚拟机的垃圾回收移动通信终端及回收方法 |
CN102023891A (zh) * | 2010-12-20 | 2011-04-20 | 复旦大学 | 基于Java虚拟机的并发垃圾收集器框架 |
CN102722447A (zh) * | 2012-06-06 | 2012-10-10 | 北京航空航天大学 | 一种内存垃圾收集器中对象状态的增量式跟踪记录方法 |
CN102880490A (zh) * | 2012-09-19 | 2013-01-16 | 南京大学 | 一种基于Java虚拟机的延时动态对象更新方法 |
CN104731634A (zh) * | 2013-12-24 | 2015-06-24 | 珠海世纪鼎利通信科技股份有限公司 | 一种实时在线的分布式计算框架的实现方法 |
CN105260174A (zh) * | 2015-09-16 | 2016-01-20 | 北京航空航天大学 | 实时Java虚拟机中基于等价类的对象内存状态的记录跟踪方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7203756B2 (en) * | 2001-04-27 | 2007-04-10 | International Business Machines Corporation | Mechanism to cache references to Java RMI remote objects implementing the unreferenced interface |
-
2016
- 2016-08-05 CN CN201610638600.XA patent/CN106293878B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101169759A (zh) * | 2007-11-08 | 2008-04-30 | Ut斯达康通讯有限公司 | 应用程序级的内存管理方法 |
CN101221535A (zh) * | 2008-01-25 | 2008-07-16 | 中兴通讯股份有限公司 | Java虚拟机的垃圾回收移动通信终端及回收方法 |
CN102023891A (zh) * | 2010-12-20 | 2011-04-20 | 复旦大学 | 基于Java虚拟机的并发垃圾收集器框架 |
CN102722447A (zh) * | 2012-06-06 | 2012-10-10 | 北京航空航天大学 | 一种内存垃圾收集器中对象状态的增量式跟踪记录方法 |
CN102880490A (zh) * | 2012-09-19 | 2013-01-16 | 南京大学 | 一种基于Java虚拟机的延时动态对象更新方法 |
CN104731634A (zh) * | 2013-12-24 | 2015-06-24 | 珠海世纪鼎利通信科技股份有限公司 | 一种实时在线的分布式计算框架的实现方法 |
CN105260174A (zh) * | 2015-09-16 | 2016-01-20 | 北京航空航天大学 | 实时Java虚拟机中基于等价类的对象内存状态的记录跟踪方法 |
Non-Patent Citations (2)
Title |
---|
JVM虚拟机的垃圾收集机制;刘世俊 等;《科技信息》;20081103(第21期);第404-405页 * |
一种改进的增量式JVM垃圾收集算法;张嗜军 等;《计算机工程》;20120427;第38卷(第1期);第71-73页 * |
Also Published As
Publication number | Publication date |
---|---|
CN106293878A (zh) | 2017-01-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Flood et al. | Shenandoah: An open-source concurrent compacting garbage collector for openjdk | |
KR101600129B1 (ko) | 애플리케이션 효율 엔진 | |
US7069279B1 (en) | Timely finalization of system resources | |
US20100049938A1 (en) | Memory management method, and memory management apparatus | |
JP2010079508A (ja) | プロファイリング方法およびプロファイリングプログラム | |
US20130290382A1 (en) | Computer, control method of computer, and recording medium | |
CN110325969A (zh) | 多阶段垃圾收集器 | |
Lucchese et al. | Parallel mining of frequent closed patterns: Harnessing modern computer architectures | |
CN106293878B (zh) | 一种在jvm中动态计算对象重用价值的方法 | |
US20030196061A1 (en) | System and method for secure execution of multiple applications using a single GC heap | |
Peiris et al. | Automatically detecting" excessive dynamic memory allocations" software performance anti-pattern | |
Beronić et al. | Assessing Contemporary Automated Memory Management in Java–Garbage First, Shenandoah, and Z Garbage Collectors Comparison | |
US8990532B2 (en) | Method of managing memory in computer system, computer system and memory managing program | |
CN102270134B (zh) | 一种Java卡中垃圾回收的方法及装置 | |
CN103699435A (zh) | 负载均衡方法及装置 | |
CN108628678B (zh) | 内存参数的确定方法、装置及设备 | |
US9460002B1 (en) | Memory allocation | |
Xian et al. | Garbage collection: Java application servers’ Achilles heel | |
Zhu et al. | MCS: memory constraint strategy for unified memory manager in spark | |
CN100530139C (zh) | 增量压缩堆时用于更新引用的系统和方法 | |
Mohamedin et al. | ByteSTM: Virtual machine-level Java software transactional memory | |
Xian et al. | AS-GC: An efficient generational garbage collector for Java application servers | |
Papaspyrou et al. | On preserving term sharing in the Erlang virtual machine | |
US8239865B2 (en) | Waiting and synchronization of parallel task executions based on task groups and task object representations | |
Belov et al. | Parallel MUS extraction |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |