zoukankan      html  css  js  c++  java
  • 深入理解Java虚拟机JVM

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

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

    2.装载JVM.dll

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

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

    堆、栈、方法

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

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

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

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

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

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

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

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

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

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

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

     

    其中:
      1.堆:用于存储数据

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

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

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

     

    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

  • 相关阅读:
    [LeetCode] 981. Time Based Key-Value Store
    [LeetCode] 97. Interleaving String
    [LeetCode] 953. Verifying an Alien Dictionary
    代价敏感的学习方法
    深度学习中Dropout原理解析
    梯度下降法的三种形式BGD、SGD以及MBGD
    吉布斯采样(Gibbs Sampling)简介(转)
    Java中next()和hasNext() ? nextLine()和hasNextLine()?区别详解
    红黑树介绍及旋转详解
    Pycharm中实现openCV安装好后简单测试
  • 原文地址:https://www.cnblogs.com/cnki/p/8834256.html
Copyright © 2011-2022 走看看