`
kabike
  • 浏览: 606026 次
  • 性别: 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内存机制及异常处理

    Java内存机制是Java虚拟机(JVM)的关键组成部分,它管理着程序运行时的数据存储。在Java中,内存主要分为以下几个区域: 1. **Heap(堆)**:这是Java中最主要的内存区域,用于存储所有的类实例和数组。当堆空间...

    java-counter.rar_JAVA counter

    Java的语法与C++类似,但更简化,同时提供了自动内存管理,使得开发者可以专注于解决问题,而不是内存管理。 在Java中创建一个计算器涉及到几个核心概念: 1. **基本数据类型**:Java有八种基本数据类型,包括整型...

    java内存模型详解--非常经典

    Java内存模型将内存划分为几个区域,主要包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)、本地方法栈(Native Method Stack)和虚拟机栈(Java Virtual Machine ...

    Java内存模型分析与其在编程中的应用.pdf

    Java内存模型是Java平台的核心概念之一,它定义了Java程序中各种变量的访问规则以及如何在运行时分配内存区域给对象。Java内存模型的深入分析对于编写高性能的Java应用程序至关重要,本文将详细探讨Java内存模型的...

    Java内存结构.pdf

    Java内存模型主要分为以下几个部分:堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)以及本地方法栈(Native Method Stack)。本文将重点介绍其中的堆、栈、方法区以及...

    Java 内存模型

    Java内存模型(Java Memory Model,JMM)是Java平台中的一种规范,它定义了线程如何访问和修改共享变量,以及在多线程环境中如何保证数据一致性。JMM的主要目标是解决多线程环境下的可见性、有序性和原子性问题。 ...

    java内存对象分配过程研究

    ### Java内存对象分配过程研究 #### 一、引言 Java作为一门强大的面向对象编程语言,在实际开发过程中,对象的创建及其内存管理是至关重要的环节。深入理解对象在内存中的分配过程不仅能够帮助开发者设计出更为...

    Java内存图

    ### Java内存图解析 #### 一、概述 Java内存模型主要分为几个部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。这些区域各自承担着不同的责任,共同支撑起了Java程序的运行环境。下面将详细解释各个...

    java内存泄露定位与分析[整理].pdf

    Java内存主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。其中,堆内存是Java对象的主要存储区域,容易出现内存泄露。 3. *...

    Java内存模型描述及变量运用分析.pdf

    Java内存模型是Java程序运行的基础,它规定了Java中数据在内存中的存储和访问规则。在Java内存模型中,堆内存和栈内存是两个核心概念。堆内存主要存放对象的实例,所有通过new创建的对象都会在堆内存中分配空间。而...

    经典之谈——Java内存分配

    首先,Java内存分为几个主要区域,分别是:程序计数器(Program Counter Register)、虚拟机栈(JVM Stack)、本地方法栈(Native Method Stack)、堆(Heap)和方法区(Method Area),在Java 8及以后版本中,方法...

    java程序自我监视内存使用

    Java内存模型主要分为堆内存(Heap)、栈内存(Stack)、方法区(Method Area)、程序计数器(Program Counter Register)和本地方法栈(Native Method Stack)。其中,堆内存存储对象实例,栈内存保存基本类型和...

    ibm查看Java内存工具.zip

    Java内存主要分为堆内存(Heap)、方法区(Method Area)、栈内存(Stack)、本地方法栈(Native Method Stack)和程序计数器(Program Counter Register)。堆内存用于存储对象实例,方法区存储类信息,栈内存处理...

    深入理解Java 虚拟机内存模型.rar

    Java虚拟机(JVM)内存模型是Java编程语言的核心组成部分,它定义了程序运行时的数据区域和内存管理方式。深入理解这一模型对于优化Java应用程序性能、避免内存泄漏以及理解线程安全至关重要。以下是对Java虚拟机...

    java获得jvm内存大小

    在Java编程语言中,了解和控制JVM(Java虚拟机)的内存管理是至关重要的,尤其是在性能调优、资源管理和避免内存泄漏等方面。本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并...

    深入Java内存模型:揭秘并发编程的基石

    # 深入Java内存模型:揭秘并发编程的基石 Java作为一款被广泛采用的编程语言,自1995年由Sun Microsystems(现为Oracle的一部分)首次推出以来,一直在不断发展和完善。Java的设计理念包含了诸如跨平台性、面向对象...

    Java内存溢出问题

    Java内存模型分为堆内存(Heap)和栈内存(Stack),还有方法区(Method Area)、本地方法栈(Native Method Stack)以及程序计数器(Program Counter Register)。内存溢出主要涉及堆和栈,以及方法区。 1. 堆内存...

    【深入Java虚拟机】Java内存模型探讨一.pdf

    Java内存模型,简称JVM内存模型,是Java虚拟机(JVM)运行时的核心组成部分,它定义了如何在多线程环境下共享数据以及确保数据一致性。深入理解Java内存模型对于优化程序性能、避免并发问题至关重要。 首先,让我们...

    Java内存的详细描述

    ### Java内存的深入解析 #### 一、Java内存模型(JMM) Java内存模型(Java Memory Model,简称JMM)是Java虚拟机规范的一部分,它定义了程序中的各种变量(线程共享变量)的访问规则,以及在并发环境中变量的存储...

Global site tag (gtag.js) - Google Analytics