jvm学习笔记
博客专区 > dyzhou 的博客 > 博客详情
jvm学习笔记
dyzhou 发表于2年前
jvm学习笔记
  • 发表于 2年前
  • 阅读 135
  • 收藏 16
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

摘要: 看了很多次周志明老师的《深入jvm》一书,每次都有新的学习体会,在此记录一下,写的比较随意,误入的人慎重参考。

java堆相关参数:
        起始值:-Xms
        最大值:-Xmx
        新生代分配内存设置:-Xmn
        

        内存溢出快照设置:-XX:+HeapDumpOnOutOfMemoryError
    -XX:HeapDumpPath=${目录}
       -XX:+PrintGCDetails: 产生gc详细日志;
       -XX:SurvivorRatio=  :设置eden区和survivor的大小比例

        实例:-verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:+PrintGCDetails -XX:SurvivorRatio=8
        说明:打印gc过程详细日志:设置堆最小内存20M,堆最大内存20M,设置新生代内存10M,打印gc详细日志,设置eden区和survivor区                              内存比例为8:1

        -XX:PretenureSizeThreshold:设置当对象大于该值时直接分配到老年代,防止在eden区发生大量的内存复制。
        
        -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -XX:+UnlockExperimentalVMOptions 打印出所有jvm启动参数

-Xms:初始堆大小
-Xmx:最大堆大小
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n:设置持久代大小
收集器设置
-XX:+UseSerialGC:设置串行收集器
-XX:+UseParallelGC:设置并行收集器
-XX:+UseParalledlOldGC:设置并行年老代收集器
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息
-XX:+PrintGC
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-Xloggc:filename
并行收集器设置
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)

JVM给了三种选择:串行收集器、并行收集器、并发收集器

class 加载七个阶段:

加载:1.通过类的全限定名获取定义此类的二进制流(类加载器实现);2.将字节流所代表的静态存储结构转化为方法区的运行时数据结构;3.生成java.lang.Class对象,作为方法区这个类的各种数据访问入口;

验证:连接的第一步,保证class文件字节流符合虚拟机要求;

准备:为类变量分配内存,设置类变量初始值,在方法区中进行分配;

解析:将常量池内的符号引用替换为直接引用,包括类或接口解析、方法解析、字段解析;

初始化:真正开始执行代码,clinit()方法执行,父类优先;clinit方法由编译器自动收集类中所有类变量的赋值和static{}块合并产生


类加载器:
    启动类加载器:bootstrap classloader,加载java_home\lib下jar包,根据名称加载,或加载-XBootclasspath参数所指定路径下jar包;
    扩展类加载器 :加载java_home\lib\ext下的类;
    应用程序类加载器(又叫做系统类加载器):负载加载用户类路径上所指定的类库

    双亲委派模型:如果一个类加载器收到了类加载请求,首先不会自己尝试加载这个类,而是把这个请求委派给父类加载器去完成,因此所有的请求都会被传递到顶层类加载器中;

JAVA对象内存结构
对象在内存中存储布局主要包含3个部分:
        对象头:包含2部分数据:1、对象自身运行时数据,如hashCode、GC分代年龄、锁状态标识、线程持有的锁等,长多为32bit(32位操作系统,未开启指针压缩)或64bit(64位操作系统);2、类元数据对象引用;
        实例数据
        对齐填充
    
java内存结构与GC


java执行引擎

java内存模型

共有 人打赏支持
粉丝 7
博文 8
码字总数 3684
×
dyzhou
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: