`
twinkleliang
  • 浏览: 31528 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中HashMap结构自身占用的内存和Runtime类的freeMemory()等几个方法

阅读更多
转自:http://hi.baidu.com/calls911/blog/item/c0ed39da95379f3f33fa1c98.html

1、HashMap结构自身占用的内存
通过如下手段测试HashMap结构自身在存放一百万个键值对时占用的内存大小:

HashMap hm1 = new HashMap<Integer, Integer>;
for (int i = 0; i < 1000000; ++i){
hm1.put(i, i);
}

这样是存了1百万个双int,2个int是8个字节,所以int本身占用了1百万*8个字节即8M。

通过java.lang.Runtime类中的freeMemory()方法来进行测试,输出freeMemory前,调用一次System.gc(),得出结论是百万键值对的HashMap占用64M空间。

2、Runtime类的freeMemory()等几个方法(转载)

freeMemory(),totalMemory(),maxMemory()这三个方法反映的都是java这个进程的内存情况,跟操作系统的内存根本没有关系。

  A.maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。
  B.totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。
  C.freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可能会有些大。

示例代码:

把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。
package test;

public class TestStr {
public static void main(String[] args) {
   System.out.println(Runtime.getRuntime().freeMemory());
   System.out.println(Runtime.getRuntime().totalMemory());
   System.out.println(Runtime.getRuntime().maxMemory());
   long t = System.currentTimeMillis();
   try {
    Thread.sleep(30000);
   } catch (Exception ee) {
    ee.printStackTrace();
   }
   String[] aaa = new String[2000000];
   System.out.println(Runtime.getRuntime().freeMemory());
   System.out.println(Runtime.getRuntime().totalMemory());
   System.out.println(Runtime.getRuntime().maxMemory());
   try {
    Thread.sleep(30000);
   } catch (Exception ee) {
    ee.printStackTrace();
   }
   for (int i = 0; i < 2000000; i++) {
    aaa[i] = new String("aaa");
   }
   System.out.println(Runtime.getRuntime().freeMemory());
   System.out.println(Runtime.getRuntime().totalMemory());
   System.out.println(Runtime.getRuntime().maxMemory());
   try {
    Thread.sleep(30000);
   } catch (Exception ee) {
    ee.printStackTrace();
   }
}
}
分享到:
评论

相关推荐

    Java中HashMap的工作机制

    在Java中,所有的对象都继承自Object类,而Object类中提供了一个默认的hashCode()方法,该方法通常基于对象的内存地址来计算哈希码。为了确保两个相等的对象在哈希表中可以被正确地映射到相同的“桶”(bucket)里,...

    Java SE程序 HashMap类

    Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序 HashMap类Java SE程序...

    Java HashMap类详解

    Java HashMap 类详解 本资源详细介绍了 Java 中的 HashMap 类...本资源详细介绍了 Java 中的 HashMap 类,包括其实现机制、Hash 存储机制、集合存储机制等方面的知识点,为大家提供了一个详细的 Java HashMap 类详解。

    java中HashMap详解.pdf

    Java中的HashMap是一种基于散列机制的Map接口的实现,它允许我们存储键值对。键是唯一的,而值可以重复。HashMap在处理数据时非常高效,因为其操作的时间复杂度接近于O(1)。这是通过使用散列函数将键映射到相应的...

    java HashMap原理分析

    Java HashMap是一种基于哈希表的数据结构,它的存储原理是通过将Key-Value对存储在一个数组中,每个数组元素是一个链表,链表中的每个元素是一个Entry对象,Entry对象包含了Key、Value和指向下一个Entry对象的引用。...

    Java中HashMap详解(通俗易懂).doc

    Java中的HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的高效存储和访问。HashMap基于哈希表(也称为散列表)原理工作,它允许用户通过键(Key)快速查找对应的值(Value)。在HashMap中,键和值...

    js 版 java hashmap

    在描述中提到的"js版java HashMap"可能是指一个JavaScript实现的HashMap类,它模仿了Java中的HashMap数据结构,提供了更高效和灵活的操作。Java的HashMap是一个基于哈希表的Map接口实现,提供快速的插入、删除和查找...

    自定义map实现java的hashmap

    在Java编程中,HashMap是一个非常重要的数据结构,它实现了Map接口,提供了键值对的存储功能,具有快速存取和高效查找的特点。HashMap基于哈希表(也称为散列表)原理,通过键对象的哈希码来定位元素,进而实现O(1)...

    java中HashMap,LinkedHashMap,TreeMap,HashTable的区别

    ### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...

    浅谈Java中HashMap类的使用.pdf

    HashMap 是 Java 语言中最常用的集合类之一,它实现了 Map 接口,提供了 put、get、keySet 等常用方法来存储和检索数据。本文将详细介绍 HashMap 类的使用,包括其常用方法、特点和应用场景。 一、HashMap 的基本...

    java中HashMap详解

    HashMap是Java编程语言中一种非常...总的来说,HashMap是Java中高效的键值对存储结构,但需要注意其线程安全性和哈希冲突可能导致的性能影响。在实际使用中,应根据需求选择合适的数据结构和哈希函数,以确保最佳性能。

    基于共享内存的hashmap

    标题中的“基于共享内存的HashMap”指的是在多进程或多线程环境中,使用共享内存作为存储机制的哈希映射数据结构。哈希映射(HashMap)是一种常用的数据结构,它通过键值对(key-value pairs)的方式快速存取数据,...

    基于HashMap的用户标签处理兼Java中HashMap实现原理研究.pdf

    "基于HashMap的用户标签处理兼Java中HashMap实现原理研究" 本文研究了基于HashMap的用户...本文研究了基于HashMap的用户标签处理方法,并对Java中HashMap的实现原理进行了深入研究,为读者提供了一个高效的解决方案。

    Java-HashMap.rar_hashmap_java hashmap

    在Java编程语言中,`HashMap`是`java.util`包中的一个核心类,它属于集合框架的一部分,主要用于存储键值对的数据结构。`HashMap`基于哈希表(散列表)实现,提供了快速的插入、删除和查找操作,平均时间复杂度为O(1...

    HashMap的数据结构

    HashMap是Java编程语言中一个非常重要的数据结构,它属于集合框架的一部分,主要用于存储键值对(Key-Value)数据。HashMap在内部实现上基于哈希表,也称为散列表,它提供了一种快速查找、插入和删除数据的方法,...

    从 Java 代码到 Java 堆 理解和优化您的应用程序的内存使用

    - **操作系统视角**:Java进程是操作系统中的一个实体,它有自己的地址空间,包括操作系统内核占用的部分以及用户空间。对于32位系统,用户空间通常限制在4GB,而在64位系统中,这个限制显著增加。 - **Java堆与本...

    Java集合专题总结:HashMap 和 HashTable 源码学习和面试总结

    Java集合专题总结:HashMap和HashTable源码...本文总结了HashMap和HashTable的源码学习和面试总结,涵盖了它们的存储结构、构造方法、get和put方法的源码分析、Hash表的特点和缺点、HashTable和HashMap的区别等内容。

    Java中用hashmap实现购物车

    Java语言使用hashmap实现向购物车添加删除修改商品,显示商品信息

Global site tag (gtag.js) - Google Analytics