在学习GC机制时,发现有些东西通过普通的jvm参数是很难看到的,比如在ParallelGC触发悲观机制时,如果想看到此时新生代的平均晋升大小似乎就不可能的,发现在JDK源代码中有类似下面这样的if块:
if (PrintGCDetails && Verbose) {
gclog_or_tty->print(result ? " do scavenge: " : " skip scavenge: ");
gclog_or_tty->print_cr(" average_promoted " SIZE_FORMAT
" padded_average_promoted " SIZE_FORMAT
" free in old gen " SIZE_FORMAT,
(size_t) policy->average_promoted_in_bytes(),
(size_t) policy->padded_average_promoted_in_bytes(),
old_gen->free_in_bytes());
if (young_gen->used_in_bytes() <
(size_t) policy->padded_average_promoted_in_bytes()) {
gclog_or_tty->print_cr(" padded_promoted_average is greater"
" than maximum promotion = " SIZE_FORMAT, young_gen->used_in_bytes());
}
}
这里即使打开了-XX:+PrintGCDetails选项也是不行的,因为只有在Debug版本中,才能够设置-XX:+Verbose参数。
Debug版本的JDK的下载地址如下:
http://download.java.net/jdk6/6u25/promoted/b03/binaries/
或者使用如下方法自己搞一个Debug的Build(还没有试):
http://www.softwareengineeringsolutions.com/thoughts/Java-Debug-Build.htm
有了Debug版本的JDK后,在jvm参数中需要增加以下值:
引用
-Xloggc:./gc.log
-XX:+PrintGCDetails
-XX:+Verbose
运行程序后再看看gc.log,可以看到日志信息多了很多,找到触发fullGC的地方,可以看到以下日志:
引用
full after scavenge: average_promoted 6291504 padded_average_promoted 6291504 free in old gen 4194256
很清楚,是因为MinorGC后的悲观策略检查发现平均晋升大小(6MB)>旧生代剩余大小(4MB)导致的FullGC。
分享到:
相关推荐
在C#中,有多种方式实现日志记录,例如使用System.Diagnostics.Trace和Debug类,或者使用第三方库如Log4Net、NLog和Serilog等。 日志类通常包含以下功能: 1. **日志级别设置**:允许用户根据需要选择记录哪些级别...
例如,`-Xlog:gc*=debug:file=gc.log` 参数可以开启详细的GC日志输出。 总之,【JAVA·初级】GC垃圾回收机制是Java开发者必须掌握的基础知识,深入理解和运用GC机制,能有效提升程序的性能和稳定性。在实践中不断...
通过修改其中的设置,可以更改日志级别(如DEBUG、INFO、WARN等)、文件大小限制以及备份策略。 例如,要增加日志文件的备份数量,可以修改log4j.appender.emlogAppender.MaxBackupIndex和log4j.appender....
- 等级(level):日志的严重性等级,包括FATAL、ERROR、WARN、INFO、DEBUG; - 应用ID(app_id):标识日志来源,保持与服务树一致,使用部门.项目.应用的三级结构,并确保全局唯一性; - 实例ID(instance_id):...
例如,你可以选择记录所有GC事件(`all`),或者特定的事件如`gc`,并且可以设置日志级别,如`info`、`debug`等。 2. **`output`** 部分定义日志输出的位置,可以是标准错误(`stderr`)、标准输出(`stdout`)或...
通过控制台或配置文件,可以定制日志级别(如DEBUG、INFO、WARN等)、日志输出目标(如控制台、文件、syslog等)以及特定组件的日志。合理设置能确保关键信息被记录,同时避免过多的无关日志导致磁盘空间浪费。 2. ...
1. 日志级别:理解DEBUG、INFO、WARN、ERROR等不同级别的含义,根据情况调整日志级别以获取所需信息。 2. 异常堆栈:通过查看错误堆栈跟踪,可以定位到问题发生的具体代码行。 3. 日志切割:定期或按大小切割日志,...
本课程“D17214GC10 Oracle Database 10g Program with PLSQL”主要关注如何使用PL/SQL与Oracle 10g数据库进行交互,开发高效、安全的数据库解决方案。通过学习,你可以掌握以下关键知识点: 1. **Oracle数据库基础...
1. DDMS(Dalvik Debug Monitor Server):在Android开发中,DDMS是一个调试工具,它可以用于查看进程信息、线程、堆栈等,并且可以模拟来电、短信、电池等状态,还可以用于查看设备日志。它可以帮助开发者捕获Heap...
VI 应用随身小助手是江杰平安银行开发的一款应用监控工具,主要用于应用启动和状态管理、组件暴露和控制、应用诊断和在线 Debug 等功能。下面是 VI 应用随身小助手的详细知识点: 应用启动和状态管理 VI 应用随身...
XPocket Case4 – GC异常,但没开GC日志? XPocket Case4 演示了如何使用XPocket解决GC异常问题。传统的排查方式是重启应用加参数。XPocket提供了JNI插件,能够使用JNI插件动态开启GC日志打印,保留现场。 XPocket...
- **触发GC**:`jcmd <pid> GC.run` - **获取线程堆栈**:`jcmd <pid> Thread.print` #### 四、Native Memory Tracking Native Memory Tracking允许开发者跟踪Java应用程序中的本机内存使用情况。这对于分析由于本...
1. **日志级别**:根据需求调整日志级别(DEBUG、INFO、WARN、ERROR),避免过度的日志输出影响性能。 2. **日志切割**:使用Log4j或Logback进行日志切割,避免单个日志文件过大。 3. **异步日志**:启用异步日志...
关键的日志级别包括DEBUG、INFO、WARN、ERROR和FATAL,它们分别对应不同的严重程度。日志框架如Log4j、Logback和SLF4J可以帮助我们管理和格式化日志输出。 2. **性能监控**:Java平台提供了JMX(Java Management ...
Java中常用的日志框架有Log4j、Logback和SLF4J,它们允许开发者设置不同的日志级别,如ERROR、WARN、INFO、DEBUG等,以适应不同场景的需求。结合日志聚合工具如Logstash和ELK Stack(Elasticsearch、Logstash、...
Dalvik调试监视服务(Dalvik Debug Monitor Service, DDMS)是Android SDK提供的一个强大的调试工具,它集成了任务管理器、文件浏览器、模拟控制台以及日志控制台等功能。通过DDMS,开发者不仅可以监控模拟器或真实...
日志文件 一个简单的工具将 Go gctrace 转换为 csv 用法 Usage1: log2csv -i gc.log -o gc.csv Usage2: GODEBUG=gctrace=1 your-go-program 2>&1 | log2csv -o gc.csv -i="stdin": The input file -o="stdout": ...
此外,课程还将涉及GC日志的解读和分析,这对于诊断内存泄漏等问题至关重要。 课程还将涵盖线程堆栈分析、内存dump的处理以及内存分析工具的使用,这些都是解决多线程问题和内存管理问题的关键。同时,fastthread...
7. **Log4j的日志级别**:Log4j提供了ERROR、WARN、INFO、DEBUG四个主要的日志级别,优先级从高到低排列,ERROR用于严重错误,WARN表示警告,INFO用于一般信息,DEBUG用于调试信息。 8. **拦截器与过滤器的区别**:...
- 日志级别:DEBUG、INFO、WARN、ERROR,根据需要调整日志级别。 - 使用SLF4J与Logback/Log4j等日志框架,统一日志输出。 10. **性能优化**: - 深入理解JVM内存模型,合理设置堆大小,避免内存溢出。 - 代码...