阿里对jvm进行了一些重写
jdk架构:
了解jvm的目的:
写出更好、更优雅的java程序、排查问题 jvm优化
jvm历史:
jvm大体运行逻辑:
线程私有区:
程序计数器:
栈:
一个方法一个栈帧:
一个线程可以有多个栈帧
多态用到动态链接
方法执行完,栈帧出栈
子方法执行完return,返回的复方法行数地址,用到了返回地址
死递归,栈只有1M,超出了大小,stackOverFlow
本地方法栈:
native方法
线程共享区域:
类的字节码放在方法区
运行时常量池:
元空间就是原来的方法区:
直接内存:
jvm总结:
JVM对象:
根垃圾回收机制有关,内存规整则按照指针碰撞来分配内存:
同时分配的话用的cas操作
对象头信息:
指针的方式:
现在都是使用的直接指针,关注的是对象的访问速度
内存非配策略:
堆内存分配策略:
空间担保参数:
垃圾回收的意义:
GC判断对象存活:
各种引用:
GC详情:
年轻代suver区的回收问题:
复制回收算法
标记清除算法:
标记整理算法:
垃圾回收器:
垃圾回收工作示意图:
CMS垃圾回收器:
追求暂停时间短,有浮动垃圾,在满足一定比例就进行回收92%,内存碎片比较多
JPS -V 查看jvm设置参数
G1垃圾回收器:
可以设置最大回收时间,可能只能回收其中一部分的区块,如果GC频繁,会自动调用SerialOld单线程进行FullGc,内存过小不适用,8G以上内存
JVM执行子系统:
Class类文件结构:
字节码指令:
方法执行,静态追踪:
静态追踪-重载:
重写方法则可以动态追踪->动态追踪-重写::
类加载机制:
类加载阶段做的事情:
类加载案例:
常亮,静态代码块,静态变量等
链接的准备阶段:
初始化一些初始值,尤其是final与static
链接的解析:
动态链接与静态链接,将方法转换维直接引用地址
初始化:
执行类的构造器
初始化的五种情况
静态代码块是线程安全的,单例模式
类加载器:
双亲委派加载:
确保源码不被加载多次
自己可以继承classLoader重写findClass,这个遵从了双亲委派机制
tomcat打破了双亲委派加载机制:
多个项目可以有相同路径的类
内存溢出:
内存不够
栈溢出,堆溢出,方法区溢出,本机内存直接异常
jsp、CGLIB,是加载在方法区,也可能由内存泄漏造成
内存泄露:
一般是代码有问题,内存一直回收不了
无法释放内存
IO连接 try catch
变量定义的大于我的使用范围,没有即使的把对象置为null
内部类,持有外部类(最好用静态内部类,尽量不要持有外部类)
非静态内部类的使用:
非静态内部类,不能直接new,只可以访问外部类的全部成员,占空间
静态内部类的使用:
静态内部类,可以直接new,只可以访问外部类的静态成员,防止内存泄漏
MAT内存泄露分析工具,jvm配置启动参数打印内存泄露错误到文件,也可以主动跟踪java线程
会猜想是哪个方法哪个变量引起的内存错误
浅堆小,深堆大,得看下对象是不是引用正确
jvm为我们提供的工具:
jps:
没事就敲一下的命令,
显示jvm正在运行的进程
JVM调优及深入了解性能优化:
jimiter并发测试:
逃逸分析:
对象在栈上分配,不占空间,减少垃圾回收,hotspot的jvm自动开启
性能调优的其他点:
数据存储速度:
并发数和吞吐量的关系:
性能优化的注意点:
编写高效java程序:
JVM调优经验:
遇到了一个比较老的项目,用的是SpringMvc + tomcat7 + jdk7 + jsp + hibernate,遇到一个项目时长卡顿的问题,jsp页面后端不响应,还有多条sql之间会卡住,一卡就是十来秒,但是本地运行却没有任何问题,没有任何卡顿,而服务器是windows32G运存,一开始只是猜测是服务器的问题,后来发现本地再启动时候加了jvm配置,所以接着对服务器是加了jvm的配置,问题大致被解决了,-Xms128m -Xmx1024m -XX:PermSize=256m -XX:MaxPermSize=1024m,但是只是解决了jsp页面响应卡住的问题,sql偶尔还是会被卡住,但是也是好多了,