Java虚拟机(五)JVM参数和调优

本地线程分配缓冲(TLAB)

Java虚拟机遇到 new 指令时,需要在堆内存上为新对象分配内存空间。如果堆是规整的,一边是分配过的内存,一边是空闲内存,那只要在中间用一个指针隔开,为新对象分配内存时,指针往后移动相应的空间距离即可。

pointer_move

然而,在多线程环境下,线程A和线程B同时为新对象分配内存,线程A还没来得及改指针位置,线程B也使用了这个位置来分配内存,就会出现问题。有两种方法解决这个问题,第一是采用同步,事实上虚拟机采用的 CAS 失败重试的方式来保证更新内存的原子性。第二种是本地线程分配缓冲(Thread Local Allocation Buffer)。

本地线程分配缓冲会在 Java 堆内存里预先分配一小块内存专门给某个线程用来分配空间,所以不同的线程分配内存是在不同的位置。这样就不会导致冲突。只有当 TLAB 用完并分配新的缓冲区时,才需要同步锁定。

阅读更多

Java虚拟机(四)垃圾回收策略

GC.png

Java虚拟机(二)内存模型和对象创建 这一篇中,我们知道 Java 虚拟机的内存模型包含五个部分:程序计数器、Java虚拟机栈、本地方法栈、堆、方法区。这五个区域也叫运行时数据区域(Runtime Data Area),他们是数据的存储空间。既然是存储空间,那就有可能达到存满的时候,因此,JVM必须配备一个垃圾回收器(Garbage Collection, GC),用于不定期地回收不再需要的内存空间。

事实上,Java的动态内存分配和回收技术已经相当成熟,作为开发者的我们无需手动去分配和释放内存,一切都交给Java虚拟机。那为什么我们还要去了解 GC 和 内存放配呢?原因是:当需要排查各种内存溢出、泄露等问题,或当垃圾收集称为系统达到更高并发量的瓶颈时,我们有必要对这些“自动化”的技术进行监控和调节。

阅读更多

Java虚拟机(三)Class文件结构

class 文件简介

class 文件是javac编译器编译后生成的二进制文件,全部是连续的0/1。可以把 class 文件中的内容分为两种类型:

  1. 无符号数:表示class文件中的值,没有符号,但有长度。u1、u2、u4、u8 (u1表示1字节的无符号数)
  2. :无符号数要么单独存在,要么多个组合成为二维表。

总而言之,class文件中的数据要么是单个值,要么是二维表。


class 文件的组织结构一览

  1. 魔数
  2. 本文件的版本信息
  3. 常量池
  4. 访问标志
  5. 类索引
  6. 父类索引
  7. 接口索引集合
  8. 字段表集合
  9. 方法表集合
阅读更多

Java虚拟机(一)JVM 基础和类的加载

什么是Java虚拟机

Java的理念是“一次编译,到处运行”。我们平时编写的 Java 代码,经过Java编译器编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机(Java Virtual Machine,JVM)就是负责将字节码文件翻译成特定平台下的机器码然后运行的软件,其本身是由C/C++编写

dotclass

JVM 如何让 Java 程序跨平台?

JVM 将字节码翻译成机器码然后运行,也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件,运行我们编写的 Java 程序。

而这个过程,我们编写的 Java 程序没有任何改变,仅仅是通过 JVM 这一 “中间层” ,就能在不同平台上运行,真正实现了 “一次编译,到处运行” 的目的。 需要注意的是,JVM 本身是用 C/C++ 开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的 JVM。

JVM

阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×