- 浏览: 211111 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
Prepared:
Hadoop的几个明显缺点 -
CSunDNan:
...
openjdk jvm 方法字节码执行过程 -
幻影之蚀:
...
mysql 源码分析2 源码调试环境建立 -
shukongchengje:
紧急呼唤楼主,mysql代码从哪里弄?官网wiki上看的一头雾 ...
mysql源码分析 整体架构 -
yeshaoting:
好文章.不介意的话转载了.
jvm 字节码中文含义
public static void gc() {
Runtime.getRuntime().gc();
}
if (!DisableExplicitGC) { //如果可以直接进行垃圾回收,则执行下面的一步, -XX:+DisableExplicitGC 选项可以关闭jvm的直接垃圾回收
Universe::heap()->collect(GCCause::_java_lang_system_gc);
}
}
void ParallelScavengeHeap::collect(GCCause::Cause cause) {
...........
VM_ParallelGCSystemGC op(gc_count, full_gc_count, cause);
VMThread::execute(&op);
}
void VM_ParallelGCSystemGC::doit() {
//在这主要看一下全部回收的代码
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
heap->invoke_full_gc(false);
}
inline void ParallelScavengeHeap::invoke_full_gc(bool maximum_compaction)
{
.......
PSMarkSweep::invoke(maximum_compaction);//从名字看出这个方法主要做标记、清除操作
}
void PSMarkSweep::invoke(bool maximum_heap_compaction) {
.........
PSMarkSweep::invoke_no_policy(maximum_heap_compaction);
}
void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
.........
//从根开始对强引用开始进行标记操作
Universe::oops_do(mark_and_push_closure());
ReferenceProcessor::oops_do(mark_and_push_closure());
JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
//跟踪每个线程堆栈,对堆栈里面的对象引用进行跟踪
Threads::oops_do(mark_and_push_closure());
ObjectSynchronizer::oops_do(mark_and_push_closure());
FlatProfiler::oops_do(mark_and_push_closure());
Management::oops_do(mark_and_push_closure());
JvmtiExport::oops_do(mark_and_push_closure());
//跟踪常量池用到的每个类
SystemDictionary::always_strong_oops_do(mark_and_push_closure());
vmSymbols::oops_do(mark_and_push_closure());
}
{
if (!oopDesc::is_null(heap_oop)) {
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
if (!obj->mark()->is_marked()) {
mark_object(obj); //对遍历到的对象进行标志
_marking_stack->push(obj); //对象入栈
}
}
}
void Threads::oops_do(OopClosure* f) {
for (JavaThread* p = _thread_list; p; p = X->next()){ //遍历所有用户线程
p->oops_do(f);
}
VMThread::vm_thread()->oops_do(f); //遍历vmThread
}
void JavaThread::oops_do(OopClosure* f) {
Thread::oops_do(f);
........
//下面是堆栈桢的遍历
for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
fst.current()->oops_do(f, fst.register_map());
}
........
}
void Frame::oops_do(OopClosure* f, RegisterMap* map) {
oops_do_internal(f, map, true);
}
void frame::oops_do_internal(OopClosure* f, RegisterMap* map, bool use_interpreter_oop_map_cache) {
if (is_interpreted_frame()) { //以解释桢为例
oops_interpreted_do(f, map, use_interpreter_oop_map_cache);
}
}
void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) {
............
oops_interpreted_locals_do(f, max_locals, mask);
oops_interpreted_expressions_do(f, signature, is_static,
m->max_stack(),
max_locals, mask);
............
}
void frame::oops_interpreted_locals_do(OopClosure *f,
int max_locals,
InterpreterOopMap *mask) {
for (int i = 0; i < max_locals; i++ ) {
Tag tag = interpreter_frame_local_tag(i);
if (tag == TagReference) { //如果是对象引用,则进行标记,总算找到了
oop* addr = (oop*) interpreter_frame_local_at(i);
assert((intptr_t*)addr >= sp(), "must be inside the frame");
f->do_oop(addr);
}
}
Runtime.getRuntime().gc();
}
if (!DisableExplicitGC) { //如果可以直接进行垃圾回收,则执行下面的一步, -XX:+DisableExplicitGC 选项可以关闭jvm的直接垃圾回收
Universe::heap()->collect(GCCause::_java_lang_system_gc);
}
}
void ParallelScavengeHeap::collect(GCCause::Cause cause) {
...........
VM_ParallelGCSystemGC op(gc_count, full_gc_count, cause);
VMThread::execute(&op);
}
void VM_ParallelGCSystemGC::doit() {
//在这主要看一下全部回收的代码
ParallelScavengeHeap* heap = (ParallelScavengeHeap*)Universe::heap();
heap->invoke_full_gc(false);
}
inline void ParallelScavengeHeap::invoke_full_gc(bool maximum_compaction)
{
.......
PSMarkSweep::invoke(maximum_compaction);//从名字看出这个方法主要做标记、清除操作
}
void PSMarkSweep::invoke(bool maximum_heap_compaction) {
.........
PSMarkSweep::invoke_no_policy(maximum_heap_compaction);
}
void PSMarkSweep::mark_sweep_phase1(bool clear_all_softrefs) {
.........
//从根开始对强引用开始进行标记操作
Universe::oops_do(mark_and_push_closure());
ReferenceProcessor::oops_do(mark_and_push_closure());
JNIHandles::oops_do(mark_and_push_closure()); // Global (strong) JNI handles
//跟踪每个线程堆栈,对堆栈里面的对象引用进行跟踪
Threads::oops_do(mark_and_push_closure());
ObjectSynchronizer::oops_do(mark_and_push_closure());
FlatProfiler::oops_do(mark_and_push_closure());
Management::oops_do(mark_and_push_closure());
JvmtiExport::oops_do(mark_and_push_closure());
//跟踪常量池用到的每个类
SystemDictionary::always_strong_oops_do(mark_and_push_closure());
vmSymbols::oops_do(mark_and_push_closure());
}
{
if (!oopDesc::is_null(heap_oop)) {
oop obj = oopDesc::decode_heap_oop_not_null(heap_oop);
if (!obj->mark()->is_marked()) {
mark_object(obj); //对遍历到的对象进行标志
_marking_stack->push(obj); //对象入栈
}
}
}
void Threads::oops_do(OopClosure* f) {
for (JavaThread* p = _thread_list; p; p = X->next()){ //遍历所有用户线程
p->oops_do(f);
}
VMThread::vm_thread()->oops_do(f); //遍历vmThread
}
void JavaThread::oops_do(OopClosure* f) {
Thread::oops_do(f);
........
//下面是堆栈桢的遍历
for(StackFrameStream fst(this); !fst.is_done(); fst.next()) {
fst.current()->oops_do(f, fst.register_map());
}
........
}
void Frame::oops_do(OopClosure* f, RegisterMap* map) {
oops_do_internal(f, map, true);
}
void frame::oops_do_internal(OopClosure* f, RegisterMap* map, bool use_interpreter_oop_map_cache) {
if (is_interpreted_frame()) { //以解释桢为例
oops_interpreted_do(f, map, use_interpreter_oop_map_cache);
}
}
void frame::oops_interpreted_do(OopClosure* f, const RegisterMap* map, bool query_oop_map_cache) {
............
oops_interpreted_locals_do(f, max_locals, mask);
oops_interpreted_expressions_do(f, signature, is_static,
m->max_stack(),
max_locals, mask);
............
}
void frame::oops_interpreted_locals_do(OopClosure *f,
int max_locals,
InterpreterOopMap *mask) {
for (int i = 0; i < max_locals; i++ ) {
Tag tag = interpreter_frame_local_tag(i);
if (tag == TagReference) { //如果是对象引用,则进行标记,总算找到了
oop* addr = (oop*) interpreter_frame_local_at(i);
assert((intptr_t*)addr >= sp(), "must be inside the frame");
f->do_oop(addr);
}
}
发表评论
-
Java类的初始化过程详解
2010-04-11 17:09 1229java是多线程的,所以类 ... -
jvm 字节码中文含义
2010-04-08 11:31 3627栈和局部变量操作 将常 ... -
诡异的JVM Crash之EXCEPTION_STACK_OVERFLOW
2010-04-08 11:08 1747关于JVM的一个常识是:如果对象被意外地持有很容易造成内存泄漏 ... -
jvm 初始化
2010-04-07 16:01 1181void vm_init_globals() { chec ... -
jvm gc
2010-04-06 23:52 1020jvm gc -
jvm exception
2010-04-06 23:52 851jvm exception -
jvm method invoke
2010-04-06 23:51 1080jvm method invoke -
jvm interpreter
2010-04-06 23:51 1249jvm interpreter 解释器的初始化 JNI_Cr ... -
jvm运行时数据结构
2010-04-06 23:50 909jvm运行时数据结构 -
jvm class与instance运行时结构
2010-04-06 23:49 871jvm class与instance运行时结构 -
jvm dll加载分析
2010-04-06 23:48 1172jvm dll加载分析 -
java class文件格式
2010-04-06 23:43 1424struct ClassFile { u4 magic; ... -
汇编语言与计算机体系结构--使用C++和Java
2010-04-06 15:16 1688第1章数制1 1.1简介1 1.2按位记数制1 1.3各数制的 ... -
JVM内存管理及垃圾回收机制
2010-04-06 09:30 854JAVA在内存中由 Perm 和 He ... -
IBM Java Jvm GC实现内幕 (几年前的老文)
2010-04-05 14:39 839好言归正传,按照Sam Borman的说法IBM java 1 ... -
修复 Java 内存模型,第 1 部分(什么是 Java 内存模型,最初它是怎样被破坏的?)
2010-03-30 14:16 1046Java 平台把线程和多处理技术集成到了语言中,这种集成程度比 ... -
JVM内存结构
2010-03-29 15:25 816(1)类装载子系统 装载 连 ... -
Java轻量级锁原理详解(Lightweight Locking)
2010-03-29 15:21 790Java轻量级锁原理详解(Lightweight Lockin ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:15 1063类的初始化和对象初始 ... -
解析 Java 类和对象的初始化过程
2010-03-29 15:14 745类的初始化和对象初始化是 JVM 管理的类型生命周期中非常重要 ...
相关推荐
在这种情况下,虽然没有直接涉及System.gc(),但这也揭示了在处理外部输入时,潜在的性能问题可能源自外部因素,需要对整个系统链路进行细致的监控和分析。 System.gc()的调用通常是不必要的,因为它会强制执行全局...
使用内存分析工具如MAT(Memory Analyzer Tool)进行排查。 6. **日志框架**:在实际的Java Web应用中,通常会使用Log4j、SLF4J等日志框架代替`System.out.println()`,因为它们提供更灵活的日志配置和输出控制。...
.NET的垃圾回收机制是通过System.GC类实现的。通过查看GC的源码,我们可以学习到.NET如何自动管理内存,以及如何避免常见的内存泄漏问题。 六、泛型与类型转换 System命名空间中的泛型类,如List和Dictionary, ...
3. 显式调用System.gc():虽然不推荐,但手动调用会请求进行Full GC。 4. G1垃圾收集器的混合收集(Mixed GC)失败:G1在尝试进行混合收集时,如果无法满足目标空间需求,会退化为Full GC。 5. CMS(Concurrent Mark...
3. **GC_EXPLICIT**: 通过调用`System.gc()`、`VMRuntime.gc()`接口或接收到`SIGUSR1`信号时触发。 4. **GC_BEFORE_OOM**: 在即将抛出内存溢出异常前最后一次尝试回收内存。 每种类型的GC都对应着不同的`GcSpec`...
在实际开发中,`System`类的这些功能经常被用来进行日志记录、性能分析、资源管理等。例如,`currentTimeMillis()`常用于计算程序的执行时间,`arraycopy()`在需要高效复制大量数据时特别有用。理解并熟练使用`...
ArrayList .....25 3.LinkedList.........30 4.Hashset 源码分析........35 5. 内存模型.......47 6. 垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射......
尽管可以尝试通过调用`System.gc()`来触发垃圾回收,但这并不总是最佳实践。调用此方法会导致当前线程暂停,等待GC完成,这可能会影响用户体验。而且,GC的工作方式是分批回收,可能导致内存并未完全清理,反而可能...
- **强制垃圾回收**:在计时前后的`System.gc()`调用虽然可以减少垃圾回收的影响,但也会增加额外的时间消耗。 - **系统时间精度**:`System.currentTimeMillis()`返回的是当前系统时间,其精度取决于操作系统的时钟...
1. 使用System.gc():System.gc()可以强制垃圾回收器回收垃圾对象,释放内存。 2. 使用LargeHeap: LargeHeap可以增加应用程序的内存大小,从而减少OOM错误的可能性。 3. 优化应用程序的性能:优化应用程序的性能...
3. **触发Full GC的原因**:当老年代空间不足、持久代空间不足、System.gc()被显式调用、上一次GC后Heap的剩余空间小于历次GC平均普通对象大小等情况下,都可能导致Full GC的发生。 4. **GC调优的目标**:减少Full ...
6. **System.gc()的使用**:尽管可以调用`System.gc()`建议JVM进行垃圾收集,但不应过度依赖这个方法,因为垃圾收集器何时执行、是否执行是不确定的,过度调用可能会增加系统开销,影响性能。 7. **内存泄漏与内存...
- `System.gc();` 触发垃圾回收,但并不立即执行。即使执行了垃圾回收,`B.num` 的值也不会改变,因为它是静态的。 #### 3. 生产者消费者模型 **知识点概述:** - **生产者消费者模式:** 一种经典的并发编程...
1. 避免无谓的System.gc()调用,让JVM自行决定最佳的垃圾回收时机。 2. 调整堆大小,确保有足够的空间容纳程序运行所需的对象。 3. 使用对象池来复用对象,减少新对象的创建。 4. 使用合适的对象类型,避免创建不必...
4. **GC触发条件**:内存分配达到阈值、手动触发、System.gc()调用等都可能导致GC启动。 5. **GC参数调整**:通过JVM参数可以调整GC行为,如-Xms、-Xmx设置堆大小,-XX:NewRatio设置新生代与老年代比例,-XX:...