腾讯云
开发者社区
文档
建议反馈
控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
搜索
搜索
关闭
发布
登录/注册
首页
学习
活动
专区
工具
TVP
最新优惠活动
返回腾讯云官网
EffectiveCoding
专栏作者
举报
113
文章
97057
阅读量
28
订阅数
订阅专栏
申请加入专栏
全部文章
java
编程算法
go
jvm
云数据库 Redis
linux
打包
api
缓存
kafka
http
c++
ide
数据结构
文件存储
存储
jdk
hashmap
分布式
网络安全
数据库
unix
spring
批量计算
tcp/ip
事件总线
javascript
node.js
jquery
单片机
云数据库 SQL Server
sql
mvc
nginx
网站
企业
压力测试
aop
gcc
安全
windows
https
系统架构
架构设计
微服务
负载均衡
其他
c 语言
lua
bash
servlet
jsp
html
android
nosql
memcached
struts
tomcat
消息队列 CMQ 版
serverless
shell
面向对象编程
dns
spring boot
zookeeper
grep
rpc
udp
kernel
数据处理
dynamic
heap
path
架构
系统
性能
性能优化
优化
搜索文章
搜索
搜索
关闭
JVM Advanced JIT Compiler Options
打包
java
jvm
缓存
编程算法
JIT相关编译选项 Advanced JIT Compiler Options -XX:+AggressiveOpts 最核心的应该是加快编译,在JDK 6之后就默认启用的,启用一些诸如编译优化、偏向锁、并行化老年代收集策略。通常是不用管的,默认的优化策略,添加此参数的原因是为工程提供一个优化技术选择的空间。 -XX:AllocateInstancePrefetchLines=lines 在实例分配指针之前设置要预取的行数。默认情况下,要预取的行数设置为1。- xx:AllocateInstancePrefetchLines = 1只有Java HotSpot服务器VM支持这个选项。
邹志全
2020-02-25
1.3K
0
JVM Advanced Serviceability Options
jvm
dynamic
heap
path
Advanced Serviceability Options 这个系列的参数其实就是用来问题发生时来打印详细信息帮助分析的。 -XX:+ExtendedDTraceProbes 启动Dtrace探测器。 注:Dtrace,Dynamic tracing 即动态跟踪。通常用于性能跟踪,方便发现系统的瓶颈,及待提升之处。 -XX:+HeapDumpOnOutOfMemory 当发生OOM时转储Heap,这个选项最好开一下。有利于分析问题。 -XX:HeapDumpPath=path 堆转储文件路径
邹志全
2020-02-25
664
0
JVM Advanced Runtime Options
jvm
高级运行时选项(Advanced Runtime Options): -XX:+UnlockCommercialFeatures 开启商业选项,许多商业特性都需要这个选项的支持。 -XX:+CheckEndorsedAndExtDirs jdk 8中新增加的一个参数,有兴趣的可以去看看openjdk中的关于这一块的实现(http://hg.openjdk.java.net/jdk8u/hs-dev/hotspot/rev/fa6adc194d48) 这个参数是用来阻止Java 命令运行应用(除非没有用到endorsed-standards override机制&扩展机制)。 同时,这个选项会检查应用是否启动了以下机制 1、java.ext.dirs 或 java.endorsed.dirs 属性被设置 2、lib/endorsed 目录存在 && 不为空 3、lib/ext 目录下包含了除JDK以外的JAR 4、系统范围内 特定于平台的扩展目录中包含任何JAR文件 -XX:+DisableAttachMechanism 启动此参数之后,JVM将禁止任何工具连接,通常情况下这个选项是关闭的。外部工具指的是 jstack、jmap、jinfo等JVM辅助分析工具。 -XX:ErrorFile=filename 用于当出现致命错误时,指定一个目录,用来存储Error信息。默认为当前目录下的hs_err_pidpid.log,也就是 filename=./hs_err_pidpid.log -XX:+FailOverToOldVerifier 当新的类型检查失败时,自动使用老的验证器。默认这个是关闭的,但是当我们需要时使用老版本的字节码的时候则需要开启这个选项。 -XX:+FilghtRecorder 嗯。Java 就是性能记录。这是一个商业特性,和 -XX:+UnlockCommercialFeatures 选项一起使用如果这个选项开启了,那么JVM的性能记录是不可用的。 -XX:-FilghtRecorder 嗯,又是性能记录。关闭了 -XX:FilghtRecorderOptions={ parameter=value、 defaultrecording={true|false}、 disk={true|false}、 dumponexit={true|false}、 dumponexitpath=path、 globalbuffersize=size loglevel={quiet|error|warning|info|debug|trace} maxage=time maxchunksize=size maxsize=size repository=path samplethreads={true|false} settings=path stackdepth=depth threadbuffersize=size } defaultrecording: 指定是否在后台一只记录还是只运行一段时间,默认这个参数的值是false。如果要一直开启,请设置为true。 disk:是否JRE持续的把记录写到硬盘中,默认false,如果想要持续记录,需要设置为true。 dumponexit:是否在JVM终止的时候记录JFE的数据 dumponexitpath:JVM终止是记录JFE的数据的路径,如果指定的是一个目录 JVM会自动创建一个文件(文件名一般是以当前时间生成),若是文件名,如果这个文件名已经存在了,通常会加一个时间后缀来区分。这个参数如果不生效,上一个参数的选项也是不成立的 globalbuffersize=size:指定保留数据的总大小。 loglevel:JFE日志的日志级别,默认 Info maxage:设置数据对大的保留时间 maxchunksize=size:设置数据最大块的大小 maxsize=size:设置数据在硬盘的最大容量,默认容量没有限制,前提:仅当disk=true时,此选项可用。 respository=path:设置临时仓库,默认使用系统的临时路径 samplethreads:设置是否进行线程抽样,默认为true setting=path:设置事件配置文件,默认是使用JAVA_HOME/jre/lib/default.jfc stackdepth=depth:设置对应栈追踪的深度,默认深度为64 threadbuffersize=size:指定每个线程的本地缓冲的大小,默认大小为5k
邹志全
2020-02-25
895
0
JVM Non-Standard Options
打包
java
jvm
准备对每一个参数进行详细的介绍,并且给出一些我所了解到的小技巧。 懂原理才能更好的使用嘛,推荐大家先把Java 使用熟练,然后好好看看JVM 原理相关的东西,最后再根据原理&使用 对于JVM进行更高效的利用。 下面开始介绍。 非标准参数(Non-Standard): -XBatch 虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用-XBatch参数时,会关闭虚拟机后台编译,在前台编译完成后再执行。 -Xbootclasspath:path -Xbootclasspath/a:path -Xbootclasspath/p:path 上面三个参数其实是一个参数。什么作用呢,挺简单的。就是改变虚拟机装载jar的方式,原本虚拟机是缺省系统运行包rt.jar,指定之后按照classpath中设定的搜索路径中装载系统运行类,除非我们需要写一个运行时,否则不会用到该参数。 其中存在 /a,/p 两个选项: /a:在缺省搜索路径后架上 -Xcheck:jni 是否调用JNI函数进行附加的检查,特别地虚拟机将校验传递给JNI函数参数的合法性,在本地代码中遇到非法数据时,虚拟机将会报一个致命错误然后终止。使用该参数会造成性能下降不少。谨慎使用~ -Xcomp、-Xmixed、-Xint 这三个参数放在一块儿说吧,作用很简单就是用来指定Java bytecode的运行方式。 其中-Xint全部使用字节码解释执行,这个是最慢的,慢的惊人,通常要比其他方式慢一个数量级左右。 -Xcomp相反,全部被编译成机器码执行,速度是很快的,但是存在一个缺陷,-Xcomp的策略过于简单,无法使用JIT的全部特性。比如 JIT会对在运行时对每个方法做统计,然后会有一些比如分支预测之类的自优化策略,但是使用-Xcomp时这个特性就无法生效了。还存在这样的一种情况,有些方法的调用比较少,但是也去做编译和优化的话,编译带来的开销还不如直接去解释执行那一块的代码,这样就产生一些不必要的开销了。这两种方式分场景来进行使用,针对合适的场景选择对应的模式。适合的才是最好的。还有一个参数,就是一种自适应的方式,有的地方解释执行,有的地方编译执行,具体的策略要依据profile的统计分析来判断。 注:中间提到了一个JIT,可能有的同学对这个不是非常熟悉。JIT 的全称是Just in time,也就是 “即时” ,这是一种即时编译技术,能够通过保存之前编译得到的机器码来替代对应字节码的解释执行操作及一些分支预测等自优化功能来加快Java 程序的执行速度。具体是怎么做到的呢。请看 Java 系列中的JIT技术。 -Xdebug 这个选项,其实什么也没做。仅仅是为了向后兼容而已。 -Xdiag 显示额外的诊断信息,如果出现问题你又觉着信息不够全面时。 -Xfuture 对类文件进行严格格式的检查,以保证类代码符合类代码规范。如果为缺省则不进行严格格式检查。 -Xinternalversion 显示比版本选项更详细的JVM版本信息,然后退出。 这个常用于 -version之后,看到的信息不够充分,你就可以使用它了,使用场景比较少 -Xloggc:filename 用于指定虚拟机每次垃圾回收时将回收的信息写到日志文件中,文件名由filename 指定 -Xmaxjitcodesize=size 为jit编译的代码指定最大代码缓存大小缺省单位为字节,也可以是k、m。默认的最大代码缓存大小为240 MB;如果使用选项- xx:- tiered编译禁用分层编译,那么默认大小是48 MB: -Xmaxjitcodesize = 240 这个选项相当于- xx:ReservedCodeCacheSize(下一篇会有具体的介绍)。 -Xmnsize 用于设置堆内新生代的大小,缺省单位为字节,也可以是k、m,后面有对应最大的虚拟机内存堆的最大可用大小,减去-Xmn就是老年代的大小。 -Xmssize 设置虚拟机内存堆的初始大小,缺省单位为字节(值必须为1024的整数倍,然后大于2m),当然也可以自行指定单位,比如说 k、m。缺省时,默认大小为2m。 -Xmxsize 设置虚拟机内存堆的最大可用大小,缺省单位为字节(值必须为1024的整数倍,然后大于2m),当然也可以自行指定单位,比如说 k、m。缺省时 默认最大为64m。 最常见的,如果我们运行的程序体量很庞大,64m已经远不够使用时,启动一段时间后可能会出现OOM,这时候就需要手动的去设置可用的堆内存的大小了。 -Xnoclassgc 关闭虚拟机对Class的垃圾回收功能。 -Xprof 输出CPU运行时的诊断信息。 -Xrs 减少虚拟机中操作系统信号的使用,这种参数 通常用于以后台服务方式运行,最经典的比如Servlet -Xshare:
邹志全
2020-02-25
509
0
JVM 监控 1
jvm
gcc
java
服务监控是一个服务中非常重要的组成部分,直接决定了问题的发现及排查速度,并且从一定程度上提高服务一个周期内的可用性。在Java服务中,除了对于 业务、接口耗时&性能的监控之外还需要对Java 所依赖的JVM进行一定的监控策略。对于JVM的合理监控可以帮助我们更加全面的发现问题:比如说内部接口耗时忽然上升、oom频出这类问题,并且合理的JVM监控及分析策略,能够以此为依据进行服务所使用JVM的调优,从而提升稳定性及性能。
邹志全
2020-02-25
695
0
JVM 《七 JVM 角度看对象》
jvm
java
编程算法
作为一个Java 程序员,天天与我们交互的除了逻辑就是对象了,我们可以自己new一个,也可以注入一个,得到对象的方法儿有很多。
邹志全
2020-02-25
396
0
JVM《六 Class 文件的解析》
java
jvm
ide
打包
存储
上一篇说的是类加载机制,其中刚开始装载阶段是对二进制流进行装载或者解析对应的 .class 文件。
邹志全
2020-02-25
454
0
JVM 《五 JVM 类加载机制&Tomcat 类加载方式解析》
jvm
编程算法
java
tomcat
c++
所谓类加载机制也就是Java 虚拟机从磁盘装载 .class 文件或者网络中二进制字节流并且加载Java类的方式或者过程。
邹志全
2020-02-25
662
0
JVM 《一 JVM 中的垃圾回收》
jvm
java
编程算法
当我们了解其中的内存之后,我们可能会有一点想法,我们的对象、相关类信息是存放在Java堆、方法区之中的。那我们的程序正在不断的new 对象、不断的loading Class。那么我们的JVM为什么没炸了(OOM),即使数量不会多到炸,但是我们不用的那些对象难道一直要仍在内存中?
邹志全
2020-02-25
421
0
JVM《 零 JVM 相关简介&内存模型》
jvm
java
单片机
打包
编程算法
提起Java,我们首先想到的是Java 语言。其实Java 是包括Java 语言、Java虚拟机规范两部分的。Java 不赘述,要说的是JVM, 即 Java 虚拟机。
邹志全
2020-02-25
399
0
JVM JIT
jvm
打包
缓存
java
ide
JIT Just In Time,JVM中的一种即时编译技术,目的是为了提升程序的运行效率。
邹志全
2019-10-08
560
0
Spring AOP
aop
jdk
spring
jvm
java
Spring AOP 使用场景蛮多的属性检查、日志等,所有拦截下来可以在切面共同做的事儿似乎都可以用AOP(面向切面)的方式解决。在面试的过程中AOP 也是除Ioc及MVC 以外问的较多的一个点,通常是这样的: AOP 是什么?面向切面编程。 Spring AOP 是如何实现的? 配置下拦截器,完成具体的处理逻辑,其实本质就是一个动态代理。 那Spring 实现动态代理的方式有哪些?CGLib、JDK 原生 那这两种方式默认使用哪一种,如何指配?#&@¥&@¥&@#¥& 那JDK 原生方式与CGlib 区别说一下?&&#¥#¥ 提到了CGlib的实现是ASM,那ASM 具体的原理是怎样的?#&@¥&@¥&@#¥& 说一下ASM 几个核心的函数?#&@¥&@¥&@#¥& 说一下ASM 操作的过程中,JVM 里都发生了哪些事儿?#&@¥&@¥&*@#¥& 刚才说了这么多反射还有JVM 相关的,如果使用反射的方式向一个List<String> ,插入一个Integer,是正常还是Error,为什么? 好的,咱来谈谈泛型的擦除。所以会很容易被转移话题的。 其实AOP 相对于具体语言的实现细节,最主要的是它的实现思想。 先说一下思想: AOP 面向切面编程,算是对oop 面向对象编程的一种补充,指的在许多流程中都存在某些点需要做类似的事儿,可以将这个点设置为横切关注点(相对的业务处理的是核心关注点),完后完成对应事件的设定。 这种场景比如说权限检查、日志等。。 要理解整个AOP 过程还需要一点关键词: 横切关注点: 具体需要拦截的点,一种发现的过程 切面(aspect): 对横切关注点的一种抽象,一种抽象的过程 连接点(joinpoint):要被拦截到的具体点 切入点(pointcut):对于连接点进行,一种设置拦截定义的过程 通知(advice):具体就是指的拦截到具体的连接点之后的要执行的逻辑代码,分为:前置、后置、最终、环绕 这五类通知 目标对象:代理的目标对象 织入(weave):将切面应用到目标对象,并创建对应对象代理创建的过程 引入(introduction):动态代理运行的过程 然后是AOP 后续具体的使用细节及实现原理: 使用过程大体是这样的: 1、检查业务组件,查看是否存在大量可横切点 2、定义切入点 3、定义增强处理,就是切入点前后的具体通知 4、设置完成,实现对应AOP 操作 Spring 对AOP 的支持是建立在Ioc 的基础上的,也就是AOP 代理有Ioc 容器负责处理依赖关系,及其生成和管理。 那么Spring AOP 所依赖的Ioc 里面使用代理的方式是默认使用JDK 原生方式,也可以选配CGlib实现。 在使用层面上,JDK 要求实现接口,而CGlib 不用,可以基于类实现。 JDK 是根据接口实现一个具体的class 对象然后加载到具体的堆和方法区完成的实现。 CGlib 是依赖于ASM ,通过字节码操作根据现有的类,通过添加字节码的方式构建一个新的对应类的子类来完成对应的实现。 就当前阶段来说两者在小规模调用差异基本是不大的,当前hibernate 用的就是ASM 方式实现的懒加载。
邹志全
2019-10-08
435
0
高并发下的各种缓存
缓存
单片机
存储
jvm
Cache在大家最开始接触开发的时候应该就听过许多了,比如浏览器缓存、OS中的缓存、什么缓存一致性等等,各式各样的Cache,看起来各种高大上的样子,看着群里或者某乎的大佬们在不断的讨论或者推缓存相关的blog。 近期对于缓存相关研究了不少,自己也在试着写一个Cache中间件来研究下。过程中整理了一下,准备做成一个系列文章发一下,也希望大家给我多多指正。 在正式开始开始写缓存之前,当然是先研究领域内现有的一些Cache 相关的内容,作为一个引言。 后续分别从OS 中的缓存、JVM中的缓存、Web 应用中常见缓存、现有常作为独立缓存的Redis/MemCache、InnoDB中的存储引擎、浏览器中的缓存、分布式缓存的实现案例 进行对应的浅析及相应Cache设计主题的引入。下面先大体的介绍一下各个场景及实现方式,后续会独立推送对应的浅析文章。
邹志全
2019-07-31
384
0
Go 内存管理 -- 内存分配 一
go
编程算法
缓存
jvm
压力测试
go作为一个比较新晚(新)的语言,自然借鉴前辈们的优点,比如说语言本身负责内存管理、对协程和高并发的高优支持、简单高效的语法等。本篇及后续的几篇要讲的就是还没提到的比较复杂的内存管理。 学习内存管理(分配&回收)前,如果有JVM的内存管理的基础,会变得非常简单,如果是第一次接触内存管理,在看完Go的内存管理后可以去看看JVM的,对比着学习比较容易理解。 go的内存管理思路是基于google 的tcmalloc(thread-caching-malloc)实现的,常见的内存分配器还有ptmalloc、jemalloc,但是tcmalloc的性能更高,尤其是高并发场景下。
邹志全
2019-07-31
1.3K
0
高并发下如何合理使用锁
jvm
java
在并发环境下想要共享变量,一旦涉及修改操作,就需要用到锁了。 Java 中的锁有这么几种:synchronized、reentrant lock、还有reentrant lock 衍生出的其他锁比如ReadWriteReentrantLock
邹志全
2019-07-31
624
0
Kafka “高吞吐” 之顺序访问与零拷贝
kafka
jvm
java
缓存
批量计算
上一篇所说的micr-batch 其实主要是针对producer 来实现的,Kafka整体吞吐量高可不只是依赖于micr-batch这一点,还有broker端及consumer端。
邹志全
2019-07-31
1.3K
0
Java Concurrent volatile
ide
jvm
java
编程算法
volatile 是一个Java 中的关键字,一个提供基础同步属性的关键字。针对JVM重排序在并发场景下的问题,被vlolatile修饰的关键词,编译器不会将该变量的操作与其他内存操作进行重排序。
邹志全
2019-07-31
372
0
Java Concurrent 背景&基础概念&操作系统
java
编程算法
jvm
存储
并发可能在许多刚接触编程的程序员眼中显得高大上或者多余,因为刚接触编程时不是很理解 并发的背景、意义,并且并发编程通常相对于串行执行的程序要复杂一些。
邹志全
2019-07-31
376
0
没有更多了
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
立即发文
Python精品学习库
代码在线跑,知识轻松学
立即查看
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
立即体验
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
立即查看
领券
问题归档
专栏文章
快讯文章归档
关键词归档
开发者手册归档
开发者手册 Section 归档