深入理解Java虚拟机JVM高级特性与最佳实践--笔记

2018-01-09  本文已影响37人  sxqiong

时时更新,假装很厉害(其实就是逼自己坚持下去···)我不生产程序 我是程序的搬运工


Part1 内存模型

1.运行时数据区域


运行时数据区域

Part2对象创建

1.对象创建:


2.对象内存布局:


3.对象访问定位:


Part3 GC

1.对象的存活状态:

2.引用:JDK1.2之后引用分为四种(由强到弱)

3.死亡标记:对象死亡至少需要两次标记,一次是可达性分析算法的标记,放入F-Queue队列,然后等待队列调用finalize方法,执行后依旧没有引用则被再次标记,然后回收。finalize只会被调用一次。

4.回收方法区:主要回收内容废用常量(例如String),无用的类。常量判断方式与堆中差不多。无用类的判断有三点:

5.垃圾收集算法:

6.垃圾收集器

7.对象分配流程:

8.java虚拟机工具:

Part4实际分析

1.高性能机器部署:
问题:16G内存,java堆大小分配12G,一次GC高达14s,因为大对象比较多,大部分大对像都进入到了老年代,所以GC回收不掉这些大对象,造成十几分钟就十几秒的GC停顿。
解决方案:分配小一点内存,一台机器上部署多个服务。

2.集群间同步导致内存溢出:
问题:高并发读写操作,导致集群间数据疯狂同步,同步失败后还需要同步重试,服务器间通讯,消耗大量内存资源。
解决方案:书里没说,个人觉得这种高并发读写就不应该这种方式实现集群,生产者消费者的模式来减缓同步压力。

3.堆外内存导致的溢出错误:
问题:平台限制内存2G,虚拟机分配内存1.6G,当加大内存的时候内存溢出现象更加严重,jstat时候GC不频繁,个区域稳定。
解决:问题定位,由此可推算,直接内存区大小为0.4G,Direct Memory虽然也能被Full GC回收,但是它不能通知GC回收。大量NIO操作,需要用DM。分配DM空间-XX:MaxDirectMemorySize

4.外部命令导致系统缓慢:
问题:系统调用大量脚本,命令行等,方式来获取系统一些信息。
解决:大量的这种操作需要消耗很多资源,系统需要产生新的进程,建议使用java api的方式获取这些信息。

5.服务器JVM进程崩溃
问题:运行期间服务器频频出现自动关闭的现象,生产hs_err_pid.log,一个服务调用另一个服务,两个服务处理速度差距较大,导致多个线程等待,最终服务崩溃。
解决:使用生产者消费者模式,消息实现队列。

6.不恰当的数据格式导致内存占用过大。

7.由windows虚拟内存导致的长时间停顿。

(Class文件描述的各种信息略掉了。)

Part5虚拟机类加载机制

1.类生命周期:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸载(Unloading)七个阶段

2.五种类初始化时机:

3.加载阶段虚拟机动作:

4.验证:

5.准备(初始化类变量,类变量赋初值)

6.解析

7.初始化

8.同一个类加载器加载的类才是相等的,否则instanceof也返回false

9.类加载器:

Part6 虚拟机字节码执行引擎

1.栈帧:虚拟机运行时数据区中的虚拟机栈的栈元素。

2.栈帧需要分配多少内存不会受程序运行期变量数据的影响。

3.栈帧结构:

4.方法重载Overload优先级


ab.png

先输出 char,注掉char后输出int注掉int输出long注掉long输出Character 注掉Character输出Serializable注掉Serializable输出object
顺序是先转型,再装箱,再接口,再父类,最后可变长

Part7 内存模型与线程

1.评价服务性能:每秒事务处理数TPS(Transactions Per Second)

2.内存间交互操作

3.八种原则:

  1. volatile
上一篇 下一篇

猜你喜欢

热点阅读