JFinal

登录 注册
JFinal 已连续多年蝉联最受欢迎中国开源软件冠军,投出您宝贵的一票今年继续夺冠! 评选传送门

请教一个 关于 ConcurrentHashMap 的问题

在jfinal中有一个propkit这样一个类,有段这样的代码,假设在一台512MB的服务器上面,然后prop的配置文件中有一些特别的数据,导致这样一个文件有2~3MB,然后有个Java程序,会把1000多个这样的配置文件通过propkit来加载。

问:Java程序是否会内存溢出?应该会内存溢出吧!?

例子有点夸张,但是应该还是有可能的吧?!那么,感觉有没有可能在稳妥一点?

    public class PropKit {
	
	private static Prop prop = null;
	private static final ConcurrentHashMapmap = new ConcurrentHashMap();
	
	private PropKit() {}
    ... ...


评论

  • 01-10 16:30
    PropKit 最初是为正常配置文件设计的,所以你说的场景很少,如果出现这样的场景,jfinal 也早就有准备,用一下 PropKit.useless(...) 将其从内存中移除就好

    jfinal 远比一般人所需要的要想得周全
  • 01-10 16:43
    @JFinal public static Prop useless(String fileName); 这个方法是在第二次用的时候在有效,其实 应该得有一种业务场景,就是配置文件只用一次,用完就不会在用了的。而且配置文件的量很大,如果都保存和很浪费资源,或者说有没有可能用 软引用 的方式,这样在资源不足的时候会自动释放掉
  • 01-10 16:45
    @xRhbN 假定用户 PropKit.use(a).get(...),然后 jfinal 擅做主张,认为用户只用这一次,自动将其 PropKit.useless(a) 掉,那么用户再次用的时候,发现出异常了

    应用场景是无法穷尽的,jfinal 能做的只能是尽可能照顾最可能出现的场景,然后对少数场景提供用户可选的支持,而对于极其极其极其少的场景,交给用户自己去扩展
  • 01-10 16:46
    注意这里的一个关键点,你无法知道用户什么时候用,什么时候不用,而 Prop 模块的基本出发点是针对应用的配置文件,从这个出发点上看问题,配置文件的内容几乎都是很少的,一般不会超 3KB
  • 01-10 16:49
    @JFinal 不不不,,我的意思就是提供一个方法,,useFirst(),,可以让程序员根据业务来调,,你觉得呢?。。。。然后软引用的话,,,就是得做好判断,防止空指针,,,这样的话,就能防止 过分 的存储导致资源耗尽,,毕竟我个人还是租了一些256MB的VPS的
  • 01-10 16:53
    @JFinal 是的是的,正常情况下确实是这样的,但是总有些 不正常 情况吧,,比如吧图片 base64 后放在配置文件里面,,毕竟配置文件里面可以放的东东太多了
  • 01-10 17:03
    没明白 useFirst 是做什么的,PropKit.use(...) 可以指定不同的配置文件去使用。此外,这个功能的设计基于以下假设:
    1:配置文件很小,例如数据库连接ip地址,用户密码名码,通常1KB不到
    2:支持多配置文件,可以让不同配置放在不同的文件中便于管理,文件同样也很小
    3:多数情况下不需要处理内存回收,因为占用实在太小
    4:如果用户是处女座的完美义义者,可以用 useless(...)回收下内存

    当然,你说的使用弱引用也是一个改进方向,只不过这个功能目前为止对需求满足得不错
  • 01-10 17:05
    @JFinal 是的是的,确实蛮好用的,useFirst 就是读取配置文件,但是不加入到map中,就是一次性的。。。
  • 01-10 17:05
    我觉得你的需求较个性化,所以,可以利用底层已有的 Prop 类,自己参考PropKit再扩展出一个满足需求的 MyPropKit 来用
  • 01-10 17:07
    @xRhbN 这个需求本质是可以满足的,弃用 PropKit 直接用 Prop 即可,代码如下:
    Prop p = new Prop(...);
    p.get(...);
    p.getInt(...);
  • 发送