分类 Java 相关 下的文章

关于 java 的 finalize() 方法,Finalizer类, Finalizer 线程, 以及这些对象的GC

  1. 若一个类实现Object类的 finalize() 方法, 当去实例化这个类当时候,JVM会自动创建一个Finalier实例;
  2. 这个Finalizer实例会refer 这个带有finalize的实例,并且这个Finalizer类会自动被加到一个全是Finalizer的链表结构中;
  3. Finalizer 类有个static的ReferenceQueue的队列, 这个队列里面存的是上面提到的Finalizer. 当且仅当没有其它对象引用这个带有finalize()方法的对象, 仅剩一个Finalizer引用它的时候, 它对应的这个Finalizer 就会被GC 线程加入这个queue.
  4. 还有一个Finalizer 线程, 它会从上面提到的这个block ReferenceQueue中拿Finalizer, 然后去执行它对应实例的finalize() 方法, 然后从队列中去除它;
  5. Finalizer 线程相对于其它线程, 优先级比较低, 所以有竞争时分配的时间比较少;
  6. 更多实例 参看: https://plumbr.io/blog/garbage-collection/debugging-to-understand-finalizer

JVM 常见的参数

//jit 编译器类型

  • -client //32位 client, 启动早, 编译不耗时
  • -server //32位 server, 启动晚, 编译耗时, 最终代码更优化,更快
  • -d64 //64位
  • -XX: TieredCompilation //必须使用 server 编译器, 先 client, 再 server 重新编译
  • -XX:InitialCodeCacheSize=N //初始 code cache 值, 可以通过 jconsole 查看
  • -XX:ReservedCodeCacheSize=N //最大 code cache 值
    //编译开始的 threshold, 不是全局累加计数, 而是移动区间计数
  • -XX:PrintComplilation //打印编译日志 可以通过 jstat 查看编译的统计信息或 jconsole
  • -XX:CompileThreshold=N //是否启动编译的 threshold (方法调用计数器 循环回边计数器)
  • -XX:OnStackReplacePercentage=N //OSR 的 threshold 值, 需要通过公式计算次数
  • -XX:CICompilerCount=N //编译器的线程数
  • -XX:Printflagsfinal 启动时打印所有标志 flags;
  • -XX:+Inline //内联 默认是 true
  • -XX:+DoEscapeAnalysis //逃逸分析 默认是 true

//GC refer: https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/collectors.html

  • -XX:+UseSerialGC
  • -XX:+UseParallelGC
  • -XX:-UseParallelOldGC
  • -XX:+UseConcMarkSweepGC
  • -XX:+UseParNewGC
  • -XX:+UseG1GC

//GC log refer: https://dzone.com/articles/enabling-and-analysing-the-garbage-collection-log

  • -XX:+PrintGC

  • -XX:+PrintGCDetails

  • -XX:+PrintGCTimeStamps

  • -XX:+PrintGCDateStamps

  • -Xloggc:

  • -XX:+PrintGCApplicationStoppedTime

  • -XX:+PrintGCApplicationConcurrentTime

  • -XX:+UseGCLogFileRotation

  • -XX:NumberOfGCLogFiles=5

  • -XX:GCLogFileSize=2000k

  • -XX:ParallelGCThreads=N //并发启动的GC 回收线程数目

  • -XX:+DisableExplicitGC

//heap related

  • -Xms //heap start eg: -Xms3000m
  • -Xmx //heap max eg: -Xmx:4000m
  • -XX:NewRatio=N //新生代和老年代占比用比率, default 2. 新生代大小=总堆大小/(1+NewRatio)
  • -Xns //Nursery Start eg: -Xns800m
  • -XX:NewSize=N //新生代初始大小
  • -XX:MaxNewSize=N //新生代最大值
  • -XX:PermSize=N //永久带初始大小
  • -XX:MaxPermSize=N //永久带最大值
  • -XX:MetaspaceSize=N //java8 元空间初始大小
  • -XX:MaxMetaSpaceSize=N //java8 元空间最大值
  • -XX:+PrintAdaptiveSizePolicy //打印自适应策略相关信息
  • -XX:+UseAdaptiveSizePolicy //使用自适应策略. 若xms,xmn,xns固定死,则不使用

//JFR

  • -XX:UnlockCommercialFeatures
  • -XX:+flightRecorder

jdk 自带工具集

  1. jcmd 打印 jvm 的基本类, 线程, VM等信息. 查看 GC 参数, JVM系统变量, 参数 flags, VM 参数存活时间, 做 dump, 打开商业 feature 等. jcmd help;
  2. jmap 产生 heap dump, 打印 histogram 和永久带统计 permanent generation statistics;
  3. jhat 读取 heap dump 进行分析,启动 web 端口, 供查看;
  4. jinfo 查看 JVM 系统属性, 并可以设置某些信息, 参数等
  5. jstack 产生 thread dump, 或打印 thread 锁的情况;
  6. jstat JVM 监控统计信息, 如 GC, jit编译器, 类等;
  7. jconsole 图形化 JVM 线程, 类, 内存, GC 等情况;
  8. jvisualvm 监视 JVM 的图形工具, 抓取和分析 dump;
  9. JMC

基于 Java 的互联网应用 应该监控那些指标

  • 操作系统层面
  1. cpu 使用率;
  2. 内存使用率;
  3. 磁盘使用情况;
  4. 网络使用情况;
  • JVM 层面
  1. Jvm cpu 使用情况;
  2. gc overhead;
  3. gc count;
  4. gc 每次回收后的使用情况;
  5. jfr 的重要指标;
  6. Jvm memory available;
  7. oom error count;
  • 应用层面
  1. tps/ops;
  2. transaction time;
  3. 5xx count;
  4. 4xx count;
  5. app busy threads;
  6. app total thread count;
  7. error count;

设置 https proxy

问题:

Java 实现:

参看:
https://stackoverflow.com/questions/516323/https-connections-over-proxy-servers
https://wiki.squid-cache.org/Features/SslBump
https://wiki.squid-cache.org/Features/SslPeekAndSplice
https://www.javaworld.com/article/2077475/core-java/java-tip-111--implement-https-tunneling-with-jsse.html