这几天发现现网几台服务器的应用有内存泄露的现象,对其中缓存中各个对象数据进行检查,发现ehcache对象数量是2万多个,查询业务表中发现商用状态的业务数据还不到1万。
自己就写一段代码使用visualvm工具。对Ehcache中对象回收机制进行分析
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
CacheManager cacheManager = CacheManager.getInstance();
long startTime = System.currentTimeMillis();
println "startTime is " + new Date();
Cache cache = new Cache("test",4,false,false,5,5);
cacheManager.addCache(cache);
cache = cacheManager.getCache("test");
5.times {
cache.put(new Element("k$it",new GameServiceVo()));
}
println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
reader.readLine();
println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
3.times {
println cache.get("k$it")?.value;
}
reader.readLine();
println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
4.times {
cache.put(new Element("k$it",it));
}
println "cache size=" + cache.size + ",keys="+cache.keys+",millis is " + (System.currentTimeMillis()-startTime);
reader.readLine();
先限定cache中只能放4个对象,生命周期5秒。放入5个GameServiceVo对象,过几十秒秒后检查一下jvm中GameServiceVo对象个数,还是4个
说明对象未释放,接着读取其中2个对象,得到都是Null,再检查一下jvm中GameServiceVo对象个数,是2个
再重新放入4个Integer对象,再检查一下jvm中GameServiceVo对象个数,是0个,全部被回收
Ehcache中对象可以被回收需要以下条件:
1、对象已经过期,被读取一次会删除对象的引用
2、缓存已满,根据清除策略,被清除的对象会被回收
所以使用ehcache时设置缓存大小时不是越大越好,否则有可能造成ehcache占用内存越来越大,直到缓存已满才能触发对象回收
- 大小: 83.1 KB
- 大小: 35.6 KB
- 大小: 37 KB
- 大小: 30.1 KB
分享到:
相关推荐
5. 缓存优化:利用缓存减少数据库访问,如使用Ehcache或Guava Cache。 六、性能瓶颈分析 1. CPU分析:检查是否有热点方法,通过CPU剖析定位问题代码。 2. 内存分析:关注内存泄露,查看对象生命周期和存活情况。 3....
8. 系统资源监控:使用监控工具(如JConsole或VisualVM)实时查看和分析Tomcat的内存使用情况,及时发现问题。 综上所述,SSH整合和Tomcat内存优化是Java Web开发中提升应用性能的关键步骤。通过理解各个框架的职责...
- **缓存策略**:合理使用缓存机制,如Ehcache或Infinispan,减少数据库查询。 - **懒加载**:对于不常使用的对象,使用懒加载策略以降低初始化时的资源消耗。 3. **数据库优化**: - **索引优化**:合理创建和...
6. **监控与分析**:使用工具如VisualVM、JProfiler、YourKit等进行性能监控,分析CPU、内存、线程等状况,找出性能瓶颈。日志和Profiling可以帮助定位问题,而AOP(面向切面编程)可以用于记录方法执行时间,便于...
- **线程分析**:使用工具(如VisualVM)查看线程堆栈信息,分析哪些线程占用了大量CPU资源。 - **热点代码分析**:利用Profiler工具(如JProfiler)找出执行频率较高的代码段,针对性优化。 - **并发模型优化**:...
6. **性能分析与优化工具**:除了前面提到的VisualVM和JConsole,JProfiler、YourKit等也是强大的JVM性能分析工具,它们可以帮助开发者找到CPU、内存、线程等方面的瓶颈。 7. **JVM内存模型**:理解JMM(Java内存...
3. **缓存一致性**:在分布式环境中,确保缓存数据的一致性,如使用分布式锁或事件驱动机制。 通过以上这些方面,我们可以对J2EE应用程序进行深度优化,提升系统的响应速度、资源利用率和整体性能。而"Java ...
设置合适的日志级别,使用性能监控工具(如JProfiler、VisualVM)定期检查系统状态,以便及时发现并解决瓶颈。 10. **微服务架构**:随着微服务架构的流行,服务间的通信(如API调用)也可能成为新的瓶颈。采用合适...
3. **缓存策略**:Liferay支持多种缓存机制,如OSCache、EHCache和Infinispan。理解这些缓存机制的工作原理,合理配置缓存策略,能显著减少数据库查询,提高页面加载速度。 4. **数据库优化**:数据库是Liferay性能...
10. **监控与日志分析**:定期对系统性能进行监控,通过工具如JProfiler、VisualVM等分析系统瓶颈,根据日志进行问题定位,以便及时调整优化策略。 11. **架构优化**:采用微服务架构,将大系统拆分为多个小服务,...
使用本地缓存如Ehcache或分布式缓存如Redis,可以降低数据库访问频率,提高数据获取速度。 6. **线程池配置**: 通过调整线程池的大小、拒绝策略和队列长度,可以平衡系统资源的使用,避免过多的线程切换和资源...
- **VisualVM**:提供更详细的性能分析,包括CPU、内存、线程和方法调用等。 - **jmap, jhat, jstat**:命令行工具用于内存dump、统计信息和堆分析。 6. **JIT编译器**: - **热点代码识别**:JIT会自动识别并...
2. **JVM深入理解**:了解Java虚拟机的工作原理,包括内存模型、类加载机制、垃圾回收、性能优化等方面,对于提升系统性能和解决运行时问题至关重要。 3. **并发与多线程**:在Java系统架构中,高并发处理能力是...
- **工具辅助**:使用如VisualVM、JProfiler等工具来检测和分析内存泄漏问题。 #### Concurrency ##### 6. Hot Fudge Sundae Standoff: Thread Deadlocks **问题描述**:线程死锁发生在两个或多个线程相互等待对方...
- **调优工具**:利用各种工具监控系统性能,例如JConsole、VisualVM、WebLogic Server Management Console等。 #### 三、WebLogic Server配置调优 - **内存管理**:合理设置Heap Size(堆大小)、PermGen Size...
代码层面的优化主要包括减少磁盘I/O操作、避免无谓的数据复制、合理使用内存缓存等。Java的内存模型决定了程序对内存的访问效率,理解Java垃圾回收机制并避免内存泄漏是关键。使用Effective Java等书籍中的最佳实践...
- **缓存机制**:启用合适的缓存策略,比如使用Ehcache或OSGi服务层提供的缓存功能来加速数据访问。 3. **代码级优化** - **异步处理**:对于耗时的操作采用异步处理方式,避免阻塞主线程。 - **多线程编程**:...
在测试和优化阶段,Java的单元测试框架JUnit和性能分析工具如VisualVM可以帮助找出并修复潜在问题,优化系统性能。同时,遵循良好的编程规范和设计模式,如MVC(模型-视图-控制器)架构,可以提高代码的可读性和可...
使用代码分析工具(如SonarQube)找出代码中的性能问题和潜在风险。 11. **JIT编译器**:理解JIT(Just-In-Time)编译器的作用,它是如何将热点代码转换为机器码以提升性能的。使用`-XX:+PrintCompilation`查看哪些...