终于有人将jvm讲清楚了,阿里架构师推荐jvm架构解析

一、JVM 内存区域划分

  • 程序计数器(线程私有)

程序计数器(Program Counter Register),也有称作为 PC 寄存器。保存的是程序当

前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当 CPU 需要执

行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得

到的地址获取到指令,在得到指令之后,程序计数器便自动加 1 或者根据转移指针得到下

一条指令的地址,如此循环,直至执行完所有的指令。也就是说是用来指示执行哪条指令的

由于在 JVM 中,多线程是通过线程轮流切换来获得 CPU 执行时间的,因此,在任一

具体时刻,一个 CPU 的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都

在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数

器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这么说,程序

计数器是每个线程所私有的。

在 JVM 规范中规定,如果线程执行的是非 native 方法,则程序计数器中保存的是当前

需要执行的指令的地址;如果线程执行的是 native 方法,则程序计数器中的值是 undefined。

由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对

于程序计数器是不会发生内存溢出现象(OutOfMemory)的。

  • 本地方法栈(线程私有)
  • 方法区直接内存

2.JVM 执行子系统

  • Class 类文件结构
  • 字节码指令

  • 类加载机制类加载器Tomcat 类加载机制方法调用详解

3.垃圾回收器和内存分配策略

  • Java 中是值传递还是引用传递?

  • 引用类型

  • 基本垃圾回收算法

  • 分代处理垃圾

  • JAVA 中垃圾回收 GC 的类型

编写高效优雅 Java 程序

  • 面向对象

  • 方法

1 可变参数要谨慎使用

可变参数是允许传 0 个参数的

如果是参数个数在 1~多个之间的时候,要做单独的业务控制。

看代码

2 返回零长度的数组或集合,不要返回 null

方法的结果返回 null,会导致调用方的要单独处理为 null 的情况。返回零长度,调用方可以

统一处理,如使用 foreach 即可。

JDK 中也为我们提供了 Collections.**EMPTY_LIST **这样的零长度集合

3 优先使用标准的异常

要尽量追求代码的重用,同时减少类加载的数目,提高类装载的性能。

常用的异常:

IlegalAraumentException -- 调用者传递的参数不合适

lllegalStateException – 接收的对象状态不对,

NullPoint

UnsupportedOperationException –不支持的操作

  • 通用程序设计

1 用枚举代替 int 常量

声明的一个枚举本质就是一个类,每个具体的枚举值就是这个枚举类的实例。

枚举更多作用,看代码。

2 将局部变量的作用域最小化

1. 在第一次使用的地方进行声明

2. 局部变量都是要自行初始化,初始化条件不满足,就不要声明

最小化的好处,减小局部变量表的大小,提示性能;同时避免局部变量过早声明导致不正确

的使用。

3 精确计算,避免使用 float 和 double

可以使用 int 或者 long 以及 BigDecimal

4 当心字符串连接的性能

参考代码
com.xiangxue.ch04.StringUnion15.Test。

在存在大量字符串拼接或者大型字符串拼接的时候,尽量使用 StringBuilder 和 StringBuffer

性能优化

  • 常用的性能评价/测试指标

  • 常用的性能优化手段
  • 应用服务性能优化
  • 异步

  • 集群
  • 应用相关
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值