在一些规模稍大的应用中,Java虚拟机(JVM)的内存设置尤为重要,想在项目中取得好的效率,GC(垃圾回收)的设置是第一步。
PermGen space:全称是Permanent Generation space.就是说是永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域Heap space:存放Instance。
GC(Garbage Collection)应该不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误
Java Heap分为3个区
1.Young
2.Old
3.Permanent
Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。
JVM的Heap分配可以使用-X参数设定,
-Xms
初始Heap大小
-Xmx
java heap最大值
-Xmn
young generation的heap大小
JVM有2个GC线程
第一个线程负责回收Heap的Young区
第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区
Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。
为什么一些程序频繁发生GC?
有如下原因:
1.程序内调用了System.gc()或Runtime.gc()。
2.一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
3.Java的Heap太小,一般默认的Heap值都很小。
4.频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。
如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态,许多Server端的Java程序每次GC后最好能有65%的剩余空间
经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。
注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。
Stack的设定
每个线程都有他自己的Stack。
-Xss
每个线程的Stack大小
Stack的大小限制着线程的数量。如果Stack过大就好导致内存溢漏。-Xss参数决定Stack大小,例如-Xss1024K。如果Stack太小,也会导致Stack溢漏。
主要通过以下的几个jvm参数来设置堆内存的:
-Xmx512m | 最大总堆内存,一般设置为物理内存的1/4 |
-Xms512m | 初始总堆内存,一般将它设置的和最大堆内存一样大,这样就不需要根据当前堆使用情况而调整堆的大小了 |
-Xmn192m | 年轻带堆内存,sun官方推荐为整个堆的3/8 |
堆内存的组成 | 总堆内存 = 年轻带堆内存 + 年老带堆内存 + 持久带堆内存 |
年轻带堆内存 | 对象刚创建出来时放在这里 |
年老带堆内存 | 对象在被真正会回收之前会先放在这里 |
持久带堆内存 | class文件,元数据等放在这里 |
-XX:PermSize=128m | 持久带堆的初始大小 |
-XX:MaxPermSize=128m | 持久带堆的最大大小,eclipse默认为256m。如果要编译jdk这种,一定要把这个设的很大,因为它的类太多了。 |
我的配置(2g内存的笔记本):
还有其它的相关参数可以看看下面的参考材料,很有启发的:
-XX:+UseParallelGC 使用并发内存回收
-XX:+DisableExplicitGC 禁用System.gc()的显示内存回收
附Eclipse.ini配置实例,4G内存
2.Eclipse配置tomcat运行内存
相关推荐
2. **默认的JVM堆内存设置不足**:默认情况下,JVM分配给应用程序的堆内存可能相对较小,不足以满足特定应用场景的需求。 3. **配置不当**:在配置文件中,如果没有正确地设置JVM参数来调整内存大小,也会导致内存...
总结起来,这个主题涵盖了Tomcat的热部署策略,Jrebel工具的使用以及JVM内存调优,这些都是Java开发中提高生产力和解决性能问题的关键技术。通过合理运用这些知识,开发者可以更高效地调试和测试代码,同时确保系统...
- `-Xmx<size>`:设置JVM的最大堆内存。 - `-Xms<size>`:设置JVM的初始堆内存。 - `-XX:+UseParallelGC`:使用并行垃圾收集器。 3. **行为参数** - `-Djava.net.preferIPv4Stack=true`:优先使用IPv4协议栈。 ...
### Tomcat调优及相关汇总设置 #### 一、Tomcat防止恶意攻击 ##### 1. 管理平台安全设置 - **管理平台**: Tomcat自带的管理平台(manager)是一个web应用,可通过`localhost:8080/manager/html`进行访问。此平台...
在性能调优方面,Eclipse的Tomcat插件也提供了便利。例如,开发者可以监控服务器的资源使用情况,包括CPU、内存等,以便于优化应用性能。此外,插件还支持配置服务器的启动参数,如JVM选项,以适应不同的运行环境...
6. 熟悉JVM:面试中可能涉及垃圾回收、内存模型、JVM调优等方面的问题。 7. 实践项目经验:讲述参与过的项目,强调你在项目中的角色和贡献,展示解决问题的能力。 8. 持续学习和关注新技术:如Spring Boot、...
这不仅包括了基本的CPU和内存使用情况监控,还包括了更高级的功能,如线程分析、JVM参数调整、GC(垃圾回收)行为分析等,这些都是进行性能调优时不可或缺的工具。 **标签**中提到的“Eclipse”、“Tomcat”、...
- JVM调优 - Tomcat调优 - 数据库调优 10. 安全: - XSS、CSRF、SQL注入等常见安全漏洞 - Spring Security安全框架 以上是Java后端必会的所有技能,掌握这些技能可以帮助开发人员在Java后端开发领域更加...
- 使用JVM的内存调优,调整`setenv.sh`或`setenv.bat`中的JVM启动参数。 7. **日志与错误处理** - Tomcat的日志文件主要位于`logs`目录下,包括`catalina.out`、`host-manager`、`manager`等。 - 通过`logging....
- **内存调优**:分析了Tomcat的内存配置,包括JVM参数的设置和内存泄漏的预防。 5. **安全与部署** - **安全管理**:涵盖了用户认证、授权、会话管理等安全措施的实施。 - **虚拟主机**:介绍了如何在Tomcat中...
- **性能调优**:调整Connector组件的参数,如maxThreads、minSpareThreads等,以及JVM内存设置,以适应不同的负载需求。 6. **故障排查与日志** - **日志系统**:Tomcat5.0生成的日志文件位于logs目录下,通过...
3. **性能调优**:根据应用负载调整参数,如增大堆内存、优化JVM设置、减少应用程序的响应时间等。 **集成开发环境(IDE)支持:** 许多Java IDE,如Eclipse、IntelliJ IDEA等,都提供了与Tomcat的集成,支持直接在...
- 使用JVM的性能调优选项,例如调整堆内存大小,启用G1垃圾收集器等。 7. **扩展性** 虽然Tomcat本身不包含完整的Java EE功能,但可以通过与其他服务器(如JBoss、GlassFish)或添加Apache Maven插件来扩展其功能...
10. **性能优化**:Tomcat可以通过调整一系列参数进行性能优化,包括线程池大小、内存分配、JVM调优等。这些配置通常在`conf/server.xml`或`bin/catalina.sh`(或`catalina.bat`)中进行。 总结来说,Tomcat8作为一...
2. **内存调优**:根据应用的负载和资源需求,调整JVM的内存设置,例如在`bin/catalina.sh`或`bin/catalina.bat`中设置`JAVA_OPTS`。 3. **连接器优化**:根据服务器的硬件和网络条件,调整连接器的参数,如最大线程...
- JVM调优 - Tomcat调优 - 数据库调优 10. 安全: - XSS、CSRF、SQL注入等常见安全漏洞 - Spring Security安全框架 以上是Java后端必会的所有技能,掌握这些技能可以帮助开发人员在Java后端开发领域更加...
7. **性能调优**:可以通过调整JVM参数、线程池设置、连接器配置等方式对Tomcat进行性能优化,以适应不同规模的业务需求。 8. **集成开发环境**:Tomcat可与Eclipse、IntelliJ IDEA等IDE集成,方便开发者进行调试和...
- 使用JVM的性能监视和调优工具,如JVisualVM或JProfiler,监控和优化内存分配和垃圾回收。 6. **故障排查与日志**: - 查看`logs`目录下的日志文件,如`catalina.out`,获取运行时错误信息。 - 使用`stderr.log...