关于内存管理的三种模式(static、stack、heap),不正确的是__
A Static在编译阶段为各变量分配内存,不支持运行时变量扩展内存,但支持运行时为新变量分配内存
B Stack因为结构简单,不支持存储结构复杂的变量(例如数组、对象等)
C 在heap中分配内存的变量,其内存大小在运行时可动态扩展或收缩
D Static和stack两种模式都不支持对变量所占内存的动态回收
E Java中heap用于复杂结构的数组或对象等变量的内存分配,而简单数据类型的变量在stack中分配内存
正确答案:ADE
类A有一个静态成员变量int a和一个非静态成员变量Date b,它的某个方法内使用了一个局部变量Calendar c。JVM在为a、b、c三个变量分配内存时,分别在____中分配
A Stack / Stack / Heap
B Stack / Method Area / Stack
C Heap / Stack / Stack
D Method Area / Heap / Heap
正确答案:D
关于GC的说法,不正确的是_
A GC根据对象的“活性”(从root的可达性)来决定是否回收该对象的内存
B 如果某个对象内部不再有指向其他对象的reference,则该对象一定是dead,会被GC
C 在Java中,GC完全依赖于JVM,程序员无法通过代码来主动改变某个对象的“活性”
D Defensive copy策略大大增加了GC的负担,相当于用性能换取安全性
E 程序员在代码中人工实现GC,若不恰当,可能导致内存泄露
正确答案:BC
Java中针对heap的各种GC策略,以下说法不正确的是_
A Mark-sweep检查内存中各对象是live还是dead,对dead对象做出标记,进而将其清理
B 每次进行Mark-compact策略的GC之后,heap中可被再分配的区域是连续的
C Copy是四种策略中唯一不需要检查对象live/dead的GC策略
D Reference counting相对于其他三种GC策略,内存中dead对象的zombie time最短
正确答案:C
针对JVM内存管理和GC的说法,不正确的是__
A 相对于old generation space中对象的存活时间,young generation space中对象的存活时间更短
B 对存活时间非常长的对象,经历多次GC后,在heap中位置的迁移路线是eden→(S0或S1)→(S1或S0)→…→old generation space
C Old generation space的GC是full GC,当young generation space满了的时候触发执行
D 若针对young generation space的minor GC的发生频度很高,则需扩大该区域的内存大小
正确答案:C
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=192m
-XX:NewSize=128m
-XX:MaxNewSize=256m
-XX:SurvivorRatio=8
-XX:MaxHeapFreeRatio=90
按上述参数配置,Old Generation和(S0+S1)的最大值分别是__
A 1024m, 25.6m
B 768m, 51.2m
C 896m, 51.2m
D 576m, 25.6m
正确答案:C
-Xms512m
-Xmx1024m
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=192m
-XX:NewSize=128m
-XX:MaxNewSize=256m
-XX:SurvivorRatio=8
-XX:MaxHeapFreeRatio=10
按上述参数配置,若当前young和old generation的尺寸分别为128m和384m,在以下_的时刻,JVM会自动增加young generation的尺寸?
A S0+S1的总占用超过96m
B Eden的总占用超过56m
C Old generation的占用超过350m
D S0+S1+Eden是总占用超过120m
正确答案:D
-XX:+DisableExplicitGC
-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC
-XX:ParallelCMSThreads=12
-verbose:gc
-XX:+HeapDumpOnOutOfMemoryError
-XX:+PrintGCTimeStamps
-Xloggc:../../logs/gc-console.log
按以上参数配置,以下不正确的是_
A 程序运行时可将GC过程计入日志文件,并记录历次GC时间戳
B 使用串行的GC策略进行GC,GC时会短暂停止程序执行
C 开发者可手工在程序代码中使用System.gc()以提升GC性能
D 使用12个GC线程,降低了GC对程序执行性能的影响
正确答案:BC
以下关于Dynamic Program Analysis的说法,不正确的是___
A 根据程序执行的过程与结果,分析代码在时空性能方面所展现出的性质
B 对程序执行的性能没有影响
C 可用来发现程序中的“热点”语句,即哪些语句被频繁执行
D 只需执行一次,即可比测试更容易发现程序中的性能弱点和bug
E 能够发现程序中各种不同类型的object分别占用了多少内存空间
正确答案:BD
关于profiling的三种策略,说法不正确的是__
A 采用代码注入的策略,对程序性能的度量最为准确
B 采用Instrumented VM的策略,需针对不同的VM分别使用不同的profiling工具
C 采用Sampling的策略,对程序执行性能的影响最大
D 采用Instrumented VM和Sampling的策略,均不需对程序代码进行修改
E 采用代码注入的策略,不可能对目标代码进行动态注入
正确答案:ACE
关于Java提供的若干profiling工具,说法不正确的是___
A 有工具可以获取Java程序运行时JVM管理的各heap区域的动态占用情况
B 有工具可以得知指定的Java程序所采用的GC策略
C 有工具可以对正在运行的Java程序的JVM内存配置进行参数的动态设置
D 即使不使用这些工具,当Java程序抛出OutOfMemoryError
时,JVM也能够自动导出内存溢出时刻的heap dump
E 有工具可以获取当前时刻Java程序主线程的call stack的状态
正确答案:CD
从该结果看,在第一次GC前后,suivivor space的占用比例增加了__,old generation的占用比例增加了_
A 91.03%, 1.98%
B -5.99%, 1.39%
C -94.55%, -97.02%
D 91.03%, 0.37%
正确答案:B
不能够导出某个Java进程的heap dump文件的是__
A jmap
B jcmd
C jconsole
D jstack
E jhat
F Eclipse Memory Analyzer
正确答案:DEF
使用profiling工具来监视你的Lab3程序时,发现heap中出现了大量的PhysicalObject对象实例,占用了大量内存。可能的原因是___
A 你的Lab3将PhysicalObject
设计为mutable
,并对其采取了防御式拷贝策略以避免表示泄露
B 本次运行读入了一个大文件,故构造CircularOrbit
对象时不得不构造大量PhysicalObject
对象
C 导出heap的时刻之前较长时间没有进行GC,故大量无活性的PhisicalObject
仍处于内存中
D 你的Lab3对PhysicalObject
的生成(new)采用了“静态工厂”模式,导致JVM无法获取各PhysicalObject
对象的活性而无法及时GC
正确答案:ABC
对代码进行dynamic profiling,不需要在__时候进行
A ADT的初始版本完成后(包括完成了Rep、方法、AF、RI、Spec、各方法的代码)
B ADT测试完成后(根据spec设计测试用例,用JUnit执行测试用例并获得结果后)
C 每次向Git进行一次commit之前
D ADT迭代开发结束,除性能之外的其他外部和内部质量指标的优化均已经达到期望
E 交付用户之前,发现程序运行缓慢,与期望不符
正确答案:ABC
以下关于代码调优的说法,不正确/不恰当的是__
A 代码行数越少,代码的执行性能倾向于更好
B 每写完一个method的代码,最好对其性能进行优化,确保时空复杂性优化
C 直到软件开发完全结束、所有其他质量指标均已满足期望,再进行代码调优
D 每次进行代码调优前,必须要使用profiling工具进行性能监控和度量
E 每次代码调优之后、修改代码提交Git仓库之前,都需要进行regression testing
正确答案:AB
关于Singleton设计模式,说法不正确/不恰当的是__
A 符合该模式的ADT,不应具有constructor,以避免client创建多个实例
B 符合该模式的ADT,其rep中应具有一个static
的field,其类型是该ADT本身
C 符合该模式的ADT,应具备一个方法getInstance()
,在该方法内进行该ADT的new操作
D State设计模式中,每个State的具体子类,可遵守Singleton模式进行实现
正确答案:AC
答案解析:
A选项:每个类都有constructor,只不过该模式下的constructor是private的,不能让client调用
C选项:除非用lazy load的策略,否则getInstance方法中只需直接返回rep中的单例对象
使用Flyweight模式实现文本编辑器中对各个“字母”对象的复用,以下说法不正确的是__
A “字母"的内容(例如a、b)是内特性,“字母"在编辑器中展示的字体、字号、颜色是"外特性”
B 即使"字母” 对象的字体/字号/颜色可变化,但"字母" ADT仍应该是immutable的
C "字母"ADT的rep种需包含其内容、颜色、字体、字号等属性
D 只需要26个大写字母和26个小写字母的对象实例,即足够client在编辑器中使用"字母"的功能
E 客户端代码中需要维护某些数据来管理或计算每个"字母"对象在文档中不同位置的字体、字号、颜色等。
正确答案:C
关于Prototype模式,说法不正确的是__
A 遵循该模式的ADT,要实现Cloneable
接口并override Object
的clone()
方法
B Object
的clone()
方法,缺省实现的是shallow copy而非deep copy
C 若在调用ADT的clone()
时抛出CloneNotSupportedException
,则意味着该ADT没有override
Object
的clone()
D 在进行对象构造时,相比于直接使用构造器来说,使用clone()
的代价较小、构造时间更短
正确答案:CD
关于Object Pool的说法,不正确的是_
A 不采用该模式时,如果一个对象实例不再有活性,将对象实例加入pool,相当于强行保持其活性而不会被GC
B 当client需要一个对象实例时,先到pool中去获取,使用完之后,再归还回去
C 原本可被GC的对象,现在要留在pool中,导致内存浪费,但节省了频繁的new和GC的时间
D 不能把不同类型的对象实例放在同一个pool中进行管理,需要分别设定不同的pool
正确答案:D
关于Singleton、Flyweight、Object Pool设计模式之间的异同,说法不正确的是__
A Singleton相当于把每个class做成了pool,其中包含唯一的对象实例,且是static的
B Flyweight相当于只使用一个对象实例来表示一组具有相同内属性但不同外属性的对象
C Flyweight模式维持一个pool,pool中包含一组具有不同内属性的对象实例
D 这三种模式的client使用某个对象实例时,均需要从pool中申请获得实例、用完归还给pool
E 目的都是为了降低new对象实例时的时间代价,降低了程序运行时内存消耗
正确答案:DE
以下__能够减少创建object的数量,降低GC的代价
A 方法中的临时变量尽可能使用primitive数据类型(e.g., double),减少使用其对象数据类型(e.g., Double)
B 除非迫不得已(ADT安全性要求),不要使用防御式拷贝
C 对频繁使用的对象用object pool进行canonicalization,哪怕是类似于Integer这样的“小”对象
D 尽量使用String a = "foo"
的方式来定义常量字符串,避免new String("foo")
E 尽可能使用类的静态工厂方法进行对象创建,避免直接用new
F 在为ADT设计rep的时候,除非迫不得已,最好用简单数据类型
正确答案:ABCDEF