`

Java的大内存分页支持

阅读更多

最近在研究java的性能调优,顺手写了一个小程序来测试性能问题。这个程序用来进行矩阵乘法运算,如下:

 

for (int i = 0; i < 2048; i++)
	for (int j = 0; j < 2048; j++)
		for (int k = 0; k < 2048; k++)
			res[i][j] += mul1[i][k] * mul2[k][j];

 

在ubuntu 10.04(64bit)下,JDK 1.6.0.20运行该程序共耗时76秒。分析下来,影响运行速度的因素主要有两个:cache miss  和 TLB miss.

 

这里主要讲TLB miss的问题,cache miss留待下回分解。由于,在默认情况下内存分页大小为4K, 而每次作乘法时,取值均跨至少8K(4*2048)的范围,而一级数据页表缓存(L1 DTLB)是非常小的,Intel Core 2架构下4KB小页表的条目只有16个。这意味着TLB miss的概率很高,最差情况下每次数据访问都将出现一次miss;而使用大内存分页(如,2M)后,大概每256次数据访问出现一次miss。实际情况确实反映了这一现象,使用大内存页后,同样的程序耗时大幅下降到45秒。

 

接下来介绍如何在Ubuntu 10.04(64bit) + JDK (Hotspot 1.6.0.20) 环境下启用大内存页,并指定jvm使用大内存页。这些步骤应该也可以应用到其他linux系统。(注,为完成下列步骤,用户需要有root权限)

 

1. 了解linux系统对大内存页的支持。

 

# grep Huge /proc/meminfo

 

HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB


说明,系统支持2M的大内存分页。

 

2. 修改内核参数,为large page预留内存

     a. 设置共享内存段最大值,最少要大于jvm使用的large page的内存。

          如需要设置大小为2G(1024*1024*1024*2=2147483648),则添加下行到文件 /etc/sysctl.conf

          kernel.shmmax=2147483648

     b. 设置需要预留多少大内存页。

          如需要为jvm预留1G的large page内存,则需要预留512页大内存页(512*2M=1G)

          添加下行到文件 /etc/sysctl.conf

          vm.nr_hugepages=512

 

3. 为你的进程添加访问large page共享内存段的权限

     添加新的用户组,并把自己加入到这个组。如,添加用户组 hugetlb,并把当前用户 kilik 添加到该组。

     添加下行到文件 /etc/sysctl.conf ,其中1001为用户组hugetlb的gid。

     vm.hugetlb_shm_group = 1001

 

4. 修改用户安全设置,允许进程锁定更大的内存段

     large page共享内存必须锁定到主存,不能swap到磁盘,因此需要修改用户的memlock设置。添加如下两行到文件 /etc/security/limits.conf。其中,1048576代表1G(1024*1024 K)

     kilik    hard    memlock    1048576
     kilik    soft    memlock    1048576

 

5. 重启OS以使上述设置生效。

 

6. 添加相关jvm运行参数,告诉jvm使用large page内存。

    不同的jvm有不同的参数设置来开启大内存页的支持,对Sun Hotspot而言,这个参数是 -XX:+UseLargePages。因此可以使用如下命令行来运行矩阵乘法程序。

    java -XX:+UseLargePages -Xmx512m -Xms512m -cp . org.kilik.perf.ClassicMatrixMulti

 

0
1
分享到:
评论

相关推荐

    Java Swing JTable分页

    然而,当数据量过大时,一次性加载所有数据不仅会消耗大量的内存资源,还会影响用户的操作体验。因此,实现`JTable`的分页功能就显得尤为重要。 #### 二、分页基础知识 分页是前端和后端交互过程中常用的一种技术...

    java实现的一个分页程序

    6. **内存分页**:除了在数据库层面进行分页,也可以选择在应用程序中实现内存分页,将数据加载到内存后进行处理。但这可能导致内存压力,尤其是当数据量大的时候。 7. **响应式分页**:随着Web开发的进化,响应式...

    java语言的分页查询功能(mysql和sql server)

    虽然本示例没有依赖特定的框架,但在实际开发中,Spring JDBC、MyBatis等框架提供了更便捷的分页支持。例如,MyBatis的`selectList`方法可以接受一个`RowBounds`对象,实现分页功能。 总结,Java中的分页查询涉及...

    JAVA大数据分页算法

    7. **内存分页**:在Java应用中,如果数据已经在内存中,可以使用ArrayList或LinkedList等集合类,结合索引进行分页。例如,维护一个总记录数和每页记录数,通过索引计算出当前页的起始位置和结束位置。 8. **...

    分页缓存

    为了支持缓存,我们需要额外传递一个标识,用于唯一标识特定的分页查询请求。 3. **缓存逻辑实现**:在分页查询方法中,我们首先尝试从缓存中获取对应标识的结果。如果缓存命中,直接返回缓存数据;如果未命中,...

    java分页代码完整版

    Spring Data JPA提供了一个强大的Repository接口,支持分页查询。示例如下: ```java Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "id")); Page&lt;Entity&gt; pageEntities = ...

    java分页大全 包括最强大的java分页类

    在Java编程领域,分页是数据管理中一个非常重要的概念,特别是在处理大量数据时,它能够有效地提高系统性能,减少一次性加载过多数据对内存的压力,同时提供更好的用户体验。本资源包"java分页大全"提供了多种Java...

    java通用分页代码实例.rar

    Java 分页技术是Java开发中常见的一种数据处理方式,尤其在大数据量的Web应用中,为了提高用户体验并减轻服务器压力,通常需要实现分页显示功能。这个"java通用分页代码实例"提供了一种适用于任意数据库的解决方案,...

    非常优秀的Java分页代码

    在Java编程中,分页是数据管理中一个重要的概念,特别是在处理大数据集合时,它可以有效地减少内存消耗,提高用户体验。本资源提供了一套非常优秀的Java分页代码,它旨在简化开发过程,使得开发者能够轻松地在应用...

    java小程序实现分页的功能

    这些框架提供了内置的分页支持。在Hibernate中,可以使用`Criteria`或`Query`对象配合`setFirstResult`和`setMaxResults`方法来实现分页。在MyBatis中,可以使用`&lt;select&gt;`标签的`limit`和`offset`属性。 4. **...

    java分页控件.rar

    综上所述,Java分页控件的实现涉及前端展示、后端逻辑以及数据库操作等多个层面,选择合适的工具和方法可以极大地提高开发效率和应用性能。在压缩包“java分页控件”中,可能包含了一些示例代码或教程,帮助开发者更...

    java分页工具类

    总之,Java分页工具类是Java开发中的重要组件,它通过合理地组织数据查询和处理,提供了便捷的分页解决方案,使得大规模数据的处理变得轻而易举。在实际应用中,我们可以根据项目需求对工具类进行适当的定制和优化,...

    java分页技术汇总

    Java 8引入了Stream API,虽然不直接支持分页,但可以通过流的`limit`和`skip`操作实现分页效果,尤其适用于内存中的数据分页。 10. **数据库原生分页**: 不同的数据库系统提供了原生的分页机制,如MySQL的`...

    java 分页demo

    为了更高效地处理分页,许多ORM(对象关系映射)框架如Hibernate、MyBatis提供了更高级的分页支持。以MyBatis为例,可以使用`&lt;select&gt;`标签中的`resultType`和`parameterType`定义查询方法,并在动态SQL中添加`limit...

    java分页实现大全

    7. **内存分页**: - 当数据库不支持分页或性能要求较高时,可先加载所有数据到内存,然后在应用层面进行分页处理。但这对内存资源消耗较大,适用于数据量较小的情况。 8. **分页的最佳实践**: - 避免使用OFFSET...

    java分页插件,简单实用

    通过分页,我们可以限制每次请求的数据量,避免一次性加载所有记录,从而降低内存消耗和提高页面加载速度。Java分页插件就是为此目的设计的,它通常与ORM框架(如Hibernate或MyBatis)集成,提供便捷的分页API,使...

    java分页代码大家分享

    在Java编程中,分页是数据管理中一个重要的概念,特别是在处理大数据集时,它可以提高应用性能并优化用户体验。分页允许用户逐步加载和查看大量数据,而不是一次性加载所有数据,这有助于降低服务器负载和内存消耗。...

    java分页技术

    分页技术可以帮助用户逐页浏览信息,避免一次性加载过多数据导致页面响应变慢或者内存压力过大。在这里,我们将深入探讨Java中的分页原理、实现方法以及相关的最佳实践。 首先,了解分页的基本概念。分页通常涉及到...

    最好用的分页代码(java版)

    这种方式适用于大数据量,能有效减少内存占用和数据库压力。 在页面上,可以通过`showList`获取当前页的数据,通过`pageNavigation`获取导航条。导航条通常会包含“上一页”、“下一页”和页码链接,用户点击这些...

    java jdbc 分页

    Java JDBC分页是一种在Java应用程序中实现数据库查询结果分页显示的技术。JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如连接数据库、发送SQL语句以及...

Global site tag (gtag.js) - Google Analytics