先说下程序上线中碰到的一个问题:
我们开发的程序之前是一个服务启动一个JVM
现在是把不同的服务部署到了一个JVM里,不同的服务是会用到一个单例模式产生的读取redis数据库的类,
那么问题来了,这个单例模式的类会不会回收,什么时候回收?
答案我个人的理解是不会回收。
先说下JVM底层的回收机制:
静态变量是放在方法区的,放在方法去的还有类的属性方法信息。
类的数据信息是放在堆中的
类的引用,方法是放在栈中的
静态变量是在JVM加载类的时候就初始化的,它不会被回收
类的回收条件:是在没有类的引用的时候,程序会在合适的时候回收内存
所以上线碰到的问题就是:
我修改升级了读取redis的单例模式类,重启的其中一个服务(JVM)没有重启,发现新填的功能不能生效。当时很费解,下载下来jar包,检查下反编译的类,
确认下是改之后的包,不知原因,找了下同事帮我看了代码,指出了我的问题。
解决办法:
使用ThreadLocal变量,可以多线程同步变量。