jvm调优

面试题:JVM,GC垃圾回收机制

帅比萌擦擦* 提交于 2020-03-09 17:00:12
收集了有关Java中GC垃圾回收机制的一些知识点,帮助自己理解。 GC(垃圾收集),那收集回收的是什么呢? 是内存 ,所以在了解垃圾回收机制之前,要对Java内存有一个了解。 一:Java内存 图解: 私有内存区:伴随线程的产生而产生 ,一旦线程终止,私有内存区也会自动消除 程序计数器:指示当前程序执行到了哪一行,执行 Java方法 时记录正在执行的虚拟机 字节码指令地址 ;执行 本地方法 时,计数器值为 null 虚拟机栈:用于执行 Java方法 ,栈帧存储 局部变量表,操作数栈 , 动态链接,方法返回地址 和一些额外的符加信息。程序执行时入栈;执行完成后栈帧出栈。 Java堆:Java虚拟机管理的内存中最大的一块,所有 线程共享 ,几乎 所有的对象实例和数组 都在这里分配内存。GC主要就是在Java堆中进行的。 堆内存又分为:新生代(新生代又分为Eden80%,Survivor20%)和老年代(Old),并且一般新生代的空间比老年代大。 方法区:只有一个方法区共享。实际也是堆,只是用于 存储类 , 常量 相关的信息,来存放程序中永远不变或唯一的内容( 类信息【Class对象】 , 静态变量,字符串常量 等)。但是已经被最新的 JVM 取消了。现在,被加载的类作为元数据加载到底层操作系统的本地内存区。 了解了Java内存,接下来就来了解一下GC原理: 二、垃圾回收机制 一

JVM--垃圾收集器以及内存分配

为君一笑 提交于 2020-03-08 14:37:07
概述   在jvm中,实现了多种垃圾收集器,包括:串行垃圾收集器、并行垃圾收集器、CMS(并发)垃圾收集器、G1垃圾收集器 串行垃圾收集器   串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,并且java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW(Stop-The-World)。   对于交互性较强的应用而言,这种垃圾收集器是不能够接受的。   一般在Javaweb应用中是不会采用该收集器的。 测试代码 public class TestGC { public static void main(String[] args) throws Exception { List<Object> list = new ArrayList<Object>(); while (true) { int sleep = new Random().nextInt(100); if (System.currentTimeMillis() % 2 == 0) { list.clear(); } else { for (int i = 0; i < 10000; i++) { Properties properties = new Properties(); properties.put("key_" + i, "value_" + System

JVM垃圾回收机制

久未见 提交于 2020-03-07 13:55:32
问题引入:     谈谈JVM垃圾回收机制 怎样判断一个对象是否是垃圾? 判断是否是垃圾有两种方式,(1)引用计数法,无法解决循环引用问题,Java不使用,Python使用              (2)可达性分析,以GC Root为根进行可达性遍历,无法被遍历到的判定为垃圾 ps :什么是GC Root根 ?虚拟机栈中的局部变量表,方法区中的静态变量引用的对象,方法区中常量引用的对象,本地方法栈中引用的对象(native) 典型垃圾回收算法 :(1)标记清除算法 :先标记垃圾,再清除。会产生内存碎片,效率也不太高           (2)复制算法:不会产生内存碎片,但将内存缩小到原来的一半,占用空间。性能取决于存活对象的多少,如果存活对象很多,很费时           (3)标记整理算法:先标记,再清除,再整理内存。比较耗时。           (4)分代收集算法:当前商业虚拟机的垃圾收集都采用“分代收集”算法,根据对象存活周期的不同将内存分为几块。一般是把java对分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中每次垃圾收集时都有大量对象死去,只有少量对象存活,所以就采用复制算法,只需要付出少了存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对他进行分配担保,就要使用“标记-清除”或“标记-整理”算法

扒一扒JVM的垃圾回收机制,下次面试你准备好了吗?

旧时模样 提交于 2020-03-03 23:41:46
一、 技术背景你要了解吧 二、 哪些内存需要回收? 2.1 引用计数算法 2.1.1 算法分析 2.1.2 优缺点 2.1.3 是不是很无趣,来段代码压压惊 2.2 可达性分析算法 2.3 Java中的引用你了解多少 2.4 对象死亡(被回收)前的最后一次挣扎 2.5 方法区如何判断是否需要回收 三、常用的垃圾收集算法 3.1 标记-清除算法 3.2 复制算法 3.3 标记-整理算法 3.4 分代收集算法 3.4.1 年轻代(Young Generation)的回收算法 3.4.2 年老代(Old Generation)的回收算法 3.4.3 持久代(Permanent Generation)的回收算法 四、常见的垃圾收集器 五、GC是什么时候触发的(面试最常见的问题之一) 5.1 Scavenge GC 5.2 Full GC 结束语 一、 技术背景你要了解吧   按照套路是要先装装X,谈谈JVM垃圾回收的前世今生的。说起垃圾回收(GC),大部分人都把这项技术当做Java语言的伴生产物。事实上,GC的历史比Java久远,早在1960年Lisp这门语言中就使用了内存动态分配和垃圾回收技术。设计和优化C++这门语言的专家们要长点心啦~~ 二、 哪些内存需要回收?   猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈

性能优化 | JVM性能调优篇——来自阿里P7的经验总结

断了今生、忘了曾经 提交于 2020-02-29 01:06:50
VM 调优概述: 性能定义: 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗,垃圾收集器能支撑应用达到的最高性能指标。 延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿,避免应用运行时发生抖动。 内存占用 - 垃圾收集器流畅运行所需要的内存数量。 调优原则 GC 优化的两个目标: 将进入老年代的对象数量降到最低 减少 Full GC 的执行时间 GC 优化的基本原则是:将不同的 GC 参数应用到两个及以上的服务器上然后比较它们的性能,然后将那些被证明可以提高性能或减少 GC 执行时间的参数应用于最终的工作服务器上。 将进入老年代的对象数量降到最低 除了可以在 JDK7 及更高版本中使用的 G1 收集器以外,其他分代 GC 都是由 Oracle JVM 提供的。关于分代 GC,就是对象在 Eden 区被创建,随后被转移到 Survivor 区,在此之后剩余的对象会被转入老年代。也有一些对象由于占用内存过大,在 Eden 区被创建后会直接被传入老年代。老年代 GC 相对来说会比新生代 GC 更耗时,因此,减少进入老年代的对象数量可以显著降低 Full GC 的频率。你可能会以为减少进入老年代的对象数量意味着把它们留在新生代,事实正好相反,新生代内存的大小是可以调节的。 降低 Full GC 的时间 Full GC 的执行时间比 Minor

jvm内存溢出性能调优

 ̄綄美尐妖づ 提交于 2020-02-29 01:05:14
常用工具及命令 jps jstat Top jstack jmap mat工具 top -Hp pid可以查看某个进程的线程信息 -H 显示线程信息,-p指定pid jps:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称及进程pid 如:jps -l pid Jstack命令 jstack是java虚拟机自带的一种堆栈跟踪工具。用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。 线程的几种状态: NEW:未启动的。不会出现在Dump中。 RUNNABLE:在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表明它获得了某把锁。 BLOCKED:受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 WATING:无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。 TIMED_WATING:有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 TERMINATED:已退出的。 例一: public

jvm调优的简单手段---都是实际工作用到的。

冷暖自知 提交于 2020-02-28 02:01:29
案例一: 写一个使用sshj包远程链接虚拟机进行操作的过程。 现象:虚拟机环境,真实主机,ide上面测试都没有出现问题,推送到了流水线发布之后运行一段时间程序变得异常缓慢,流水线环境是docker。 (整个排查过程异常麻烦,因为是给华为云做的是没有测试环境的权限的,需要跟测试人员配合想起来就是眼泪。) 排查办法:jps 获取所有java进程。 装了jdk就有这个工具。 jstack pid | grep -A 20 -B 20 “你的包名” 你可以得到运行环境中所有线程的栈信息,找到挂起线程可以查出问题所在,就可以定位问题了。 grep -A 是向下展示多少行有的组件写的狗的话20行不一定能看出来,可以根据实际情况具体调整。 -B是向上。 出现问题原因: 因为docker 或者jdk 版本的问题,导致使用节点/dev/random 获取随机数出现争抢排队的问题,最后重新换了一种随机数获取方式,没有去关心到底是docker的问题还是jdk。 预计把/dev/random 挂到docker里面区也能解决问题。 案例二: 一般来说spring托管之后不容易出现内存泄漏问题,但是毕竟需求千千万还是有可能出现,很久以前的一个工程常常用一段实践就挂掉,最后时间紧挂进程守护上的线。(只能说单子大那些年。) 排查方法: jmap -histo pid | grep “你自己的包名”

Flink的入门

◇◆丶佛笑我妖孽 提交于 2020-02-22 14:34:13
Apache Flink(下简称Flink)项目是大数据处理领域最近冉冉升起的一颗新星,其不同于其他大数据项目的诸多特性吸引了越来越多人的关注。本文将深入分析Flink的一些关键技术与特性,希望能够帮助读者对Flink有更加深入的了解,对其他大数据系统开发者也能有所裨益。本文假设读者已对MapReduce、Spark及Storm等大数据处理框架有所了解,同时熟悉流处理与批处理的基本概念。 Flink简介 Flink核心是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布、数据通信以及容错机制等功能。基于流执行引擎,Flink提供了诸多更高抽象层的API以便用户编写分布式任务: DataSet API, 对静态数据进行批处理操作,将静态数据抽象成分布式的数据集,用户可以方便地使用Flink提供的各种操作符对分布式数据集进行处理,支持Java、Scala和Python。 DataStream API,对数据流进行流处理操作,将流式的数据抽象成分布式的数据流,用户可以方便地对分布式数据流进行各种操作,支持Java和Scala。 Table API,对结构化数据进行查询操作,将结构化数据抽象成关系表,并通过类SQL的DSL对关系表进行各种查询操作,支持Java和Scala。 此外,Flink还针对特定的应用领域提供了领域库,例如: Flink ML,Flink的机器学习库

JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、jinfo、jconsole使用详解

安稳与你 提交于 2020-02-16 10:52:34
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发中可能被很多人忽视(比如有的人遇到上面的问题只是重启服务器或者调大内存,而不会深究问题根源),但能够理解并解决这些问题是Java程序员进阶的必备要求。本文将对一些常用的JVM性能调优监控工具进行介绍,希望能起抛砖引玉之用。本文参考了网上很多资料,难以一一列举,在此对这些资料的作者表示感谢!关于JVM性能调优相关的资料,请参考文末。 A、 jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息。语法格式如下: 1 jps [options] [hostid] 如果不指定hostid就默认为当前主机或服务器。 命令行参数选项说明如下: 1 2 3 4 -q 不输出类名、Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l

JVM内存模型及参数调优

五迷三道 提交于 2020-02-09 08:13:27
堆、栈、方法区概念区别 1.堆 堆内存用于存放由new创建的对象和数组。在堆中分配的内存,由java虚拟机自动垃圾回收器来管理。根据垃圾回收机制的不同, Java堆有可能拥有不同的结构,最为常见的就是将整个Java堆分为新生代和老年代。其中新声带存放新生的对象或者年龄不大的 对象,老年代则存放老年对象。新生代分为edn区、s0区、s1区,s0和s1也被称为from和to区域,他们是两块大小相等并且可以 互相角色的空间。绝大多数情况下,对象首先分配在eden区,在新生代回收后,如果对象还存活,则进入s0或s1区,之后每经 过一次新生代回收,如果对 象存活则它的年龄就加1,对象达到一定的年龄后,则进入老年代. 2.栈 Java栈是一块线程私有的空间,一个栈,一般由三部分组成:局部变量表、操作数据栈和帧数据区 局部变量表:用于报错函数的参数及局部变量 操作数栈:主要保存计算过程的中间结果,同时作为计算过程中的变量临时的存储空间。 帧数据区:除了局部变量表和操作数据栈以外,栈还需要一些数据来支持常量池的解析,这里帧数据区保存着 访问常量池的指针,方便计程序访问常量池,另外当函数返回或出现异常时卖虚拟机子必须有一个异常处理表,方便发送异常 的时候找到异常的代码,因此异常处理表也是帧数据区的一部分。 3.方法区 Java方法区和堆一样,方法区是一块所有线程共享的内存区域,他保存系统的类信息。