Java 内存模型简介

137 阅读2分钟

  1. 程序计数器

CPU给每个线程分配时间片轮流执行,每个线程都有自己的程序计数器来记录线程执行地址

  1. java虚拟机栈

存储方法执行中的局部变量、返回值、返回地址、运行时常量信用等信息

  1. 本地方法栈

存储本地方法执行过程中的信息

存储类对象本身、数组等,包括 - 新生代 - eden - servivor - from - to - 老年代 - 永久代

  1. 方法区

存储类信息(方法名称,字段信息,类名称)、常量、静态成员变量。

垃圾回收主要是对堆中的新生代进行垃圾回收 新生代每次只使用一个eden和一servivor(from),当空间不够容纳新对象时,将存活对象复制到to区域,若还是不够,进行垃圾回收,若还不够,会将达到一定次数的存活对象复制到老年代,若容量还是不够,会查看老年代容量,若老年代也不够,则进行full gc

新生代每次需要回收大量对象,采用标记复制算法 老年代采用标记整理算法进行垃圾回收

1.新生代默认回收15轮后存活的对象复制到老年代

2.新生代 eden:from:to=8:1:1

3.新生代:老年代=1:2

调优设置

1.整个堆内存包括新生代,老年代,持久代。新生代增大将会减小老年代,新生代会经常进行垃圾回收,对系统性能影响较大,推荐大小是堆的3/8

2.设置每个线程的堆栈大小,jdk1.5后默认大小是1m,一般一个进程内的线程数控制在3000-5000

3.当内存溢出时,自动生成堆内存快照

4.当内存发生溢出时,可以执行一些指令,比如给管理员发送邮件或者执行清理工作

5.永久代的大小最大为物理内存的1/16,最小1/64

6.对于容量达到一定值的对象通过设置可直接分配到老年代,避免在新生代复制


** 三人行必有我师,欢迎大家指点学习**