JMAP

API 分页设计与实现探讨

我的梦境 提交于 2021-01-26 07:10:07
对于设计和实现 API 来说,当结果集包含成千上万条记录时,返回一个查询的所有结果可能是一个挑战,它给服务器、客户端和网络带来了不必要的压力,于是就有了分页的功能。 通常我们通过一个 offset 偏移量或者页码来进行分页,然后通过 API 实现类似请求: GET /api/products?page= 10 { "items" : [.. .100 products]} 如果要继续访问后续数据,则修改分页参数即可。 GET /api/products?page= 11 { "items" : [...another 100 products]} 在使用 offset 的情况下,通常使用 ?offset=1000 和 ?offset=1100 这种大家都熟悉的方法。它要么直接调用 OFFSET 1000 LIMIT 100 的 SQL 查询数据库,要么使用 LIMIT 乘以 page 作为查询参数。无论如何, 这是一个次优的解决方案 ,因为无论哪种数据库都要跳过前面 offset 指定的 1000 行。而跳过额外的offset,不管是 PostgreSQL,ElasticSearch还是 MongoDB 都存在额外开销,数据库需要对它们进行排序,计数,然后将前面不用的数据扔掉。 粉丝福利: 手撸了 50 个 Java 项目实战后,我超神了! 这是一种低效的方法,但由于它使用简单

API 分页探讨:offset 来分页真的有效率?

浪尽此生 提交于 2021-01-25 13:46:55
对于设计和实现 API 来说,当结果集包含成千上万条记录时,返回一个查询的所有结果可能是一个挑战,它给服务器、客户端和网络带来了不必要的压力,于是就有了分页的功能。 通常我们通过一个 offset 偏移量或者页码来进行分页,然后通过 API 实现类似请求: GET /api/products? page =10 { "items" : [ .. .100 products]} 如果要继续访问后续数据,则修改分页参数即可。 GET /api/products? page =11 { "items" : [ .. .another 100 products]} 在使用 offset 的情况下,通常使用 ?offset=1000 和 ?offset=1100 这种大家都熟悉的方法。它要么直接调用 OFFSET 1000 LIMIT 100 的 SQL 查询数据库,要么使用 LIMIT 乘以 page 作为查询参数。 无论如何, 「这是一个次优的解决方案」 ,因为无论哪种数据库都要跳过前面 offset 指定的 1000 行。而跳过额外的offset,不管是 PostgreSQL,ElasticSearch还是 MongoDB 都存在额外开销,数据库需要对它们进行排序,计数,然后将前面不用的数据扔掉。 这是一种低效的方法,但由于它使用简单,所以大家重复地用这个方法,也就是直接把 API

What is the meaning of “From Space” and “To Space” shown in jmap?

筅森魡賤 提交于 2021-01-18 05:17:04
问题 I understand the difference between new gen / old gen /perm gen, but I don't know what "To Space" and "From Space" are. I am seeing my "From Space" hitting 99.8% used while the "To Space" always seems to stay at 0% used. 回答1: Two regions in the garbage-collection algorithm that is used in the VM. Java specifics are found here: How Garbage Collection works in Java And a general explanation about "from space" and "to space": WP The most straightforward approach is the semi-space collector,

What is the meaning of “From Space” and “To Space” shown in jmap?

半城伤御伤魂 提交于 2021-01-18 05:15:35
问题 I understand the difference between new gen / old gen /perm gen, but I don't know what "To Space" and "From Space" are. I am seeing my "From Space" hitting 99.8% used while the "To Space" always seems to stay at 0% used. 回答1: Two regions in the garbage-collection algorithm that is used in the VM. Java specifics are found here: How Garbage Collection works in Java And a general explanation about "from space" and "to space": WP The most straightforward approach is the semi-space collector,

每日一面

做~自己de王妃 提交于 2021-01-17 10:00:33
定时进入 SafePoint :每经过-XX:GuaranteedSafepointInterval 配置的时间,都会让所有线程进入 Safepoint,一旦所有线程都进入,立刻从 Safepoint 恢复。这个定时主要是为了一些没必要立刻 Stop the world 的任务执行,可以设置-XX:GuaranteedSafepointInterval=0关闭这个定时,我推荐是关闭。 由于 jstack,jmap 和 jstat 等命令,也就是 Signal Dispatcher 线程要处理的大部分命令 ,都会导致 Stop the world:这种命令都需要采集堆栈信息,所以需要所有线程进入 Safepoint 并暂停。 偏向锁取消 (这个不一定会引发整体的 Stop the world,参考JEP 312: Thread-Local Handshakes):Java 认为,锁大部分情况是没有竞争的(某个同步块大多数情况都不会出现多线程同时竞争锁),所以可以通过偏向来提高性能。即在无竞争时,之前获得锁的线程再次获得锁时,会判断是否偏向锁指向我,那么该线程将不用再次获得锁,直接就可以进入同步块。但是高并发的情况下,偏向锁会经常失效,导致需要取消偏向锁,取消偏向锁的时候,需要 Stop the world,因为要获取每个线程使用锁的状态以及运行状态。 Java Instrument

JVM故障诊断和处理工具

旧街凉风 提交于 2021-01-14 20:15:20
本文已被Github仓库收录 https://github.com/silently9527/JavaCore 微信公众号:贝塔学Java 前言 前几天中午正在和同事最近聊股市较好,这几天每天都可以喝点肉汤,心里还是挺高兴的;正在这个时候收到了线上告警邮件和运维同学的消息,“你们有服务挂了!”,心里一紧,立马打开电脑看来下线上cat监控大盘,发现很多服务都在报错,根据cat上的监控日志很快发现了其中一个服务内存溢出导致其他调用服务也有问题,竟然已经定位到了出问题的服务,那就简单了,没有是重启解决不了的问题,重启之后很快服务都恢复正常了。几分钟之后又报错了,同样也是这个服务内存溢出,经过排查后发现该服务的堆内存被改小了,好家伙,运维同学不讲武德,搞偷袭,趁我没反应过来调了内存,内存调整回去之后服务就恢复了正常。 事后把线上的快照文件拖了下来分析,发现本身这个项目的代码也有些问题,本文就整理了一下JVM常用的分析工具。 命令行工具 在安装完JDK之后在JAVA_HOME/bin目录下JDK已经提供了很多命令行的工具 可能我们最常用的就是 java 、 javac 这两个命令,除了这两个命令之外还有提供很多其他的实用工具,本文主要来一起学习对JVM监控诊断工具 虚拟机进程状况工具(jps) 该工具的功能比较单一,与linux中的ps功能类似,用来列出正在运行的虚拟机进程

Java服务器内存过高&CPU过高问题排查

*爱你&永不变心* 提交于 2021-01-11 03:20:07
一、内存过高 1、内存过高一般有两种情况:内存溢出和内存泄漏 (1)内存溢出:程序分配的内存超出物理机的内存大小,导致无法继续分配内存,出现OOM报错 (2)内存泄漏:不再使用的对象一直占据着内存不释放,导致这块内存浪费掉,久而久之,内存泄漏的对象堆积起来,也会导致物理机的内存被耗尽,出现OOM报错 2、内存过高的检测办法:通常我们的Java服务器部署在Linux机器上面,可以通过jvm自带的命令进行一些检测 (1)查看对象的数目和占用内存大小 ①参数为Java程序的进程号,将结果导出到指定目录中, jmap -histo:live <进程号> > <导出目录+文件名> ②示例如下,可以看到程序中各个对象所占用内存的情况,根据占用字节数大小降序显示,这里只能看出哪些对象占用内存高,但是还不能具体定位到问题代码,需要进一步排查 ③一些特殊的标识的含义 [C 表示char[],一般与String对象相关,因为String其实就是基于char数组实现的 [S 表示short[] [I 表示int[] [B 表示byte[] [II 表示int[][] num #instances #bytes class name ---------------------------------------------- 1 : 585152 75635896 [C 2 : 66541

JVM学习系列学习七

扶醉桌前 提交于 2021-01-10 08:45:58
5:实战:内存溢出的定位与分析 内存溢出在日常工作中,这个错误很容易遇到。遇到内存溢出,首先我们需要快速定位内存溢出的环节(位置),需要进行分析,看看是正常情况还是非正常情况。如果是正常情况,这个时候我们需要加大内存。如果是非正常情况,就需要对我们的程序进行修改,来修复这个问题。 首先,我们需要学会如何定位问题,然后在对问题进行分析,如何定位问题?这里我们可以借助于jmap与MAT工具进行分析。 5.1:模拟内存溢出 场景: 我们向list集合中添加100W个字符串,每个字符串再由100个UUID组成。如果可以正常执行,最后打印出OK。 /** * Created by kaigejava on 2019/7/3. * 模拟内存溢出的 */ @Slf4j public class TestJvmOutOfMemory { /** * 内存溢出 */ @Test public void jvmOutOfMemoryTest(){ List<Object> list = new ArrayList<>(); for ( int i = 0 ; i < 10000000 ; i++) { System. out .println(i); String str = "" ; for ( int j = 0 ; j < 1000 ; j++) { str += UUID.

JVM学习系列学习五

点点圈 提交于 2021-01-10 08:44:09
JVM学习系列学习五 凯哥java 凯哥java 我们接着上一篇文章讲解: 4.2:查看内存中对象数量及大小 查看所有对象,包括活跃及非活跃的。使用命令: Jmap -histo <pid> | more 查看活跃对象: Jmap -histo:live <pid> | more 对象说明: B: byte C: char D: double F: float I: int J: long z: Boolean [L+类名:其他对象 4.3:将内存使用情况dump到文件中 在有些时候,我们需要将JVM当前内存中的情况进行分析。这个时候,我们就需要先将内存中数据放到文件中。 Jmap也支持dump。 用法: jmap -dump:format=b,file=/home/dump.data 20031 Jmap -dump:format=b,file=dumpFileName<pid> 示例: Cd到home。查看刚才dump的文件: 4.4:通过jhat对dump文件进行分析 刚才我们将JVM内存dump到了文件中,这个文件就是一个二进制文件。不方便查看,这时候,我们可以借助与其他工具进行查看。 可以使用jhat这个命令进行分析查看。 语法: jhat -port <port> <file> 示例 查看分析后的数据: 我们可以通过浏览器+端口访问分析后的数据。 使用OQL查询:

JVM学习系列学习七

℡╲_俬逩灬. 提交于 2021-01-10 08:32:20
JVM学习系列学习七 凯哥java 凯哥java 5:实战:内存溢出的定位与分析 内存溢出在日常工作中,这个错误很容易遇到。遇到内存溢出,首先我们需要快速定位内存溢出的环节(位置),需要进行分析,看看是正常情况还是非正常情况。如果是正常情况,这个时候我们需要加大内存。如果是非正常情况,就需要对我们的程序进行修改,来修复这个问题。 首先,我们需要学会如何定位问题,然后在对问题进行分析,如何定位问题?这里我们可以借助于jmap与MAT工具进行分析。 5.1:模拟内存溢出 场景: 我们向list集合中添加100W个字符串,每个字符串再由100个UUID组成。如果可以正常执行,最后打印出OK。 /** * Created by kaigejava on 2019/7/3. *模拟内存溢出的 */ @Slf4j public class TestJvmOutOfMemory { /** * 内存溢出 */ @Test public void jvmOutOfMemoryTest(){ List<Object> list = new ArrayList<>(); for (int i = 0; i < 10000000; i++) { System.out.println(i); String str = ""; for (int j = 0; j < 1000; j++) { str +=