java垃圾回收之Map

本文解决了Hibernate映射文件从DTD转换为Java类时出现的属性重复错误,并介绍了如何通过修改DTD文件为XSD文件来解决此问题。此外,还分享了一种使用WeakHashMap实现缓存映射的方法,以有效管理内存资源。
部署运行你感兴趣的模型镜像

     <xs:complexType name="actions_type">

生成类名为ActionsType.java

若改成  <xs:complexType name="actions_type">则生成类名为Actionstype.java

所以——符号是用来作用类名中大小写的。

在hibernate-mapping.dtd转换成java类 全过程及解决办法:

1、cmd后xjc -dtd hibernate-mapping.dtd 

出现的现象为:

parsing a schema...
[ERROR] Property 
"Subselect" is already defined.
  line 
275 of file:/D:/hibernate-mapping-3.0.dtd

[ERROR] The following location is relevant to the above error
  line 
268 of file:/D:/hibernate-mapping-3.0.dtd

[ERROR] Property 
"Column" is already defined.
  line 
795 of file:/D:/hibernate-mapping-3.0.dtd

[ERROR] The following location is relevant to the above error
  line 
794 of file:/D:/hibernate-mapping-3.0.dtd


 

......................................................................

经查明:元素和属性 有共同的名称(如Column)故在产生的java类(get,set方法) 会产生冲突。

解决思路,

1、更改元素或属性的名称,使其不一致。但在java类转化xml文件时 不能体现原来的dtd文件原意了。舍弃。

2、通过在java类中生成标注区别。但dtd文件没有提供这样的解决办法,舍弃。

3、将dtd通过spyxml转换成xsd文件

     
3.1、cmd,D:>xjc hibernate-mapping.xsd -p com.hibernatemapping.test 

    
3.2、出现类似dtd文件转换过程的一样的问题,属性已经存在的问题。

    
3.2.1 对转化后的xsd文件内容修改:

将xs:schema xmlns:xs
="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" >

修改为

xs:schema xmlns:xs
="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" targetNamespace="http://www.w3.org/1998/Math/MathML" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0">

 

同时对冲突的所有属性做修改,如

<xs:element ref="column" minOccurs="0"/>   
 改为:
 
<xs:element ref="column" minOccurs="0">
    
<xs:annotation><xs:appinfo>
      
<jaxb:property name="column-element" />    <!--自定义-->
    
</xs:appinfo></xs:annotation>
</xs:element> 
当然也可以对属性做出修改的
<xs:attribute name="class" type="xs:NMTOKENS">
    
<xs:annotation><xs:appinfo>
      
<jaxb:property name="clazz" />
    
</xs:appinfo></xs:annotation>
  
</xs:attribute>

在重新cmd 后即可成功。
一直以来,都很喜欢用Map,在小规模应用中,用用Map也没什么,但是应用一大,内存应用方面就要注意了。
  几个月前,做项目的时候用到Map,在一篇文章中,我记得说过Map的回收有问题,一试,果然,当设置为null时,还是不能有效进行回收,找了些资料,最后发现了WeakHashMap,当没有指针指向value时,key会被回收,就用它做了个CacheMap,需要多加一个方法
package org.ofbiz.payment.common;

import java.util.Iterator;
import java.util.WeakHashMap;

/**
 * 
@author zxub 2006-3-22 10:03:22
 
*/
public class CacheMap extends WeakHashMap
{
    
public Object getKeyByValue(Object value)
    {
        Object returnValue 
= null;
        Object key 
= null;
        
for (Iterator iter = this.keySet().iterator(); iter.hasNext();)
        {
            key 
= iter.next();
            
if (this.get(key).equals(value))
            {
                returnValue 
= key;
                
break;
            }
        }
        
return returnValue;
    }
}
  这里的应用刚好与Map相反了,经测试,能有效释放内存。 
 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值