JMAP

面试官问:平常你是怎么对Java服务进行调优的?

和自甴很熟 提交于 2020-12-05 02:55:43
点击关注上方“ 程序员私房菜 ”,设为“置顶或星标”,第一时间送达技术干货。 来源:http://t.cn/AiCTERJz Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码的臃肿,各种性能问题开始纷至沓来。 Java 应用性能的瓶颈点非常多,比如磁盘、内存、网络 I/O 等系统因素,Java 应用代码,JVM GC,数据库,缓存等。笔者根据个人经验,将 Java 性能优化分为 4 个层级:应用层、数据库层、框架层、JVM 层 ,如图 1 所示。 图 1.Java 性能优化分层模型 每层优化难度逐级增加,涉及的知识和解决的问题也会不同。比如应用层需要理解代码逻辑,通过 Java 线程栈 定位有问题代码行等;数据库层面需要 分析 SQL、定位死锁 等;框架层需要 懂源代码 , 理解框架 机制;JVM 层需要对 GC 的类型和工作机制有深入了解,对 各种 JVM 参数 作用了然于胸。 围绕 Java 性能优化,有两种最基本的分析方法: 现场分析法和事后分析法。 现场分析法 通过保留现场,再采用诊断工具分析定位。现场分析对线上影响较大,部分场景(特别是涉及到用户关键的在线业务时)不太合适。 事后分析法 需要尽可能多收集现场数据

jmap打dump异常

两盒软妹~` 提交于 2020-11-29 00:33:18
jmap打dump异常 参考文章: (1)jmap打dump异常 (2)https://www.cnblogs.com/cwind/p/10335787.html 备忘一下。 来源: oschina 链接: https://my.oschina.net/u/4428122/blog/4758297

java之jvm

心不动则不痛 提交于 2020-11-10 06:27:21
1.JVM内存模型 线程独占:栈,本地方法栈,程序计数器 线程共享:堆,方法区 回答以上问题是需回答两个要点: 1. 各部分功能 2. 是否是线程共享 2.JMM与内存可见性 JMM是定义程序中变量的访问规则,线程对于变量的操作只能在自己的工作内存中进行,而不能直接对主内存操作.由于指令重排序,读写的顺序会被打乱,因此JMM需要提供原子性,可见性,有序性保证. 3.类加载与卸载 加载机制-双亲委派模式 双亲委派模式,即加载器加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器.父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载. 优点: 避免类的重复加载 避免Java的核心API被篡改 分代回收 分代回收基于两个事实:大部分对象很快就不使用了,还有一部分不会立即无用,但也不会持续很长时间. 年轻代->标记-复制 老年代->标记-清除 回收算法 1.CMS算法 1.7前主流垃圾回收算法,为标记-清楚算法,优点是并发收集,停顿小. 2.G1算法 1.9后默认的垃圾回收算法,特点保持高回收率的同时减少停顿.采用每次只清理一部分,而不是清理全部的增量式清理,以保证停顿时间不会过长 3.ZGC 1.11中提供的高效垃圾回收算法,针对大堆内存设计,可以处理TB级别的堆,可以做到10ms以下的回收停顿时间. 考察点 深入理解JVM内存模型 了解类加载机制

面试java后端面经_3

那年仲夏 提交于 2020-11-08 12:43:12
小姐姐说: 你一点都不懂表达,一点都不懂爱情,一点也不爱我! 你答: 你知道吗,我听说过一个这样的故事,讲的就是有一个小女孩和一个男孩在一起,小男孩呢很不幸是位聋哑人,虽然如此,但是他们的日子过得特别的美满。有一天小女孩因为切菜不小心把手给弄破了(ps:这种层度不用打破伤风哈😘),小男孩翻遍家里没有创口贴,于是冲出家门来到街边的小店买创口贴,由于小男孩不会说话,一直尽力描述,无奈店主不知其意,这是小男孩看见店主桌上的剪刀,直接拿起往手上戳,鲜红的血冒出(ps:这种层度也不用打破伤风哈😘),小男孩高兴的拿着创口贴往家里飞奔... 爱情有时候,并不需要花言巧语,我不善言辞,但一直爱你!! 看完那我们开始咯😍 1 自我介绍哈 (这块没有一点准备的可以看面试java后端面经_1) 2 类加载的三种方式 (1:命令行启动应用时由JVM初始化加载 2:通过Class.forName() 方式动态加载 3:通过ClassLoder.loadClass() 方法动态加载) 3 如何判断对象已死 (1:引用计数法(java中没用,因为,没办法解决循环引用:A引用B,B也引用A,但是没有其他引用去引用A和B,这时AB都是垃圾,但是引用计数法无法判断)。2:可达性分析算法:通过GC Roots为起始点向下搜索,说白了就是通过你已知的活对象,去找这对象里的引用,再找引用对象里的引用,一直这样下去

30道 有趣的 的 JVM 面试题

百般思念 提交于 2020-11-03 09:06:00
[toc] 前段时间在忙大数据,也对市场技术有了一个新的理解,学到老,学到老嘛。今天来和大家分享一下JVM常见的面试题,今天来和大家分享一下。大多都是大厂的实战面试题,来和小刘看一下吧! 1、JVN内存结构 方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。 Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。 方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 程序计数器(Program Counter Register),程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。 JVM栈(JVM Stacks),与程序计数器一样,Java虚拟机栈(Java Virtual Machine Stacks)也是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame

JVM 内存了解

点点圈 提交于 2020-10-29 08:39:40
说说JVM的内存布局? Java虚拟机主要包含几个区域: 堆:堆Java虚拟机中最大的一块内存,是线程共享的内存区域,基本上所有的对象实例数组都是在堆上分配空间。堆区细分为Yound区年轻代和Old区老年代,其中年轻代又分为Eden、S0、S1 3个部分,他们默认的比例是8:1:1的大小。 栈:栈是线程私有的内存区域,每个方法执行的时候都会在栈创建一个栈帧,方法的调用过程就对应着栈的入栈和出栈的过程。每个栈帧的结构又包含局部变量表、操作数栈、动态连接、方法返回地址。 局部变量表用于存储方法参数和局部变量。当第一个方法被调用的时候,他的参数会被传递至从0开始的连续的局部变量表中。 操作数栈用于一些字节码指令从局部变量表中传递至操作数栈,也用来准备方法调用的参数以及接收方法返回结果。 动态连接用于将符号引用表示的方法转换为实际方法的直接引用。 元数据:在Java1.7之前,包含方法区的概念,常量池就存在于方法区(永久代)中,而方法区本身是一个逻辑上的概念,在1.7之后则是把常量池移到了堆内,1.8之后移出了永久代的概念(方法区的概念仍然保留),实现方式则是现在的元数据。它包含类的元信息和运行时常量池。 Class文件就是类和接口的定义信息。 运行时常量池就是类和接口的常量池运行时的表现形式。 本地方法栈:主要用于执行本地native方法的区域 程序计数器:也是线程私有的区域

JVM dump和分析

和自甴很熟 提交于 2020-10-28 13:21:56
原文链接:https://www.dubby.cn/detail.html?id=9098 1、dump jmap -dump:live,format=b,file=~/Desktop/dump.hprof 1110 其他参数意义: Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core> (to connect to a core file) jmap [option] [server_id@]<remote server IP or hostname> (to connect to remote debug server) where <option> is one of: <none> to print same info as Solaris pmap -heap to print java heap summary -histo[:live] to print histogram of java object heap; if the "live" suboption is specified, only count live objects -clstats to print class loader statistics

干货分享丨jvm系列:dump文件深度分析

匆匆过客 提交于 2020-10-24 01:42:56
摘要: java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢? JVM dump java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来 获取JVM dump文件 获取dump文件的方式分为主动和被动 i.主动方式: 1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file= 2.利用jcmd,jcmd GC.heap_dump 3.使用VisualVM,可以界面操作进行dump内存 4.通过JMX的方式 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(server, " com.sun.management:type=HotSpotDiagnostic " , HotSpotDiagnosticMXBean. class ); mxBean

面试官:我就问了一个JVM性能调优,没想到他能吹半个小时

僤鯓⒐⒋嵵緔 提交于 2020-10-24 00:40:02
一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老代) 永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,由虚拟机直接分配,但可以通过-XX:PermSize -XX:MaxPermSize 等参数调整其大小。 年轻代(New):年轻代用来存放JVM刚分配的Java对象 年老代(Tenured):年轻代中经过垃圾回收没有回收掉的对象将被Copy到年老代 永久代(Perm):永久代存放Class、Method元信息,其大小跟项目的规模、类、方法的量有关,一般设置为128M就足够,设置原则是预留30%的空间。 New又分为几个部分: Eden:Eden用来存放JVM刚分配的对象 Survivor1 Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。 2.垃圾回收算法 垃圾回收算法可以分为三类,都基于标记-清除(复制)算法: Serial算法(单线程) 并行算法 并发算法

干货分享丨jvm系列:dump文件深度分析

▼魔方 西西 提交于 2020-10-23 02:24:21
摘要: java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢? JVM dump java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?我们一步一步来 获取JVM dump文件 获取dump文件的方式分为主动和被动 i.主动方式: 1.利用jmap,也是最常用的方式:jmap -dump:[live],format=b,file= 2.利用jcmd,jcmd GC.heap_dump 3.使用VisualVM,可以界面操作进行dump内存 4.通过JMX的方式 MBeanServer server = ManagementFactory.getPlatformMBeanServer(); HotSpotDiagnosticMXBean mxBean = ManagementFactory.newPlatformMXBeanProxy(server, " com.sun.management:type=HotSpotDiagnostic " , HotSpotDiagnosticMXBean. class ); mxBean