![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM原理与调优
文章平均质量分 87
_吹雪_
这个作者很懒,什么都没留下…
展开
-
Java常见问题排查
OOM还包括了不报OOM,但GC已经比较频繁了这种现象,比如说应用写得还可以的情况下,压力施加上去,瓶颈会出现在gc,gc会非常的频繁,但它不会报OOM,jvm源码里只有以下七种原因可导致OOM,这七种在java里面多数都是有解决方案的,java工具体系比很多其他语言要成熟:GC overhead limitexceeded、Java Heap Space、Unable to create new...翻译 2018-07-08 22:35:46 · 1252 阅读 · 0 评论 -
垃圾回收_下
前言在读博士的时候,我曾经写过一个统计 Java 对象生命周期的动态分析,并且用它来跑了一些基准测试。其中一些程序的结果,恰好验证了许多研究人员的假设,即大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。之所以要提到这个假设,是因为它造就了Java虚拟机的分代回收思想。简单来说,就是将堆空间划分为两代,分别叫做新生代和老年代。新生代用来存储新建...翻译 2018-10-15 11:41:44 · 293 阅读 · 0 评论 -
垃圾回收_上
前言你应该听说过这么一句话:免费的其实是最贵的。Java 虚拟机的自动内存管理,将原本需要由开发人员手动回收的内存,交给垃圾回收器来自动回收。不过既然是自动机制,肯定没法做到像手动回收那般精准高效 [1] ,而且还会带来不少与垃圾回收实现相关的问题。接下来的两篇,我们会深入探索 Java 虚拟机中的垃圾回收器。今天这一篇,我们来回顾一下垃圾回收的基础知识。引用计数法与可达性分析垃圾回收,...原创 2018-10-15 10:21:06 · 296 阅读 · 0 评论 -
Java对象的内存布局
前言在 Java 程序中,我们拥有多种新建对象的方式。除了最为常见的 new 语句之外,我们还可以通过反射机制、Object.clone 方法、反序列化以及 Unsafe.allocateInstance 方法来新建对象。其中,Object.clone方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段。Unsafe.allocateInstance方法则没有初始化实例字段,而ne...原创 2018-10-15 09:37:14 · 956 阅读 · 0 评论 -
JVM是如何实现反射的
前言反射是 Java 语言中一个相当重要的特性,它允许正在运行的 Java 程序观测,甚至是修改程序的动态行为。举例来说,我们可以通过 Class 对象枚举该类中的所有方法,我们还可以通过 Method.setAccessible(位于 java.lang.reflect 包,该方法继承自 AccessibleObject)绕过 Java 语言的访问权限,在私有方法所在类之外的地方调用该方法。...原创 2018-10-13 20:38:09 · 2284 阅读 · 2 评论 -
Java虚拟机是怎么实现synchronized的
synchronized字节码在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 s...原创 2018-10-13 11:32:45 · 544 阅读 · 0 评论 -
JVM的内存区域划分(转摘)
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JV...原创 2017-05-08 23:08:55 · 421 阅读 · 0 评论 -
Java锁优化思路及JVM实现
1. 锁优化的思路和方法这里提到的锁优化,是指在阻塞式的情况下,如何让性能不要变得太差。但是再怎么优化,一般来说性能都会比无锁的情况差一点。 这里要注意的是,在ReentrantLock中的tryLock,偏向于一种无锁的方式,因为在tryLock判断时,并不会把自己挂起。 锁优化的思路和方法总结一下,有以下几种。 * 减少锁持有时间 * 减小锁粒度 * 锁分离 * 锁粗化 * ...转载 2018-07-15 17:49:01 · 510 阅读 · 0 评论 -
一次OOM排查过程
一、外在表现前段时间系统经常出现OOM,服务很不稳定,偶尔会有java进程不存在的情况,临时解决方案只能是重启。 二、辅助工具1.top用top查看,发现内存占用(%MEM)挺多,其他指标均正常。 2.dmesg如果发现自己的java进程突然消失了,那么就要借助dmesg来查看开机之后的系统日志命令为dmesg | grep -i 'kill'或者搜索oom...原创 2017-02-19 10:17:11 · 9361 阅读 · 2 评论 -
一次load飙高排查过程
一、外在表现有时java应用的load很高,影响系统稳定性,这时候就要进行问题排查,找出影响系统稳定性的因素。如果是进程级的应用,如Nginx、Apache等都还比较容易排查,但如果是JVM中的某个线程导致的,估计有人就要开始抓瞎了。 二、排查过程 1.ps -ef | grep java | grep -v grep找出Java进程ID,得到进程ID为21711 ...原创 2017-02-19 11:14:14 · 2727 阅读 · 1 评论 -
Btrace 使用小结
BTrace是神器,每一个需要每天解决线上问题,但完全不用BTrace的Java工程师,都是可疑的。BTrace的最大好处,是可以通过自己编写的脚本,获取应用的一切调用信息。而不需要重启应用!只要定义脚本时不作大死(比如查看谁调用了HashMap的put方法),直接在生产环境打开也没影响。 1.简介项目地址:http://github.com/btraceio/btrace...原创 2016-05-29 12:45:39 · 3559 阅读 · 0 评论 -
JVM性能调优监控工具总结
JDK本身提供了很多方便的JVM性能调优监控工具,有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具. 1.jps(Java Virtual Machine Process Status Tool)最常用的就是 jps -mlvVjps主要用来输出JVM中运行的进程状态信息。语法格式如下:jps [options] [hostid]如果不指定ho...原创 2017-02-12 21:42:22 · 530 阅读 · 1 评论 -
Java内存模型
前言我们先来看一个反常识的例子。int a=0, b=0;public void method1() { int r2 = a; b = 1;}public void method2() { int r1 = b; a = 2;}这里我定义了两个共享变量 a 和 b,以及两个方法。第一个方法将局部变量 r2 赋值为 a,然后将共享变量 b 赋值为 1。第二个方法...翻译 2018-10-15 16:17:40 · 336 阅读 · 0 评论