jvm详解与实践

阿里对jvm进行了一些重写

jdk架构:

jvm详解与实践_第1张图片

了解jvm的目的:

写出更好、更优雅的java程序、排查问题 jvm优化

jvm历史:

jvm详解与实践_第2张图片

jvm大体运行逻辑:

jvm详解与实践_第3张图片

线程私有区:

jvm详解与实践_第4张图片

程序计数器:

jvm详解与实践_第5张图片

栈:

jvm详解与实践_第6张图片

一个方法一个栈帧:

jvm详解与实践_第7张图片

jvm详解与实践_第8张图片

一个线程可以有多个栈帧

多态用到动态链接

方法执行完,栈帧出栈

子方法执行完return,返回的复方法行数地址,用到了返回地址

死递归,栈只有1M,超出了大小,stackOverFlow

本地方法栈:

native方法

线程共享区域:

jvm详解与实践_第9张图片

jvm详解与实践_第10张图片

类的字节码放在方法区

运行时常量池:

jvm详解与实践_第11张图片

元空间就是原来的方法区:

jvm详解与实践_第12张图片

直接内存:

jvm详解与实践_第13张图片

jvm总结:

jvm详解与实践_第14张图片

JVM对象:

jvm详解与实践_第15张图片

根垃圾回收机制有关,内存规整则按照指针碰撞来分配内存:

同时分配的话用的cas操作

jvm详解与实践_第16张图片

对象头信息:

jvm详解与实践_第17张图片

jvm详解与实践_第18张图片

指针的方式:

现在都是使用的直接指针,关注的是对象的访问速度

jvm详解与实践_第19张图片

内存非配策略:

jvm详解与实践_第20张图片

jvm详解与实践_第21张图片

堆内存分配策略:

jvm详解与实践_第22张图片

jvm详解与实践_第23张图片

空间担保参数:

jvm详解与实践_第24张图片

垃圾回收的意义:

jvm详解与实践_第25张图片

GC判断对象存活:

jvm详解与实践_第26张图片

各种引用:

jvm详解与实践_第27张图片

GC详情:

jvm详解与实践_第28张图片

年轻代suver区的回收问题:

复制回收算法

jvm详解与实践_第29张图片

标记清除算法:

jvm详解与实践_第30张图片

标记整理算法:

jvm详解与实践_第31张图片

垃圾回收器:

垃圾回收工作示意图:

jvm详解与实践_第32张图片

CMS垃圾回收器:

追求暂停时间短,有浮动垃圾,在满足一定比例就进行回收92%,内存碎片比较多

jvm详解与实践_第33张图片

JPS -V  查看jvm设置参数

G1垃圾回收器:

可以设置最大回收时间,可能只能回收其中一部分的区块,如果GC频繁,会自动调用SerialOld单线程进行FullGc,内存过小不适用,8G以上内存

jvm详解与实践_第34张图片

JVM执行子系统:

Class类文件结构:

jvm详解与实践_第35张图片

jvm详解与实践_第36张图片

字节码指令:

jvm详解与实践_第37张图片                      jvm详解与实践_第38张图片

jvm详解与实践_第39张图片

方法执行,静态追踪:

jvm详解与实践_第40张图片

静态追踪-重载:

jvm详解与实践_第41张图片

重写方法则可以动态追踪->动态追踪-重写::

jvm详解与实践_第42张图片

类加载机制:

jvm详解与实践_第43张图片

类加载阶段做的事情:

jvm详解与实践_第44张图片

类加载案例:

常亮,静态代码块,静态变量等

jvm详解与实践_第45张图片

链接的准备阶段:

初始化一些初始值,尤其是final与static

链接的解析:

动态链接与静态链接,将方法转换维直接引用地址

jvm详解与实践_第46张图片

初始化:

执行类的构造器

初始化的五种情况

jvm详解与实践_第47张图片

静态代码块是线程安全的,单例模式

类加载器:

jvm详解与实践_第48张图片

双亲委派加载:

确保源码不被加载多次

自己可以继承classLoader重写findClass,这个遵从了双亲委派机制

jvm详解与实践_第49张图片

tomcat打破了双亲委派加载机制:

多个项目可以有相同路径的类

jvm详解与实践_第50张图片

内存溢出:

内存不够

栈溢出,堆溢出,方法区溢出,本机内存直接异常

jsp、CGLIB,是加载在方法区,也可能由内存泄漏造成

内存泄露:

一般是代码有问题,内存一直回收不了

无法释放内存

jvm详解与实践_第51张图片

IO连接 try catch 

变量定义的大于我的使用范围,没有即使的把对象置为null

内部类,持有外部类(最好用静态内部类,尽量不要持有外部类)

非静态内部类的使用:

非静态内部类,不能直接new,只可以访问外部类的全部成员,占空间

jvm详解与实践_第52张图片

静态内部类的使用:

静态内部类,可以直接new,只可以访问外部类的静态成员,防止内存泄漏

jvm详解与实践_第53张图片

MAT内存泄露分析工具,jvm配置启动参数打印内存泄露错误到文件,也可以主动跟踪java线程

会猜想是哪个方法哪个变量引起的内存错误

jvm详解与实践_第54张图片

jvm详解与实践_第55张图片

浅堆小,深堆大,得看下对象是不是引用正确

jvm为我们提供的工具:

jvm详解与实践_第56张图片

jps:

没事就敲一下的命令,

显示jvm正在运行的进程

jvm详解与实践_第57张图片

jvm详解与实践_第58张图片

JVM调优及深入了解性能优化:

jvm详解与实践_第59张图片

jvm详解与实践_第60张图片

jvm详解与实践_第61张图片

jimiter并发测试:

jvm详解与实践_第62张图片

逃逸分析:

对象在栈上分配,不占空间,减少垃圾回收,hotspot的jvm自动开启

jvm详解与实践_第63张图片

jvm详解与实践_第64张图片

性能调优的其他点:

jvm详解与实践_第65张图片

数据存储速度:

jvm详解与实践_第66张图片

并发数和吞吐量的关系:

jvm详解与实践_第67张图片

性能优化的注意点:

jvm详解与实践_第68张图片

jvm详解与实践_第69张图片

jvm详解与实践_第70张图片

jvm详解与实践_第71张图片

jvm详解与实践_第72张图片jvm详解与实践_第73张图片

jvm详解与实践_第74张图片

编写高效java程序:

jvm详解与实践_第75张图片

jvm详解与实践_第76张图片

JVM调优经验:

遇到了一个比较老的项目,用的是SpringMvc + tomcat7 + jdk7 + jsp + hibernate,遇到一个项目时长卡顿的问题,jsp页面后端不响应,还有多条sql之间会卡住,一卡就是十来秒,但是本地运行却没有任何问题,没有任何卡顿,而服务器是windows32G运存,一开始只是猜测是服务器的问题,后来发现本地再启动时候加了jvm配置,所以接着对服务器是加了jvm的配置,问题大致被解决了,-Xms128m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=1024m,但是只是解决了jsp页面响应卡住的问题,sql偶尔还是会被卡住,但是也是好多了,

你可能感兴趣的:(JVM,jvm)