`
kabike
  • 浏览: 599636 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

java的内存counter

 
阅读更多
假设需要在内存中维护一个计数器,在storm tuple来时更新计数器的值,最终统一提交到数据库
可以用commons-collection中的Bag或者MultiValueMap,不过效率不高.
用java的Map放Integer主要问题在于Integer是不可变类,每次需要构造新的对象,开销比较大,因此尝试了common-lang中的MutableInt和java.util中的AtomicInteger,这俩的效率不相上下.
不过最快的方式是在Map中放int数组...不过优势也不是特别明显




		int size = 10000000;

		// 1
		long start = System.currentTimeMillis();

		Bag bag = BagUtils.typedBag(new HashBag(), String.class);
		for (int i = 0; i < size; i++) {
			bag.add("" + (i % 100), 1);
		}
		System.out.println(bag.getCount("5"));
		System.out.println(System.currentTimeMillis() - start);

		// 2
		start = System.currentTimeMillis();

		MultiValueMap map = new MultiValueMap();
		for (int i = 0; i < size; i++) {
			map.put("" + (i % 100), 1);
		}
		int total = 0;
		Collection<Integer> co = (Collection<Integer>) map.get("5");
		for (Integer i : co) {
			total += i;
		}
		System.out.println(total);
		System.out.println(System.currentTimeMillis() - start);

		// 3
		start = System.currentTimeMillis();

		Map<String, AtomicInteger> map3 = new HashMap<>();
		for (int i = 0; i < size; i++) {
			String key = "" + (i % 100);
			AtomicInteger value = map3.get(key);
			if (value == null) {
				map3.put(key, new AtomicInteger(1));
			} else {
				value.addAndGet(1);
			}
		}
		System.out.println(map3.get("5"));
		System.out.println(System.currentTimeMillis() - start);

		// 4
		start = System.currentTimeMillis();

		Map<String, MutableInt> map4 = new HashMap<>();
		for (int i = 0; i < size; i++) {
			String key = "" + (i % 100);
			MutableInt value = map4.get(key);
			if (value == null) {
				map4.put(key, new MutableInt(1));
			} else {
				value.add(1);
			}
		}
		System.out.println(map4.get("5"));
		System.out.println(System.currentTimeMillis() - start);

		// 5
		start = System.currentTimeMillis();

		Map<String, Integer> map5 = new HashMap<>();
		for (int i = 0; i < size; i++) {
			String key = "" + (i % 100);
			Integer value = map5.get(key);
			if (value == null) {
				map5.put(key, new Integer(1));
			} else {
				map5.put(key, value + 1);
			}
		}
		System.out.println(map5.get("5"));
		System.out.println(System.currentTimeMillis() - start);

		// 6
		start = System.currentTimeMillis();

		Map<String, int[]> map6 = new HashMap<>();
		for (int i = 0; i < size; i++) {
			String key = "" + (i % 100);
			int[] value = map6.get(key);
			if (value == null) {
				map6.put(key, new int[] { 1 });
			} else {
				value[0] += 1;
			}
		}
		System.out.println(map6.get("5")[0]);
		System.out.println(System.currentTimeMillis() - start);

	
	
分享到:
评论

相关推荐

    Java虚拟机 JVM 内存结构介绍

    描述Java虚拟机规范中关于内存管理的部分 主要介绍Runtime Data Area,包括Java Stack,Native Method Stack, Program Counter Register,Method Area以及Heap 还简要介绍了Runtime Data Area周边的模块,包括Class...

    Java内存区域与内存溢出

     Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细...

    Java开发技术大全(500个源代码).

    HelloWorldApp.java 第一个用Java开发的应用程序。 firstApplet.java 第一个用Java开发的Applet小程序。 firstApplet.htm 用来装载Applet的网页文件 第2章 示例描述:本章介绍开发Java的基础语法知识。 ...

    Java 内存区域与内存溢出

     Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器,Java虚拟机栈,本地方法栈,Java堆,方法区。下面详细...

    IBM Java Garbage Collector Analysis

    IBM的java 内存回收分析工具,用于分析gc日志

    与我一起学 JVM:Java 虚拟机内存组成概况

    与我一起学 JVM:Java 虚拟机内存组成概念前言Java 虚拟机内存划分运行时数据区域程序计数器Java 虚拟机栈局部变量表本地方法栈Java 堆方法区运行时常量池直接内存 前言 刚开始看《深入理解Java虚拟机》,文章主要就...

    Java虚拟机的内存区域划分

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分成很多个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而...

    java内存区域

    在Java运行时的数据区里,由JVM管理的内存区域分为下图几个模块:1,程序计数器(Program Counter Register):程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,可以理解为是当前...

    Java 虚拟机面试题全面解析(干货)

    什么是Java内存模型? Java内存模型的目标? 主内存与工作内存 内存间的交互操作 原子性、可见性、有序性 volatile 什么是 volatile? 为什么基于 volatile变量的运算在并发下不一定是安全的? 为什么使用 volatile? ...

    编译器用Java编写程序

    else if(e2.getSource()==b3)//MC为清除内存 { m=0d; tf2.setText(""); str.setLength(0); } else if(e2.getSource()==b4)//MR为重新调用存储的数据 { if(tf2.getText().trim()!="")//有记忆数字 { tf1....

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【JVM】Java内存模型 44 【JVM】jvm内存模型 45 主内存与工作内存 45 内存间交互操作 46 重排序 48 【JVM】内存泄漏 49 【JVM】java虚拟机的区域如何划分,每一个区的动能? 49 程序计数器(Program Counter ...

    超硬核!!!一篇文章搞定整个JVM运行时数据区

    JVM运行时数据区1 JVM运行时数据区2 解析JVM运行时数据区2.1 方法区(Method Area)2.2 Java堆(Java Heap)2.3 程序计数器(Program Counter Register)2.4 Java虚拟机栈(Java Virtual Machine Stacks)2.5 本地...

    一篇文章掌握整个JVM,JVM超详细解析!!!

    JVM先想想一些问题1 我们开发人员编写的Java代码是怎么让电脑认识的2 为...Counter Register)2.4 Java虚拟机栈(Java Virtual Machine Stacks)2.5 本地方法栈(Native Method Stack)3 Java内存结构3.1 直接内存...

    java8rt.jar源码-jvm:jvm入门jvm面试题

    Counter Register(程序计数器)、JAVA Method Stack(JAVA方法栈)、Native Method Stack(本地方法栈)。 3、类加载器 对象实例化过程 类加载器类别 BootstrapClassLoader(启动类加载器) c++编写,加载java核心库 java...

    JVM内存区域划分.docx

    程序计数器(Program Counter Register),也有称作为 PC 寄存器。保存的是程序当 前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当 CPU 需要 执行指令时,需要从程序计数器中得到当前需要执行的...

    Tomcat源码研究

    -- 虚拟目录 --&gt; &lt;Context path="/count" docBase="d:/counter.java2000. ...

    黑马JVM学习笔记二

    title: 黑马JVM学习笔记二 date: 2020-01-13 1:00:00 tags: JVM categories: JVM 黑马jvm 内存结构 内存结构总览图: ...程序计数器是Java虚拟机规范中唯一一个不会存在内存溢出的区(堆和栈等会出现内存溢

    appengine-forkjoincounter:基于 Brett Slatkin 的 Google IO 2010 视频的 appengine Fork join counter 可在 https 上找到

    基于 Brett Slatkin 的 Google IO 2010 视频的 appengine Fork join counter 位于 现在,计数器似乎要么计数过多,要么计数不足。 我试图稳定它的最后一件事是在内存缓存中添加计数器的运行总数,这有点帮助,但我...

    monitoring-demo:具有用于度量,日志和分布式跟踪的工具的Spring Boot示例项目

    通过 Micrometer 的自定义指标示例:名为exampleData_created_total Counter类型的自定义仪表 通过Logstash Logback编码器进行结构化日志记录 通过 Loki 的 Promtail 代理进行日志管理 监控和记录Grafana的仪表板 ...

Global site tag (gtag.js) - Google Analytics