Мы профилировали наше приложение с помощью Jprofiler для устранения утечек памяти и обнаружили следующие наблюдения:
Мы запустили наше приложение на одном и том же наборе данных для проверки и сделали несколько снимков. после отметки Heap, чтобы увидеть классы, способствующие утечке памяти.
Байт[], String, int[] после проверки их распределения указывают на запросы JPA . Например, все точки выделения для byte[] указывают на результаты запроса:
Код: Выделить всё
QuerImpl.getSingleResultКод: Выделить всё
QueryImpl.getResultListКод: Выделить всё
EnitiyManger.find
Аналогичные результаты были получены для выделения строк, jav.util.HashMap$Node:

Единственный запрос в JPA, который показывает значительное распределение, — это checkResourceID в классе Дао:
Код: Выделить всё
@Stateless
@EJB(name = "java:global/ResourceProceduresDaoImpl", beanInterface = ResourceProceduresDao.class)
public class ResourceProceduresDaoImpl implements ResourceProceduresDao {
@Resource(mappedName = "java:/M2M_RESOURCES")
private DataSource ds;
@PersistenceContext(unitName = "EM")
EntityManager em;
static Logger logger = LogManager.getLogger(ResourceProceduresDaoImpl.class);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
public void create(R resource) {
em.persist(resource);
em.flush();
}
public R retrieve(Class type, String resourceID) {
logger.info("ResourceProceduresDaoImpl class=" + type + " resourceID=" + resourceID);
Object obj = em.find(type, resourceID);
// logger.info("ResourceProceduresDaoImpl obj="+obj);
return (R) obj;
}
public void update(R resource) {
em.merge(resource);
}
public void delete(R resource) {
if (!em.contains(resource))
resource = em.merge(resource);
em.remove(resource);
}
public boolean checkResourceID(String resourceID) {
boolean ifExists = false;
if (em.createNamedQuery("ResourcePCM.findByResourceID", ResourceParentChildMapping.class)
.setParameter("resourceId", resourceID).getSingleResult() == null) {
ifExists = true;
}
..//
return ifExists;
}
Код: Выделить всё
@Entity
@Table(name="\"RESOURCE_PCM\"",schema="\"RESOURCES\"")
@NamedQueries({
@NamedQuery(name="ResourcePCM.findAll", query="SELECT r FROM ResourcePCM r"),
@NamedQuery(name="ResourcePCM.findByResourceID", query="SELECT r FROM ResourcePCM r where r.resourceID = :resourceId")
})
@NamedStoredProcedureQuery(
name = "generateResourceID",
procedureName = "generateResourceID",
parameters = {
@StoredProcedureParameter(mode = ParameterMode.IN, type = String.class, name = "input"),
@StoredProcedureParameter(mode = ParameterMode.OUT, type = String.class, name = "output")
}
)
public class ResourcePCM implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name="\"resourceID\"")
private String resourceID;
@Column(name="\"structuredResourceID\"")
private String structuredResourceID;
@Column(name="\"parentID\"")
private String parentID;
@Column(name="\"resourceType\"")
private Integer resourceType;
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true)
@JoinColumn(name="\"resourceID\"",referencedColumnName="\"resourceID\"")
private Set resourceACP;
..///
}
Это JPA
код> ? Или способ вызова EntityManager?
PS: я использую JNDI поиск для своих Beans, а не внедрение с помощью @EJB или @Inject, если это будет иметь значение?
EDIT
persistence.xml:
Код: Выделить всё
org.eclipse.persistence.jpa.PersistenceProvider
java:/M2M_RESOURCES
package.jpa.ResourceBase1
package.jpa.ResourceBase2
package.jpa.ResourceBase3
package.jpa.ResourceBase4
package.jpa.ResourceBase5
package.jpa.ResourceBase6
..///
package.mapping.DBJsonConverter
Источник: https://stackoverflow.com/questions/781 ... emory-leak
Мобильная версия