Java 如何在开发期间将对象保留在内存中
我的程序具有以下结构:Java 如何在开发期间将对象保留在内存中,java,jvm,Java,Jvm,我的程序具有以下结构: void main (String[] args) { Object largeObject = longInitialization(); interestingLogic(largeObject); } 纵向初始化代码在开发过程中从不更改。但每当我改变兴趣逻辑时,我都必须再次运行程序,等待纵向初始化完成 不幸的是,我无法序列化largeObject,因为它不可序列化,而且我没有用于它的代码 有什么技巧可以节省初始化时间吗?也许,以某种方式在初始化之后保存
void main (String[] args) {
Object largeObject = longInitialization();
interestingLogic(largeObject);
}
纵向初始化代码在开发过程中从不更改。但每当我改变兴趣逻辑时,我都必须再次运行程序,等待纵向初始化完成
不幸的是,我无法序列化largeObject,因为它不可序列化,而且我没有用于它的代码
有什么技巧可以节省初始化时间吗?也许,以某种方式在初始化之后保存JVM的状态,然后始终从该状态开始?您可以对代码进行一些修改:
main(){
Object largeObject = longInitialization();
boolean debug = true;
while(debug){
interestingLogic(largeObject);
}
}
现在在调试模式下运行程序。在调用时将断点设置为interestingLogic
并在IDE中使用代码热交换调试模式。阅读有关Eclipe中热交换的更多信息:
//编辑:
还有一个选择。只需编写大型对象的mock,如果不需要立即使用大型对象,可以使用“lazy initialization”包装器对其进行修饰,并在访问之前调用“longInitialization”
第二种解决方案是通过将其编组/解编为xml文件来“克隆”它您需要一个新对象来调用interestingLogic(largeObject)。您可以在驱动程序等待用户输入时更改新对象
void main (String[] args) {
Object largeObject = longInitialization();
boolean anotherTry = true;
String answer = "";
Scanner input = new Scanner(System.in);
while (anotherTry) {
Object newobject = NewObject();
newobject.interestingLogic(largeObject).
System.out.print("Run Again Y/N");
answer = input.nextLine();
if (answer.equalsIgnoreCase("N")) {
anotherTry = false;
}
}
}
因为您说过“…无法序列化largeObject…”,所以无法跨JVM生命周期持久化对象(因为您没有源代码)。但是,您有初始化/使用LargeObject的代码。创建一个可序列化的debugLargeObject,其行为类似于真实的largeObject,并在开发过程中使用debugLargeObject 不是没有很多工作。您需要一个小的重构,如Guido所示,然后每次通过循环(或其他)都需要重新加载NewObject类。换句话说,您的VM需要能够在每次更改代码时删除NewObject类,然后重新加载它
有一些商业产品可以做到这一点(例如,参见JRebel)。您可以自己滚动(请参阅此StackOverflow主题:)。如果你对你感兴趣的逻辑非常谨慎,你可以进行热交换。但最终,您需要以某种方式替换掉该类。您可以在调试时热部署代码。对于Oracle JVM,这可能足够有用了。好吧,您可以将largeObject放入ArrayList并序列化数组列表。@sk2212这不会帮助您回答5个问题,也不会有您的回复或评论。这完全是浪费时间吗?@Guido答案看起来不错,但我还没有时间在实践中尝试。请耐心等待…谢谢,这也是一个不错的选择,虽然时间稍长。