0

我有一个班级旅行

package com.firstgroup.bbrailapps.pushport.timetable;

import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;


/**
 * <p>Java class for anonymous complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType>
 *   &lt;complexContent>
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       &lt;sequence>
 *         &lt;choice maxOccurs="unbounded" minOccurs="2">
 *           &lt;element ref="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}OR"/>
 *           &lt;element ref="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}IP"/>
 *           &lt;element ref="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}DT"/>
 *           &lt;element ref="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}PP"/>
 *         &lt;/choice>
 *         &lt;element ref="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}AS" maxOccurs="unbounded" minOccurs="0"/>
 *       &lt;/sequence>
 *       &lt;attribute name="rid" use="required" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}RIDType" />
 *       &lt;attribute name="uid" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}UIDType" />
 *       &lt;attribute name="ssd" use="required" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}RTTIDateType" />
 *       &lt;attribute name="trainId" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}TrainIdType" />
 *       &lt;attribute name="toc" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}TOCType" />
 *       &lt;attribute name="qtrain" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
 *       &lt;attribute name="status" use="required" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}CIFTrainStatusType" />
 *       &lt;attribute name="trainCat" use="required" type="{http://www.thalesgroup.com/rtti/XmlTimetable/v7/rttiCTTSchema.xsd}CIFTrainCategoryType" />
 *       &lt;attribute name="deleted" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
 *       &lt;attribute name="can" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
 *     &lt;/restriction>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "orOrIPOrDT",
    "as"
})
@XmlRootElement(name = "Journey")
public class Journey {

    @XmlElements({
        @XmlElement(name = "OR", type = OR.class),
        @XmlElement(name = "PP", type = PP.class),
        @XmlElement(name = "IP", type = IP.class),
        @XmlElement(name = "DT", type = DT.class)
    })
    protected List<Object> orOrIPOrDT;
    @XmlElement(name = "AS")
    protected List<AS> as;
    @XmlAttribute(required = true)
    protected String rid;
    @XmlAttribute
    protected String uid;
    @XmlAttribute(required = true)
    protected String ssd;
    @XmlAttribute
    protected String trainId;
    @XmlAttribute
    protected String toc;
    @XmlAttribute
    protected Boolean qtrain;
    @XmlAttribute(required = true)
    protected String status;
    @XmlAttribute(required = true)
    protected String trainCat;
    @XmlAttribute
    protected Boolean deleted;
    @XmlAttribute
    protected Boolean can;

    /**
     * Gets the value of the orOrIPOrDT property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the orOrIPOrDT property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getOROrIPOrDT().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link OR }
     * {@link PP }
     * {@link IP }
     * {@link DT }
     * 
     * 
     */
    public List<Object> getOROrIPOrDT() {
        if (orOrIPOrDT == null) {
            orOrIPOrDT = new ArrayList<Object>();
        }
        return this.orOrIPOrDT;
    }

    /**
     * Gets the value of the as property.
     * 
     * <p>
     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a <CODE>set</CODE> method for the as property.
     * 
     * <p>
     * For example, to add a new item, do as follows:
     * <pre>
     *    getAS().add(newItem);
     * </pre>
     * 
     * 
     * <p>
     * Objects of the following type(s) are allowed in the list
     * {@link AS }
     * 
     * 
     */
    public List<AS> getAS() {
        if (as == null) {
            as = new ArrayList<AS>();
        }
        return this.as;
    }

    /**
     * Gets the value of the rid property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getRid() {
        return rid;
    }

    /**
     * Sets the value of the rid property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setRid(String value) {
        this.rid = value;
    }

    /**
     * Gets the value of the uid property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getUid() {
        return uid;
    }

    /**
     * Sets the value of the uid property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setUid(String value) {
        this.uid = value;
    }

    /**
     * Gets the value of the ssd property.
     * 
     * @return
     *     possible object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public String getSsd() {
        return ssd;
    }

    /**
     * Sets the value of the ssd property.
     * 
     * @param value
     *     allowed object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public void setSsd(String value) {
        this.ssd = value;
    }

    /**
     * Gets the value of the trainId property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTrainId() {
        return trainId;
    }

    /**
     * Sets the value of the trainId property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setTrainId(String value) {
        this.trainId = value;
    }

    /**
     * Gets the value of the toc property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getToc() {
        return toc;
    }

    /**
     * Sets the value of the toc property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setToc(String value) {
        this.toc = value;
    }

    /**
     * Gets the value of the qtrain property.
     * 
     * @return
     *     possible object is
     *     {@link Boolean }
     *     
     */
    public Boolean isQtrain() {
            return qtrain;
    }

    /**
     * Sets the value of the qtrain property.
     * 
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *     
     */
    public void setQtrain(Boolean value) {
        this.qtrain = value;
    }

    /**
     * Gets the value of the status property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getStatus() {
        return status;
    }

    /**
     * Sets the value of the status property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setStatus(String value) {
        this.status = value;
    }

    /**
     * Gets the value of the trainCat property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTrainCat() {
        return trainCat;
    }

    /**
     * Sets the value of the trainCat property.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setTrainCat(String value) {
        this.trainCat = value;
    }

    /**
     * Gets the value of the deleted property.
     * 
     * @return
     *     possible object is
     *     {@link Boolean }
     *     
     */
    public Boolean isDeleted() {
            return deleted;
    }

    /**
     * Sets the value of the deleted property.
     * 
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *     
     */
    public void setDeleted(Boolean value) {
        this.deleted = value;
    }

    /**
     * Gets the value of the can property.
     * 
     * @return
     *     possible object is
     *     {@link Boolean }
     *     
     */
    public Boolean isCan() {
            return can;
    }

    /**
     * Sets the value of the can property.
     * 
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *     
     */
    public void setCan(Boolean value) {
        this.can = value;
    }

}

当我在数组列表中添加大约 60,000 个旅程类对象时。它给出了 java.lang.outofmemory 错误,我已将最大大小增加到 1GB 的堆大小。对于大元素,除了 ArrayList 之外还有其他选择吗?

4

1 回答 1

0

这样ArrayList可能不是问题。它更容易中断,因为ArrayList当您添加的元素多于当前数组可以包含的元素时,分配的数组大小是两倍,即当内部元素数组已满时,它将使数组加倍并复制所有内容。因此,在很短的时间内,它需要size()*3数倍的内存(实际数字略有不同,但你明白了)。

您可以使用其他列表,但它们需要更多内存,但需要小块。

上面的错误还取决于每个Journey对象的大小。60K 个对象不算多,但如果每个对象为 10KB,则需要 600 MB 或您为 Java VM 提供的 1GB 的 60%。

解决方法:

  1. 记住文件中的开始和结束位置,而不是将整个对象保存在 RAM 中。这只需要几个字节。当有人请求一个对象时,用于RandomFileAccess读取单个旅程的 XML 并对其进行解析。

  2. 不是将所有对象都保存在内存中,而是将数据放入数据库中。

于 2015-01-19T13:21:29.510 回答