zoukankan      html  css  js  c++  java
  • jvm8内存模型和内存分配

      在JVM中,是通过线程轮流切换时间来获得CPU,因此在同一刻时间,一个CPU只能执行一条线程命令

      1.java中内存的分布?

      JVM 执行的过程。①加载class文件 ②管理并分配内存 ③执行垃圾收集  

      内存结构图:

      

      栈

      java栈中,存放一个个栈帧,每一个栈帧对应一个被调用方法,在栈帧中包含局部变量表、操作数栈、指向运行时常量池的引用,方法的返回地址,和一些附加信息,

      方法执行完毕之后,便会将栈帧出栈。当一个新的线程被创建时,java虚拟机会分配一个虚拟机栈,每一个线程都拥有一个栈,虚拟机栈式以栈帧的形式存在,每一个方法都有自己唯一的常量池

      

      

      java中堆是用来存放对象本身和数组,堆被所有的线程共享,在JVM中,只有一个堆。就是存放对象实例的区域。JVM8中把运行时常量池、静态变量也移到堆区进行存储

      方法区

      和堆一样,被所有的线程共享,在方法区中,存储每一个类的信息,包括方法名称、方法信息、静态变量、常量以及编译后的代码。

      在方法区中,有一个非常重要的部分,就是运行时常量池,它是每一个类和接口的常量运行时表示形式,在类和接口被加载到JVM后,

      对应的运行常量池就会被创建,当然并非class文件常量池的内容才能进入运行常量池,在运行期间,可将新的常量放入到常量池中。

      虚拟机中提供了参数,来控制堆和方法区的大小,剩下的就分配给栈,每个线程分配的栈越大,建立的线程数就越小,因此建立过多的

      线程会导致内存溢出,因此只能通过减少堆内存和栈容量来创建更多的线程。


    java8 中对方法区进行了改造

  • 相关阅读:
    值得收藏的146条经典民间偏方[转]
    删除暴风文件夹内的stormliv.exe
    【转】VLAN技术浅谈
    [转载]双击.dsw文件时另开VC6.0,而不会关掉原来已打开的项目的解决办法(转载)
    JVM系列1:Java内存区域
    并发系列3:Lock锁以及核心类AQS
    并发系列1:并发基础知识
    JVM系列2:垃圾收集器与内存分配策略
    JVM系列3:类加载机制
    源码解析之AQS源码解析
  • 原文地址:https://www.cnblogs.com/chengyangyang/p/10837996.html
Copyright © 2011-2022 走看看