武汉IT培训 > 达内新闻
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机也就是JVM是实现这一特点的关键。那么JVM结构及工作方式是怎样的呢?达内java培训专家为大家介绍一下:
一、JVM体系结构
主要包括(PC寄存器,栈,)(堆,方法区,)本地方法区
一个Java线程中,包括PC寄存器(保存当前执行的指令位置),和栈帧(一个方法对应一个栈帧),本地变量(保存计算中的临时数据),当一个线程结束后,线程内所有数据就自动销毁,不需要垃圾回收。
1、PC寄存器和栈
将1压入栈中,将2压入栈中,将1,2弹出计算1+2,将3压入栈顶,OVER。
2、方法区:
方法区是堆的一部分,就是java的永久区PermGen。
在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中。
方法区也属于java堆得不部分,也就是我们常说的java堆中的永久区。这个区域可以被所有的线程共享,并且它的大小可以通过参数来设置。
3、本地方法区
本地方法区是为了JVM运行native方法(c/c++等语言写的方法)准备的区。
二、内存分配方式:
1、静态内存分配:
在编译时确定需要的内存空间,当程序加载时系统把内存一次性分配给它。静态内存分配是在java栈上分配的,当方法结束时对应的栈帧也就撤销,所以分配的内存空间就被回收。
public void staticData(int arg){//int类型占4个字节
String s="haha";//引用类型占4个字节,(常量池中)
long l=1.00;//long占8个字节
Long lg=1L;//原生类型,这里是引用引用占4个字节(常量池中)
Object o=new Object();//(堆中)
}
上面一段代码会占用内存空间4+4+8+4+4=24。
2、动态内存分配:
程序执行的时候才知道要分配的内存大小,当对象创建的时候,在堆上给对象分配一块空间,空间回收时间不定,由JVM垃圾回收器管理。
三、垃圾回收算法
达内java培训专家提示:新创建的对象会分配到Young的Eden上,如果Eden满了就触发MinorGC,将Eden区中存活的对象保存到Survivor的一个区中,同时将Survivor另一个区存活的对象也保存到Survivor这个区中,Survivor区始终有一个区是空的。
survivor的一个区满了之后,会将对象直接放到Old区,Old区满了会触发FullGC,将回收整个堆空间。
perm区主要保存class对象,垃圾回收也是FullGC触发
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机也就是JVM是实现这一特点的关键。那么JVM结构及工作方式是怎样的呢?达内java培训专家为大家介绍一下:
一、JVM体系结构
主要包括(PC寄存器,栈,)(堆,方法区,)本地方法区
一个Java线程中,包括PC寄存器(保存当前执行的指令位置),和栈帧(一个方法对应一个栈帧),本地变量(保存计算中的临时数据),当一个线程结束后,线程内所有数据就自动销毁,不需要垃圾回收。
1、PC寄存器和栈
将1压入栈中,将2压入栈中,将1,2弹出计算1+2,将3压入栈顶,OVER。
2、方法区:
方法区是堆的一部分,就是java的永久区PermGen。
在一个jvm实例的内部,类型信息被存储在一个称为方法区的内存逻辑区中。类型信息是由类加载器在类加载时从类文件中提取出来的。类(静态)变量也存储在方法区中。
方法区也属于java堆得不部分,也就是我们常说的java堆中的永久区。这个区域可以被所有的线程共享,并且它的大小可以通过参数来设置。
3、本地方法区
本地方法区是为了JVM运行native方法(c/c++等语言写的方法)准备的区。
二、内存分配方式:
1、静态内存分配:
在编译时确定需要的内存空间,当程序加载时系统把内存一次性分配给它。静态内存分配是在java栈上分配的,当方法结束时对应的栈帧也就撤销,所以分配的内存空间就被回收。
public void staticData(int arg){//int类型占4个字节
String s="haha";//引用类型占4个字节,(常量池中)
long l=1.00;//long占8个字节
Long lg=1L;//原生类型,这里是引用引用占4个字节(常量池中)
Object o=new Object();//(堆中)
}
上面一段代码会占用内存空间4+4+8+4+4=24。
2、动态内存分配:
程序执行的时候才知道要分配的内存大小,当对象创建的时候,在堆上给对象分配一块空间,空间回收时间不定,由JVM垃圾回收器管理。
三、垃圾回收算法
达内java培训专家提示:新创建的对象会分配到Young的Eden上,如果Eden满了就触发MinorGC,将Eden区中存活的对象保存到Survivor的一个区中,同时将Survivor另一个区存活的对象也保存到Survivor这个区中,Survivor区始终有一个区是空的。
survivor的一个区满了之后,会将对象直接放到Old区,Old区满了会触发FullGC,将回收整个堆空间。
perm区主要保存class对象,垃圾回收也是FullGC触发
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城