import java.util.ArrayList;
import java.util.List;
public class JavaMemory2
{
private List list = new ArrayList();
static float freeMem = 0f;
static float totalMem = 0f;
static float maxMem = 0f;
static float usedMemRate = 0f;
static
{
System.out.println("-----------系统初始时内存情况---------------");
showMem();
}
public static void showMem()
{
freeMem = Runtime.getRuntime().freeMemory()/1024/1024;
totalMem = Runtime.getRuntime().totalMemory()/1024/1024;
maxMem = Runtime.getRuntime().maxMemory()/1024/1024;
usedMemRate = (totalMem - freeMem) / maxMem * 100.0f;
StringBuilder sb = new StringBuilder();
sb.append("最大内存:" + maxMem + " MB\n")
.append("当前最大内存:" + totalMem + " MB\n")
.append("当前空闲内存:" + freeMem + " MB\n")
.append("当前已使用的内存:" + (totalMem - freeMem) + " MB\n")
.append("实际jvm剩余内存:" + (maxMem - (totalMem - freeMem)) );
System.out.println(sb.toString());
}
public void f()
{
B b1 = new B();
list.add(b1);
System.out.println("--------------------");
showMem();
}
public void f2()
{
List al = list;
// list = null; //此时并没有回收堆中内存b1, 因为还存在引用
// list.clear(); //可以回收内存b1
B b2 = new B();
al.add(b2);
System.out.println("--------------------");
showMem();
B b3 = new B();
al.add(b3);
}
public static void main(String[] args)
{
JavaMemory2 jmp = new JavaMemory2();
jmp.f();
jmp.f2();
}
}
class B
{
public byte[] data1 = new byte[(int)(Runtime.getRuntime().maxMemory() * 0.4)];
public int b;
}
分享到:
相关推荐
例如,了解何时使用new和delete操作符,以及如何有效地管理动态内存,能避免内存泄漏问题。 文件I/O操作是每个C++开发者都需要掌握的,书中可能会详细介绍fstream库的使用,包括读写文本文件、二进制文件以及流缓冲...
4. **构造函数与析构函数**:学习如何使用构造函数初始化对象,以及析构函数在对象生命周期结束时进行清理工作。 5. **继承与多态**:理解类之间的层次关系,如何通过继承扩展已有类的功能,并通过虚函数和纯虚函数...
通过阅读《深度探索C++对象模型》,读者将能够理解C++如何在底层实现这些特性,掌握更深层次的编程技巧,提高代码质量,并能更好地优化和调试程序。此外,了解对象模型还有助于在设计复杂系统时做出明智的决策,确保...
书中会讨论内存分配、释放和内存泄漏问题,以及智能指针的使用。 通过阅读《深度探索C++对象模型》,程序员不仅可以加深对C++语言的理解,还能提高编写高效、可靠代码的能力。无论是初学者还是有经验的开发者,这...
5. 构造函数与析构函数:构造函数在对象创建时自动调用,用于初始化对象的状态;析构函数在对象生命周期结束时调用,释放资源。理解它们的工作机制对于避免内存泄漏至关重要。 6. 静态成员与常量成员:静态成员属于...
12. **内存管理**:C++提供了动态内存分配和释放的机制,如new和delete关键字,理解内存管理对于避免内存泄漏至关重要。 13. **预处理器**:预处理器指令(如#include、define等)在编译前处理源代码,例如引入...
理解指针、引用以及智能指针(如auto_ptr,虽然在C++11中已弃用)的概念是防止内存泄漏的关键。 6. **预处理器宏**:预处理器宏是C++中的一个重要工具,但过度使用可能导致代码难以理解和维护。了解如何正确使用宏...
构造函数用于初始化新创建的对象,而析构函数则在对象生命周期结束时执行,通常用于清理资源。C++还支持拷贝构造函数和移动构造函数,分别处理对象复制和移动的情况。 **6. 静态成员与友元** 静态成员属于类本身,...
1. **内存布局**:C++对象在内存中的布局是由编译器决定的,包括对象的成员变量、虚函数表指针(如果存在)等。理解这一布局对于性能优化和低级内存操作至关重要。 2. **对象初始化与构造**:C++的对象可以有默认...
5. **使用内存分析工具**:例如MAT (Memory Analyzer Tool),可以帮助定位内存泄漏和分析对象生命周期。 6. **代码审查**:定期进行代码审查,查找可能引起内存浪费或过度使用内存的代码片段。 7. **设计和架构...
1. 构造函数与析构函数:构造函数用于初始化对象,析构函数则在对象生命周期结束时清理资源。 2. 成员函数:包括普通成员函数、静态成员函数和友元函数。普通成员函数操作对象的数据;静态成员函数不依赖于对象存在...
理解何时使用深拷贝和浅拷贝对避免内存泄漏和错误至关重要。 7. **运算符重载与友元**:运算符重载使我们能够自定义运算符的行为,增加代码的可读性。友元则允许非成员函数访问类的私有和保护成员,打破封装但能...
5. **结构体与联合体**:结构体允许将不同类型的数据组合在一起,而联合体则在同一内存空间中存储不同类型的变量,它们是C语言中实现数据结构的基础。 C++作为C语言的扩展,引入了面向对象编程(OOP)的概念,包括...
面向对象程序设计(Object-Oriented Programming,OOP)是现代软件开发中广泛采用的一种编程范式,C++作为其代表语言,具有丰富的特性和强大的功能。清华大学的面向对象程序设计C++课件,旨在帮助学生深入理解OOP...
智能指针则是C++11引入的,自动管理对象生命周期的工具,避免了内存泄漏问题。 通过这份复习资料,学习者不仅可以巩固C++的基础知识,还能深入理解面向对象编程的核心理念,并通过实践题目加深对这些概念的应用。...
9. **内存管理**:理解动态内存分配(new和delete操作符)和智能指针(如unique_ptr、shared_ptr等)的使用,能够避免内存泄漏,提高程序的稳定性。 10. **调试技巧**:学会使用IDE(集成开发环境)的调试功能,如...
在C语言中,算法和面试题是程序员必备...以上内容只是C++面试中的一部分重点,实际的面试可能会涉及到更深层次的技术细节和实际问题解决能力。通过深入学习和实践这些知识点,可以显著提高C++程序员在面试中的竞争力。
书中代码将展示如何正确地使用指针和内存管理,避免内存泄漏。 9. 标准模板库(STL):STL是C++标准库的一部分,包括容器(如vector、list、set)、迭代器、算法和函数对象等。通过实践,你可以学会如何有效地利用...
在VC(Visual C++)面试中,常常会遇到各种各样的技术问题,这些题目涵盖了C++语言基础、MFC(Microsoft Foundation Classes)、STL(Standard Template Library)、多线程编程、异常处理、内存管理等多个方面。...