最近在研究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
分享到:
相关推荐
然而,当数据量过大时,一次性加载所有数据不仅会消耗大量的内存资源,还会影响用户的操作体验。因此,实现`JTable`的分页功能就显得尤为重要。 #### 二、分页基础知识 分页是前端和后端交互过程中常用的一种技术...
6. **内存分页**:除了在数据库层面进行分页,也可以选择在应用程序中实现内存分页,将数据加载到内存后进行处理。但这可能导致内存压力,尤其是当数据量大的时候。 7. **响应式分页**:随着Web开发的进化,响应式...
虽然本示例没有依赖特定的框架,但在实际开发中,Spring JDBC、MyBatis等框架提供了更便捷的分页支持。例如,MyBatis的`selectList`方法可以接受一个`RowBounds`对象,实现分页功能。 总结,Java中的分页查询涉及...
7. **内存分页**:在Java应用中,如果数据已经在内存中,可以使用ArrayList或LinkedList等集合类,结合索引进行分页。例如,维护一个总记录数和每页记录数,通过索引计算出当前页的起始位置和结束位置。 8. **...
为了支持缓存,我们需要额外传递一个标识,用于唯一标识特定的分页查询请求。 3. **缓存逻辑实现**:在分页查询方法中,我们首先尝试从缓存中获取对应标识的结果。如果缓存命中,直接返回缓存数据;如果未命中,...
Spring Data JPA提供了一个强大的Repository接口,支持分页查询。示例如下: ```java Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "id")); Page<Entity> pageEntities = ...
在Java编程领域,分页是数据管理中一个非常重要的概念,特别是在处理大量数据时,它能够有效地提高系统性能,减少一次性加载过多数据对内存的压力,同时提供更好的用户体验。本资源包"java分页大全"提供了多种Java...
Java 分页技术是Java开发中常见的一种数据处理方式,尤其在大数据量的Web应用中,为了提高用户体验并减轻服务器压力,通常需要实现分页显示功能。这个"java通用分页代码实例"提供了一种适用于任意数据库的解决方案,...
在Java编程中,分页是数据管理中一个重要的概念,特别是在处理大数据集合时,它可以有效地减少内存消耗,提高用户体验。本资源提供了一套非常优秀的Java分页代码,它旨在简化开发过程,使得开发者能够轻松地在应用...
这些框架提供了内置的分页支持。在Hibernate中,可以使用`Criteria`或`Query`对象配合`setFirstResult`和`setMaxResults`方法来实现分页。在MyBatis中,可以使用`<select>`标签的`limit`和`offset`属性。 4. **...
综上所述,Java分页控件的实现涉及前端展示、后端逻辑以及数据库操作等多个层面,选择合适的工具和方法可以极大地提高开发效率和应用性能。在压缩包“java分页控件”中,可能包含了一些示例代码或教程,帮助开发者更...
总之,Java分页工具类是Java开发中的重要组件,它通过合理地组织数据查询和处理,提供了便捷的分页解决方案,使得大规模数据的处理变得轻而易举。在实际应用中,我们可以根据项目需求对工具类进行适当的定制和优化,...
Java 8引入了Stream API,虽然不直接支持分页,但可以通过流的`limit`和`skip`操作实现分页效果,尤其适用于内存中的数据分页。 10. **数据库原生分页**: 不同的数据库系统提供了原生的分页机制,如MySQL的`...
为了更高效地处理分页,许多ORM(对象关系映射)框架如Hibernate、MyBatis提供了更高级的分页支持。以MyBatis为例,可以使用`<select>`标签中的`resultType`和`parameterType`定义查询方法,并在动态SQL中添加`limit...
7. **内存分页**: - 当数据库不支持分页或性能要求较高时,可先加载所有数据到内存,然后在应用层面进行分页处理。但这对内存资源消耗较大,适用于数据量较小的情况。 8. **分页的最佳实践**: - 避免使用OFFSET...
通过分页,我们可以限制每次请求的数据量,避免一次性加载所有记录,从而降低内存消耗和提高页面加载速度。Java分页插件就是为此目的设计的,它通常与ORM框架(如Hibernate或MyBatis)集成,提供便捷的分页API,使...
在Java编程中,分页是数据管理中一个重要的概念,特别是在处理大数据集时,它可以提高应用性能并优化用户体验。分页允许用户逐步加载和查看大量数据,而不是一次性加载所有数据,这有助于降低服务器负载和内存消耗。...
分页技术可以帮助用户逐页浏览信息,避免一次性加载过多数据导致页面响应变慢或者内存压力过大。在这里,我们将深入探讨Java中的分页原理、实现方法以及相关的最佳实践。 首先,了解分页的基本概念。分页通常涉及到...
这种方式适用于大数据量,能有效减少内存占用和数据库压力。 在页面上,可以通过`showList`获取当前页的数据,通过`pageNavigation`获取导航条。导航条通常会包含“上一页”、“下一页”和页码链接,用户点击这些...
Java JDBC分页是一种在Java应用程序中实现数据库查询结果分页显示的技术。JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了诸如连接数据库、发送SQL语句以及...