jvm 诊断与优化 (1)


jvm分为: java

  1. 类加载子系统 : 负责从网络或文件系统中加载类
  2. 垃圾回收系统 : 对方法区,java堆,直接内存,进行回收。负责对象的管理
  3. 执行引擎 : 负责执行字节码

{ 受到GC管理(线程共享) c++

  1. java堆  : 在jvm启动时建立,主要的内存工做区域。java全部对象实例都放在其中,是全部线程共享的
  2. 方法区 (持久区PermSize):存放常量(字符串数字)和类加载后的信息
  3. 直接内存 : 指操做系统中的内存,java能够向系统申请。访问比堆来的快

}{为每一个线程私有空间 网络

  1. java栈 :一个线程启动时建立线程都有各自的栈,保存着局部变量,方法参数。和方法的调用,返回密切相关
  2. 本地方法栈 : 与java栈相似,用于本地方法的调用(c,c++)
  3. pc寄存器 : 是每一个线程的私人空间

} jvm

设置最大空间256MB(按需分配),  初始空间50MB spa

java -Xmx256M    -Xms50M         // 代码中查看: Runtime.getRuntime().maxMemory() 操作系统

设置线程最大的空间,128K, 决定java嵌套调用的最大层次 线程

(说明:java每嵌套调用一个方法就会向java栈中压入一个栈帧①。调用的层次越多栈内存就消耗的越多。当栈内存已经没法支付方法的调用时抛出StackOverflowError) 代理

java -Xss128K  对象

设置方法区的初始与最大使用空间分别为5MB和64MB 内存

java -XX:PermSize=5M -XX:MaxPermSize=64M            //jdk6 , jdk7 设置

(说明:分配越大的空间,就能够加载越多的类。动态代理可能会建立大量并加载大量的类。

在jdk8中的设置: java -XX:MaxMetaspaceSize64M。在jdk中若是不设置大小,虚拟机可能会耗尽全部的系统内存,由于它用的是直接内存。)

①栈帧:{

1.局部变量表:用于存在方法的参数与局部变量,仅仅是变量名,其引用指向堆中

2.操做数据栈:保存计算过程的中间结果,一个临时的存储空间

3.帧数据区: 常量池解析,方法的返回结果,与异常的处理

}

相关文章
相关标签/搜索