应该会点JVM(一)

JVM内存区域和溢出

先上图


JVM的每个实例都有一个它自己的方法域和一个堆,运行于JVM内的所有的线程都共享这些区域;当虚拟机装载类文件的时候,它解析其中的二进制数据所包含的类信息,并把它们放到方法域中;当程序运行的时候,JVM把程序初始化的所有对象置于堆上;而每个线程创建的时候,都会拥有自己的程序计数器和java栈,其中程序计数器中的值指向下一条即将被执行的指令,线程的Java栈则存储为该线程调用Java方法的状态;本地方法调用的状态被存储在本地方法栈,该方法栈依赖于具体的实现。

JVM内存划分

  • 方法区
  • 虚拟机栈
  • 本地方法栈
  • 程序计数器
方法区:
存放类的信息,常量和静态变量等。
虚拟机栈:
java执行的内存模型,栈由栈帧组成,线程调用一个java方法时,创建一个栈帧,方法返回时,栈帧弹出。栈帧入栈出栈的过程就是方法开始结束的过程。
本地方法栈:
和虚拟机栈作用类似,只不过服务对象不同,本地方法服务对象是非java方法,虚拟机栈服务对象是java方法。
堆:
存放对象,对象要在堆上分配内存,堆分年轻代和年老代,年轻代分为伊甸区(Eden space)和幸存者区(Survivor space),幸存区分为from和to空间。
程序计数器:
因为cpu的每个核心只能同时运行一个线程,所以当一个线程执行完时间片后切换到另一个线程,切换时为了能恢复到正确的执行位置,所以需要程序计数器(学过计算机组成原理的应该比较熟悉)。


  • 总结
 jvm的内存区域划分为程序计数器,虚拟机栈,本地方法栈,方法区,堆。
程序计数器,虚拟机栈和本地方法栈都是线程独享的,而方法区和堆是线程共享的。


溢出
当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出。

两种常见的溢出异常,一种OutOfMemoryError(OOM),一种StackOverflowError。


设置各区JVM的参数  

设置堆的最小值-Xms,堆的最大值-Xmx

设置永久代(jdk8之前用永久代来实现方法区)的最小值-XX:PermSize ,最大值-XX:MaxPermSize

设置栈容量-Xss



猜你喜欢

转载自blog.csdn.net/lianhao19900202/article/details/78952643