JVM的认识与调优

1.JVM、JDK、JRE的关系

开发环境需要使用JDK,程序打包成jar后运行环境只需要jre。

2.JVM知识体系


java虚拟机栈,本身是栈,栈是一种数据结构,其特点:先进后出(后进先出)。方法进栈顺序:

1)如果上面A方法改为调用A方法本身,就会出现我们常见的stackOverflow Exception。
2)OutOfMemory:一个线程消耗1M,一千个就消耗1G,服务器只有1G内存,创建1001个线程就会报错OutOfMemory:unable create a native thread。优化:有一个-Xss参数,设置-Xss为256K,就占用少了。
性能优化:算法和数据结构。上述就是减少了数据存储空间。
补充案例:二叉树遍历
JDK提供了两种方法:
1.递归:发现叶子节点(没有左子树、右子树),return。
2.while循环、for循环判断每个节点---比较复杂。
最求性能(速度),选择方法2。
CPU执行代码纳秒级别,比内存处理快,方法1不断执行方法,设计到内存处理(封装一个栈帧),递归调用是本方法,不断压栈出栈。

3.栈帧执行对内存区域的影响

JDK安装目录下有个javap可以反汇编,jclasslib插件也可以完成javap功能。
字节码解释:cloud.tencent.com/developer/article/1333540。

为什么要有设计一个操作数栈?
JVM设计底层c++,再上升就是操作系统,模拟设计:

4.JVM运行内存处理过程

1.JVM申请内存(可以配置)
-Xms30m -Xms30m -XX:MaxMetaspaceSize=30m ;堆空间30m,方法区30m,一个线程,栈空间没有配置,默认1M。

2.初始化运行时数据区(方法区、堆、虚拟机栈)
3.类加载
4.执行方法
5.创建对象


栈执行完出栈,方法执行完了,堆空间怎么办?
垃圾回收。
空间满了发生垃圾回收。
对象优先在Eden分配,长期存活的对象进入老年代,大对象直接进入老年代,动态对象年龄判定。

现在Eden,每次垃圾回收一次,年龄+1,依次在from和to中眺换,年龄达到15,到达老年代。另外,比如from有很多对象,占据空间达到它分配空间的50%以上,直接到老年代。
FullGC。
java -Smx3072M -jar order.jar
老板比较抠,3G给秒杀活动,那么老年代分2G,Eden800M,From和To区各100M,每秒一定订单0.02M垃圾,一秒500个订单,产生100M内存空间,1秒后都变成垃圾对象。
YGC新生代垃圾回收8秒一次。
方法没有执行完,引用还在不会被回收,现在Eden中100M,8秒后,然后到From,超过百分之五十,直接到老年代,老年代20*8 =160秒后,FullGC,STW(stop the world).
过一会卡一会,过一会再卡一会。怎么调优?
Jvm调优,修改默认的1/3:2/3和1:1:8的比例。

修改后:YGC:14秒,FullGC:不会。
关键问题:怎么确定这个方法,每秒产生多少垃圾?
JDK有工具解析,jps,jstat,jinfo查看内存等分析。
如何调优?
调优一定要基于压测,压测看在大访问访问量下,吞吐量多少,响应时间多少,调成参数慢慢测试。

完结!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值