`
dowhathowtodo
  • 浏览: 780951 次
文章分类
社区版块
存档分类
最新评论

java中HashMap结构以及内存相关

 
阅读更多
转自: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();
}
}
}
分享到:
评论

相关推荐

    用hashmap实现词典查询

    用hashmap结构将字典文件中的词条装入内存,并基于该结构进行查询

    HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    1、此HashMap类采用java jdk中HashMap的实现方式。2、相比网站上发布过的hashtable之类的源码:。此HashMap寻址方法是拉链法.比开放寻址法对连续内存要求更低。哈希函数用的是java中String.hashCode()算法(经实际验证...

    java7hashmap源码-java-note:笔记

    hashmap源码 java-notes 算法 数据结构 设计模式 基础 集合 ConcurrentHashMap IO 并发 [Java 并发]( 并发.md) AQS 源码 JVM web 基础 [NGINX 简介](./docs/nginx/NGINX 简介.md) 框架 Spring [观察 Spring bean ...

    尚硅谷-深入java8的集合3:HashMap的实现原理.pdf

    ·全程内容涵盖数据结构、设计模式、JVM内存结构等深度技术 ·企业级笔试面试题目深入源码级讲解,拒绝死记硬背 4.代码量更大、案例更丰富、更贴近实战: ·Java语言基础阶段:12720行代码,Java语言高级阶段:...

    java7hashmap源码-AndroidOffer:只为帮助您获得更好的报价

    java7 hashmap源码 AndroidOffer Java Java 进阶 HashMap 对比:Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap、TreeMap (看第六条就可以) HashMap 用什么数据结构实现的 加载因子是什么 HashMap 初始化...

    Java后端面试问题整理.docx

    • 熟悉Java多线程并发中线程基本方法,线程池,线程生命周期,熟悉Java锁中常见锁分类(乐观/悲观锁、自旋锁、独/共享锁、可重入锁、公平/非公平锁、分段锁、偏向锁,轻/重量级锁)和基本的锁升级策略

    java7hashmap源码-java-concurrency-programming:java并发编程入门

    hashmap源码 java并发编程入门 基本概念 并发: 同时拥有俩个或者多个线程,如果线程在单核处理器上运行,多个线程将交替的换入或者换出内存,这些线程是同时 "存在" 的,每个线程都处于执行过程中的某个状态,如果...

    JAVA中哈希表HashMap的深入学习

    主要介绍了哈希表HashMap的深入学习,哈希表是一种非常重要的数据结构,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,本文会对java集合框架中HashMap的实现原理进行讲解。感兴趣的话可以...

    易语言-HashMap模块源码—— 高效随机存取数据结构 ,文本索引必备

    1、此HashMap类采用java jdk中HashMap的实现方式 2、相比网站上发布过的hashtable之类的源码: 此HashMap寻址方法是拉链法.比开放寻址法对连续内存要求更低 哈希函数用的是java中String.hashCode()算法(经实际验证其...

    【大厂面试题总结】JavaSE面试题总结详细教程

    【大厂面试题总结】JavaSE面试题总结详细教程: 目录: 递归算法之输出某个目录...JAVA的内存结构 java队列 Java基础思考之数据传递 JAVA内存泄漏详解 java序列化方式 java中实现多态的机制 string常量池和intern韩雅茹

    java7hashmap源码-UPUP:UPUP

    Session(会话)是在服务端保存的一种数据结构,用来标记用户、跟踪用户的状态,这个数据可以保存在集群,数据库,文件中。 Cookie(小甜点:记录账号,给用户甜头)是客户端保存用户信息的一种机制,用来记录用户的一些...

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释

    【大厂面试题总结】JavaSE面试题合集及其答案,基本包括javaSE所有知识点和详细解释 ...JAVA的内存结构 java队列 Java基础思考之数据传递 JAVA内存泄漏详解 java序列化方式 java中实现多态的机制 string常量池和intern

    JAVA面试题最全集

    方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...

    java jdk实列宝典 光盘源代码

    java为数据结构中的映射定义一个接口java.util.Map,有四个实现类HashMap Hashtable LinkedHashMap TreeMap用法和区别;对Map排序; 5字符串 使用String;判断一个字符串是否是合法的java标识符;使用StringBuffer;...

    java面试宝典

    31、java 中会存在内存泄漏吗,请简单描述。 11 32、abstract 的method 是否可同时是static,是否可同时是native,是否可同时是synchronized? 11 33、静态变量和实例变量的区别? 11 34、是否可以从一个static 方法...

    一文让你彻底理解JavaHashMap和ConcurrentHashMap

    Map这样的KeyValue在软件开发中是非常经典的结构,常用于在内存中存放数据。本篇主要想讨论ConcurrentHashMap这样一个并发容器,在正式开始之前我觉得有必要谈谈HashMap,没有它就不会有后面的ConcurrentHashMap。...

    JavaSE基础面试题.docx

    11.Java中的内存模型 12.JVM如何调整内存大小 13.如何实现Java优化 14.各个集合在项目中的应用场景 15.对ArrayList扩容的理解 16.使用LinkedList删除元素的步骤 17.HashMap、Hashtable、ConcurrentHashMap底层实现...

    tinymap:内存有效的不可变HashMapHashSet

    该实现以及积极的对象重用策略(在此也提供)可以导致半结构化哈希映射的内存使用率极低。 这对于表示小的不可变事件非常有用。 TinyMap的主要优点是它不仅可以重用键和值,而且还可以重用整个地图,键集和列表。 ...

    java 面试题 总结

    JAVA相关基础知识 1、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

Global site tag (gtag.js) - Google Analytics