java内存与溢出
一.jvm_参数
-Xmx //最大堆内存
-Xms //最小堆内存
-Xmn //新生代内存
-XX:SurvivorRation //eden与survior比例
-XX:+HeapDumpOnOutOfMemoryError //内存溢出异常时Dump当前内存堆转储快照
-XX:+HeapDumpPath=/ww/1.dump.hprof //dump文件位置
-XX:+PrintGCDetails //打印GC日志
-XX:+PrintGCDateStamps //打印GC时间
-Xss //栈容量
-XX:PermSize //过期的方法区(永久代)容量
-XX:MaxPermSize //过期的方法区(永久代)最大容量
-XX:MetaspaceSize //元数据区除非FGC容量
-XX:MaxMetaspaceSize //无限制
-XX:+UseConcMarkSweepGC //使用CMS垃圾回收
-XX:+UseG1GC //G1
-Xloggc:log/gc.log //gc日志存放区
-XX:+PrintHeapAtGC //在gc的前后打印出堆的信息
-XX:PretenureSizeThreshold=3145728 //大对象直接老年代分配(只对Serial和ParaNew有效)
-XX:MaxTenuringThreshold //新生代年龄计数器阈值(超过则晋升老年代)
1:2
[New generation][old generation]
8:1:1
New Generation[eden:survivor1:survivor]
二.java内存
1.程序计数器
> 线程私有
> 而且是唯一一个虚拟机规范没有规定任何OOM的区域
2.虚拟机栈
>线程私有
>描述的java方法执行的内存模型
每一个方法从调用到执行完毕,就对应栈帧从虚拟机栈中入栈到出栈
JVM在此区域规定了另种异常:
1.线程请求的栈深度大于虚拟机栈允许的深度(StackOverFlowError)
2.扩展时无法申请到足够的内存(OOM)
3.本地方法栈
与虚拟机栈相似,只不过虚拟机栈执行的是java字节码
而本地方法栈则执行虚拟机使用到的native方法服务
4.堆
新生代 老年代
5.方法区
线程共享
存储一杯虚拟机嘉加载的类信息,常量,静态变量,即时编译后的代码等
也叫永久代(permanent generation)
jdk1.8->替换成了元数据区 Metaspace
6.直接内存
NIO可以使用Native函数直接分配堆外内存