Java第一刀 内存结构

Java第一刀 内存结构

关键字

  • 线程
  • gc
  • 直接内存

正文

  • 堆 :在虚拟机启动时创建,可以通过Xms、Xmx来设置大小,是所有线程共享的数据区。堆中存放的是对象的实例,gc时主要对这块内存进行回收。
  • 方法区:是所有线程共享的数据区,用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。
  • 运行时常量池:是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加载后放到方法区的运行时常量池中
  • 虚拟机栈:是线程私有的。方法在被调用时,会创建一个栈帧,栈帧里包含了变量表(包括参数)、操作栈、方法出口等信息。方法从调用到完成,就对应着一个栈帧从虚拟机栈入栈到出栈的过程。
  • 本地方法栈:本地方法栈与虚拟机栈作用相似,区别在于虚拟机栈执行的是java方法服务,本地方法栈执行的是Native方法服务
  • 直接内存:它不是java运行时数据区的一部分。直接内存的解决的问题是,减少一次系统调用,减少垃圾回收,使用不当会造成内存泄漏,需要自己去回收这块内存。如在编写网络代码时,要将消息flush到远程,先要把数据从堆内存复制到直接内存,使用直接内存则减少了一个步骤,可以参考java.nio.DirectByteBuffer。

如下图

关键字说明

  • 线程

    业务在单线程处理时,对一个数据的操作是有序的,所以是线程安全的.
    业务在多线程处理时,由于堆是被所有线程共享,多个线程对一个数据的操作是无序的,数据修改后的最终的是不可预知,从而引起线程安全问题。在多线程下,方法里的变量也是线程安全的,由于虚拟机栈是线程私有的

  • gc

    gc,是java的一个重要特性。jdk里提供了System.gc()的方法,上面提到过的直接内存,就需要自己调用这个方法进行垃圾回收。这个方法调用时,做一次fullgc,执行后会暂停整个进程。

  • 直接内存

    网络编程,直接内存用的最多的场景。如netty,为了减少一次io复制,使用直接内存。

总结

这一篇简单的介绍了java的内存结构,以及内存结构与线程、gc之间的联系。

参考资料

《深入理解Java虚拟机》 周志明

JackLei
JackLei

我是真的不会修电脑