jvm详解与实践

阿里对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偶尔还是会被卡住,但是也是好多了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值