[JAVA web]PermGen space错误,Target runtime Tomcat 7.0 is not defined,EntityManager方法简介
2015-04-03 08:57
841 查看
一、PermGen space错误,
在看下文之前,首先要确认意见事情,就是你是如何启动tomcat的,我们在平时的开发环境当中,都是通过startup.bat方式启动tomcat的,那么你按照下面的方式,去修改/bin/catalina.bat是没有问题的。但是如果你是生产环境下,我们一般都希望使用windows服务方式去启动tomcat,此时之前修改的配置文件是没有用的。因为windows服务启动tomcat不再去加载catalina.bat当中的参数了,而是去加载注册表中的参数,所以我们需要修改注册表。
HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Procrun 2.0/Tomcat_APPNAME/Parameters/Java,修改JvmMs和JvmMx的值,当前我都将其设定为1024,也就是1个G的容量。具体性能再后面继续观察。
之前还真不知道windows服务启动和startup.bat启动的区别。 windows服务器启动是在注册表中加载参数,startup.bat启动是在catalina.bat加载参数。
http://blog.csdn.net/fox009/article/details/5633007
http://hi.baidu.com/like_dark/blog/item/19c1948b3292b0799f2fb468.html
http://anyeeye.iteye.com/blog/444624
Tomcat6性能调优
出现java.lang.OutOfMemoryError: PermGen space
http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGen
space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat,
在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
修改eclipse.ini文件,修改如下:
如果还报错,可以考虑如下修改
报错:
修改catalina.bat
添加
样例
具体参数根据自己机器情况而定
二、Target runtime Apache Tomcat 7.0 is not defined
最近做一个项目,我负责搭建整体技术框架,将架构完成后,发布到SVN上,同事们进行同步的时候却出现问题了,由于我搭建环境所有的技术框架全部为最新版本,而大家电脑上的可能是老版本,一般都出现如下错误:
Target runtime Apache Tomcat 7.0 is not defined
我了个去,我这个框架没有依赖Tomcat7.0啊,咋会出现如此情况呢?
经检查发现,原来是这个问题:
在工程目录下的.settings文件夹里,打开org.eclipse.wst.common.project.facet.core.xml文件,其内容是:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="Tomcat v7.0"/>
<fixed facet="java"/>
<fixed facet="jst.web"/>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
改为:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="java"/>
<fixed facet="jst.web"/>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
在看下文之前,首先要确认意见事情,就是你是如何启动tomcat的,我们在平时的开发环境当中,都是通过startup.bat方式启动tomcat的,那么你按照下面的方式,去修改/bin/catalina.bat是没有问题的。但是如果你是生产环境下,我们一般都希望使用windows服务方式去启动tomcat,此时之前修改的配置文件是没有用的。因为windows服务启动tomcat不再去加载catalina.bat当中的参数了,而是去加载注册表中的参数,所以我们需要修改注册表。
HKEY_LOCAL_MACHINE/SOFTWARE/Apache Software Foundation/Procrun 2.0/Tomcat_APPNAME/Parameters/Java,修改JvmMs和JvmMx的值,当前我都将其设定为1024,也就是1个G的容量。具体性能再后面继续观察。
之前还真不知道windows服务启动和startup.bat启动的区别。 windows服务器启动是在注册表中加载参数,startup.bat启动是在catalina.bat加载参数。
1.参考:
http://blog.csdn.net/fox009/article/details/5633007http://hi.baidu.com/like_dark/blog/item/19c1948b3292b0799f2fb468.html
http://anyeeye.iteye.com/blog/444624
Tomcat6性能调优
出现java.lang.OutOfMemoryError: PermGen space
http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/
2.报错:
Exception in thread "DispatcherThread" java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: PermGen space Exception in thread "State Saver" java.lang.OutOfMemoryError: PermGen space Exception in thread "AWT-Windows" java.lang.OutOfMemoryError: OutOfMemoryError
3.原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS的话,就很可能出现PermGenspace错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
4.解决方法1:
手动设置MaxPermSize大小,如果是linux系统,修改TOMCAT_HOME/bin/catalina.sh,如果是windows系统,修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
5.解决方法2
修改eclipse.ini文件,修改如下:-vmargs -Dosgi.requiredJavaVersion=1.5 -Xms128m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=128M
如果还报错,可以考虑如下修改
-vmargs -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=512M
报错:
2011-11-21 21:10:46 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 严重: The web application [/Application] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 2011-11-21 21:10:46 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重: The web application [/Application] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak. 2011-11-21 21:10:46 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重: The web application [/Application] appears to have started a thread named [AWT-Windows] but has failed to stop it. This is very likely to create a memory leak. 2011-11-21 21:10:46 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 严重: The web application [/Application] appears to have started a thread named [Thread-14] but has failed to stop it. This is very likely to create a memory leak. 2011-11-21 21:10:46 org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap 严重: The web application [/Application] created a ThreadLocal with key of type [net.sf.json.AbstractJSON$1] (value [net.sf.json.AbstractJSON$1@3661eeb]) and a value of type [java.util.HashSet] (value [[]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak. 2011-11-21 21:10:50 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring FrameworkServlet 'Dispatcher'
修改catalina.bat
添加
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
样例
# JSSE_HOME (Optional) May point at your Java Secure Sockets Extension # (JSSE) installation, whose JAR files will be added to the # system class path used to start Tomcat. # # CATALINA_PID (Optional) Path of the file which should contains the pid # of catalina startup java process, when start (fork) is used # # $Id: catalina.sh 609438 2008-01-06 22:14:28Z markt $ # ----------------------------------------------------------------------------- JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1536m -Xmx1536m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC" # OS specific support. $var _must_ be set to either true or false. cygwin=false os400=false darwin=false case "`uname`" in CYGWIN*) cygwin=true;; OS400*) os400=true;; Darwin*) darwin=true;; esac # resolve links - $0 may be a softlink PRG="$0"
具体参数根据自己机器情况而定
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms512m -Xmx512m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+DisableExplicitGC"
二、Target runtime Apache Tomcat 7.0 is not defined
最近做一个项目,我负责搭建整体技术框架,将架构完成后,发布到SVN上,同事们进行同步的时候却出现问题了,由于我搭建环境所有的技术框架全部为最新版本,而大家电脑上的可能是老版本,一般都出现如下错误:
Target runtime Apache Tomcat 7.0 is not defined
我了个去,我这个框架没有依赖Tomcat7.0啊,咋会出现如此情况呢?
经检查发现,原来是这个问题:
在工程目录下的.settings文件夹里,打开org.eclipse.wst.common.project.facet.core.xml文件,其内容是:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<runtime name="Tomcat v7.0"/>
<fixed facet="java"/>
<fixed facet="jst.web"/>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
改为:
<?xml version="1.0" encoding="UTF-8"?>
<faceted-project>
<fixed facet="java"/>
<fixed facet="jst.web"/>
<fixed facet="wst.jsdt.web"/>
<installed facet="java" version="1.6"/>
<installed facet="jst.web" version="3.0"/>
<installed facet="wst.jsdt.web" version="1.0"/>
</faceted-project>
EntityManager方法简介
2009-05-05 11:26:58| 分类: 编程知识 |举报|字号 订阅
EntityManager 是用来对实体Bean 进行操作的辅助类。他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满足条件的实体Bean。实体Bean 被EntityManager 管理时,EntityManager跟踪他的状态改变,在任何决定更新实体Bean 的时候便会把发生改变的值同步到数据库中。当实体Bean 从EntityManager 分离后,他是不受管理的,EntityManager 无法跟踪他的任何状态改变。EntityManager 的获取前面已经介绍过,可以通过@PersistenceContext
注释由EJB 容器动态注入,例:
@PersistenceContext(unitName="foshanshop")
EntityManager em;
EntityManager常用方法:
1.Entity的获取
find(*.class,ID) :若实体Bean不存在,则返回null
getReference(*,class,ID) :若实体Bean不存在,则抛出javax.persistence.EntityNotFoundException,另,不保 证 实体Bean 已被初始化
注意:若*.class不是Entity Bean的话,都会引发IllegalArgumentException
2.persist() :添加实体Bean
3.更新实体Bean :当实体正在被容器管理时,你可以调用实体的set 方法对数据进行修改,在容器决定flush 时,更新的数据才会同步到数据库。如果你希望修改后的数据实时同步到数据库,你可以执行EntityManager.flush()方法。
4.merge () :是在实体Bean 已经脱离了EntityManager 的管理时使用,当容器决定flush 时,数据将会同步到数据库中,执行em.merge(Object obj)方法时,容器的工作规则:
(1).如果此时容器中已经存在一个受容器管理的具有相同ID 的Object实例,容器将会把参数obj的内容拷贝进这个受管理的实例,merge()方法返回受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把实例同步到数据库中。
(2).容器中不存在具有相同ID 的Object实例。容器根据传进的obj参数Copy 出一个受容器管理的Object实例,同时merge()方法会返回出这个受管理的实例,但参数obj仍然是分离的不受管理的。容器在决定Flush时把 实例同步到数据库中。如果传递进merge ()方法的参数不是实体Bean,会引发一个IllegalArgumentException
5.Remove() :删除对象
6.createQuery() 返回Query对象,以执行JPQL语句
7.createNativeQuery() 返回Query对象,以执行SQL语句
8.refresh() 刷新实体Bean,以得到对新对象 (幽雅的获取最新对象方法)
9.contains() 检测实体当前是否被管理中
该方法使用一个实体作为参数,如果这个实体对象当前正被持久化内容管理,返回值为true,否则为false
10.clear() 分离所有当前正在被管理的实体
在处理大量实体的时候,如果你不把已经处理过的实体从EntityManager 中分离出来,将会消耗你大量的内存。调用EntityManager 的clear()方法后,所有正在被管理的实体将会从持久化内容中分离出来。
有一点需要说明下,在事务没有提交前(事务默认在调用堆栈的最后提交,如:方法的返回),如果调用clear()方法,之前对实体所作的任何改变将会掉失,所以建议你在调用clear()方法之前先调用flush()方法保存更改
11. flush() 将实体的改变立刻刷新到数据库中
当实体管理器对象在一个session bean 中使用时,它是和服务器的事务上下文绑定的。实体管理器在服务器的事务提交时提交并且同步它的内容。在一个session bean 中,服务器的事务默认地会在调用堆栈的最后提交(如:方法的返回)
12.javax.persistence.FlushModeType 实体Bean管理器的Flush模式
FlushModeType.COMMIT :刷新只有在事务提交时才发生,使用场合:在大量更新数据的过程中存在查询语句(除了find()和getreference()查询)的执行
FlushModeType.AUTO :(默认模式)刷新在查询语句执行前(除了find()和getreference()查询)或事务提交时才发 生,使用场合:在大量更新数据的过程中没有任何查询语句(除了find()和getreference()查询)的执行。
JDBC 驱动跟数据库交互的次数。JDBC 性能最大的增进是减少JDBC 驱动与数据库之间的网络通讯FlushModeType.COMMIT 模式使更新只在一次的网络交互中完成,而FlushModeType.AUTO 模式可能需要多次交互(触发了多少次Flush 就产生了多少次网络交互)
设置:entityManager.setFlushMode(FlushModeType.COMMIT);
13.getDelegate( ) 获取持久化实现者的引用
用过getDelegate( )方法,你可以获取EntityManager 持久化实现者的引用,如Jboss EJB3 的持久化产品采用Hibernate,可以通过getDelegate( ) 方法获取对他的访问,如:
@PersistenceContext
protected EntityManager em;
HibernateEntityManager manager = (HibernateEntityManager)em.getDelegate();
获得对Hibernate 的引用后,可以直接面对Hibernate 进行编码,不过这种方法并不可取,强烈建议不要使用.在Weblogic 中,你也可以通过此方法获取对Kodo 的访问
另:映射的表名或列名与数据库保留字同名时的处理
将表名加标式符,例如:在Mysql下,用'order',或在sqlserver下用[TableName],但这样做不适合程序移植
相关文章推荐
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Flex+Java项目,Myeclipse环境下“Target runtime Apache Tomcat v6.0 is not defined ” 错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v5.0 is not defined 错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat XXX is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- eclipse Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Myeclipse环境下“Target runtime Apache Tomcat v6.0 is not defined ” 错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v6.0 is not defined.错误解决方法
- Target runtime Apache Tomcat v5.0 is not defined 错误解决方法
- 从SVN检出的项目出错(Target runtime Apache Tomcat v5.0 is not defined 错误解决方法)
- Target runtime Tomcat 7.0 is not defined