jvm分为:
- 类加载子系统 : 负责从网络或文件系统中加载类
- 垃圾回收系统 : 对方法区,java堆,直接内存,进行回收。负责对象的管理
- 执行引擎 : 负责执行字节码
{ 受到GC管理(线程共享)
- java堆 : 在jvm启动时创建,主要的内存工作区域。java所有对象实例都放在其中,是所有线程共享的
- 方法区 (持久区PermSize):存放常量(字符串数字)和类加载后的信息
- 直接内存 : 指操作系统中的内存,java可以向系统申请。访问比堆来的快
}{为每个线程私有空间
- java栈 :一个线程启动时创建线程都有各自的栈,保存着局部变量,方法参数。和方法的调用,返回密切相关
- 本地方法栈 : 与java栈类似,用于本地方法的调用(c,c++)
- pc寄存器 : 是每个线程的私人空间
}
设置堆最大空间256MB(按需分配), 初始空间50MB
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.帧数据区: 常量池解析,方法的返回结果,与异常的处理
}