1:java程序运行图解
###2:java虚拟机的组成部分
-
栈(线成):储存Java运行程序的局部变量
-
栈帧:栈运行时储存单个方法的局部变量区域(一个栈线成运行可能运行多个方法,运行几个方法就有几个栈帧)
-
程序计数器:用来记录马上或者将要执行的程序的行号(位置)
-
操作数栈:储存方法运行时产生的临时数(例:int a=10,10就是操作数)
-
方法出口:就是你在一个方法中调用另一个方法执行的时候,把运行了另一个方法之后要回到的位置信息存储到方法出口中(例如在main方法中调用compute()方法,compute()方法执行之后如果要回到main中,那么这个时候main的程序从哪里开始执行?当然调用compute()方法的下一行了)
-
堆:java New出来的对象放在堆里 (但是用来接收对象的局部变量放在栈里,(栈里存放的是放在堆里面对象的内存地址))
-
方法区:(jdk1.8之后改名为元空间(主要存放常量+静态变量+类信息))
-
类信息:编译之后的class文件(元空间使用的是我们机器的物理内存)
-
本地方法栈:java底层的java方法,可以与特定语言交互,或者底层库等都是本地方法栈(说白了就是一些你调用的库或者其他(不是你的写的,是你调用的别人的(别人指底层)))
-
注意点:每个线程独有的包括:栈(线成),本地方法栈,程序计数器。线程共有的:堆,方法区(元空间)
-
堆: 当我们new对象的时候,会把对象都储存在堆年轻代的伊甸园(Eden)里,如果储存满之后,会进行一次minor gc 进行垃圾回收,回收部分对象,剩余没有回收的到s0,等下次伊甸园再次满的时候,minor gc 会扫描伊甸园和s0进行垃圾回收,然后把对象放到s1,等再满的时候,minor gc 会扫描伊甸园和s1把对象放到s0,这样周而复始,到达一定次数之后,会把对象放到老年代。(每次minor gc 没有没回收的对象年龄都会增加1)
2:javaJVM调优目的
- 因为要减少full gc的次数
- 减少full gc 的时间
3:STW(Stop the world)机制
- JVM进行full gc时会停掉程序的所有进程,直到full gc 完成,这个就是STW机制