我已经阅读了这篇关于虚拟机垃圾收集调优的文章,以便更好地理解java垃圾收集器.每个空间都有一个虚拟堆空间区域,随着所需的堆空间越来越接近最大堆大小,它可以增长.这可以在这张图片中看到: 几代人的Java GC安排http://www.oracle.com/ocom/groups/public/@otn/documents/digitalasset/190244.gif
您可以使用NewRatio参数设置Young Generation和Old(Tenured)Generation之间的比率,使用SurvivorRatio参数设置Eden Space和Survivor Space之间的比率.
最近这个问题被问到要找出堆空间的默认比率.它说你应该使用PrintGCDetails参数并手动计算比率.
我的问题是:不同堆空间的大小是否以相同的比率增加,从而在应用程序的整个运行时期间保持它们在启动时设置的比率是否恒定?例如,如果Young Generation和Old/Tenured Generation的默认NewRatio为3,则Young的初始保留堆空间为100MB,Old为300MB.如果需要为旧空间预留更多内存,可以说300MB以上,总计600MB.为Young Space保留的内存是否也会增加到200MB,保持比例不变?
我经常发现自己想知道这些问题的最佳实践是什么.一个例子:
我有一个java程序,应该从天气网络服务获得气温.我将其封装在一个类中,该类创建一个HttpClient并向天气服务执行Get REST请求.为类编写单元测试需要对HttpClient进行存根,以便可以接收伪数据.有几个选项如何实现这个:
构造函数中的依赖注入.这破坏了封装.如果我们切换到SOAP Web服务,则必须注入SoapConnection而不是HttpClient.
仅为测试目的创建setter.默认情况下构造"普通"HttpClient,但也可以通过使用setter来更改HttpClient.
反射.将HttpClient作为由构造函数设置的私有字段(但不是通过参数获取),然后让测试使用反射将其更改为存根字段.
打包私密.降低字段限制以使其在测试中可访问.
在试图阅读有关该主题的最佳实践时,在我看来,普遍的共识是依赖注入是首选方式,但我认为打破封装的缺点是没有给予足够的思考.
您认为什么是使类可测试的首选方法?