java 深入jvm虚拟机_深入理解Java虚拟机JVM

JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.exe来完成,通过下面4步来完成JVM环境.

1.创建JVM装载环境和配置

2.装载JVM.dll

3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例

4.调用JNIEnv实例装载并处理class类。

395c08b3b8ca255d77c5c3e1853a1adc.png

堆、栈、方法

栈是运行时的单位,而堆是存储的单位。

栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;

堆解决的是数据存储的问题,即数据怎么放、放在哪儿。

在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同因此需要一个独立的线程栈。

而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当线程(或程序)相关信息的。

包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。

堆中存的是对象。栈中存的是基本数据类型和堆中对象的引用。

堆和栈中,栈是程序运行最根本的东西。程序运行可以没有堆,但是不能没有栈。而堆是为栈进行数据存储服务,说白了堆就是一块共享的内存。

不过,正是因为堆和栈的分离的思想,才使得Java的垃圾回收成为可能。

Java中,栈的大小通过-Xss来设置,当栈中存储数据比较多时,需要适当调大这个值,否则会出现java.lang.StackOverflowError异常。

常见的出现这个异常的是无法返回的递归,因为此时栈中保存的信息都是方法返回的记录点。

6c50ca5ffff69a871dba37c4cd8f7df0.png

其中:

1.堆:用于存储数据

2.栈:用于解决程序的运行问题

3.方法区:辅助堆栈的一块永久区,解决栈堆信息的产生,此为先决条件。

如图:当创建一个新对象,User类的信息开始都存放在方法区。当User类实例化后,类信息被存储到java堆中的一块内存,使用时,都是使用栈中User对象的引用。

d2e08da80b427b281baca8412b3bd3a3.png

java堆完全自动化管理,通过垃圾回收机制,垃圾对象自动清理,无需显示地释放。

其中:

1.java对有许多不同结构,最常见的就是将整个队分为新生代和老年代。

2.新生代分为eden区、s0区(或from区)、s1区(或to区),s0与s1大小相等且可互换。

3.eden:伊甸园:java对象刚new出来时,这个实例化对象是放在eden区的,经过一系列操作后,执行gc,对象被分配到s0区或者s1区(不可能既存放在s0也存放在s1               区),最后进入老年代。

4.为什么会分为s0和s1区呢?

因为新生代产生对象太频繁,当有一大堆对象同时进行gc操作时(其中有源源不断的对象产生),其中有部分可能会进入老年区,有部分可能还存活,虚拟机        操作就将存活的那部分复制到另一块区(s0或者s1),当前所在的区(s0或者s1)则执行truncat摧毁,也就是将剩余未存活的一次性进入老年区,也就是清理空间。

http://www.cnblogs.com/cailijia52o/p/9096239.html

http://www.cnblogs.com/stateis0/category/1206894.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值