这些命令在JDK安装目录的bin目录下:
jps(JVM Process Status)命令类似UNIX的ps命令、
jps:显示虚拟机执行主类名称以及这些进程的本地虚拟机唯一ID。
jps -q:只输出进程的本地虚拟机唯一ID.
jps -l:输出主类的全名,如果进程执行的是jar包,输出jar路径。
jps -v:输出虚拟机进程启动时JVM参数。
jps -m:输出传递给java进程main()函数的参数
jstat是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程(需要远程主机提供RMI支持)虚拟机进程中的类信息,内存,垃圾收集,JIT编译等运行数据。在没有GUI,只提供了纯文本控制台环境的服务器上,它将是运行期间定位虚拟机性能问题的首选工具。
jstat命令使用格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
比如如下命令:jstat -gc -h3 17188 1000 10
表示分析进程id为 17188的gc情况,每1000ms打印一次记录,打印10次停止。每三行打印指标头部。
效果如下:

当然了实例中的-gc也可以换成别的,常见的option如下:

上述命令加上-t 参数可以在输出信息上看到Timestamp列,显示程序运行时间。
jinfo vmid : 输出当前jvm进程的全部参数和系统属性(第一部分是系统的属性,第二把部分是jvm的参数)。
jinfo -flag name vmid:输出对应名称的参数的具体值。比如输出MaxHeapSize,查看这个当前jvm进程是否开始打印GC日志等。

使用jinfo可以在不重启虚拟机的情况下,动态修改jvm参数。尤其是线上的环境特别有用。
使用jinfo -flag +/- name vmid 可以开启或者关闭对应名称的参数。之前我们看到是开启了gc打印的,现在关闭一下:

jmap命令用于生成堆转储快照。如果不使用jmap命令,想要获取java堆转储,可以使用“-XX:+HeapDumpOnOutOfMemoryError” 参数。可以让虚拟机在OOM异常出现之后自动生成dump文件,linux命令下可以通过kill -3发送进程退出信号也能拿到dump文件。
jmap的作用不仅仅是为了获取dump文件,他还可以查询finalizer执行队列,java堆和永久代的详细信息,如空间使用率,当前使用的是哪种收集器等。和jinfo一样,jmap有不少功能在windows平台下也是受限制的。
jhat用于分析heapdump文件,它会建立一个HTTP/HTML服务器,让用户可以在浏览器上查看分析结果。
jstack命令用于生成虚拟机当前时刻的线程快照,线程快照就是当前虚拟机每一条线程正在执行的方法堆栈的集合。
生成线程快照的目的主要是定位线程长时间出现停顿的原因,如线程间死锁,死循环,请求外部资源导致的长时间等待等。都是导致线程长时间停顿的原因。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈。就可以知道没有响应的线程到底在后台做了些什么事,或者在等待什么资源。
下面是死锁的demo:
public class Test {
private static Object resource1 = new Object();//资源 1
private static Object resource2 = new Object();//资源 2
public static void main(String[] args){
new Thread(() -> {
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource2");
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
}
}
}, "线程 1").start();
new Thread(() -> {
synchronized (resource2) {
System.out.println(Thread.currentThread() + "get resource2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "waiting get resource1");
synchronized (resource1) {
System.out.println(Thread.currentThread() + "get resource1");
}
}
}, "线程 2").start();
}
}
我们启动这个main方法后去控制台查看(先用jps查看了死锁的这个线程是18532):

因为这个结果比较长,所以截图截了最关键的部分。可以看到jstack已经帮我们定位到了死锁。
JConsole是基于jmx的可视化监视,管理工具。可以很方便的监视本地以及远程服务器的java进程的内存使用情况。你可以在控制台输出console命令启动或者在JDK目录的bin目录找到jconsole.exe双击启动。

选择一个线程链接后就可以看到可视化页面:

JConsole可以显示当前内存的详细信息。不仅包括堆内存/非堆内存的整体信息。还可以细化到Eden区,Survivor区等的使用情况,如下图所示:

点击右边的执行GC 按钮可以强制应用程序执行一个full GC。
类似我们前面讲的jstack命令,不过这个是可视化的。
最下面有一个检测死锁的按钮,点击这个按钮可以自动为你找到发生死锁的线程和详细信息。

VisualVM 提供在java虚拟机上运行的java应用程序的详细信息。在VisualVM的图形用户界面中,可以方便,快捷的查看多个java应用程序的相关信息。
Visual VM 官网:https://visualvm.github.io/ 。Visual VM 中文文档:https://visualvm.github.io/documentation.html。
VisualVM是到目前为止随着JDK发布的功能最强大的运行监视和故障处理程序。官方在VisualVM的软件说明上写了all in one的描述。预示着他除了运行监视,故障处理外,还提供了很多其他方面的功能,如性能分析。VisualVM的性能分析功能甚至比起JProfiler,YourKit等专业且收费的工具都不会逊色。而且VisualVM还有一个很大的优点:不需要被监视的程序特殊 运行,因此他对于应用程序的实际性能的影响很小。使得他可以直接应用在生产环境中。这个优点是JProfiler,YourKit等工具无法媲美的。
VisualVM基于NetBeans平台开发,因此一开始就具备了插件扩展功能的特性。通过插件扩展支持,VisualVM可以做到:
这里就不介绍VisualVM了,想了解的自己去看官网。
本篇笔记就记到这里,如果稍微帮到你了记得点个喜欢点个关注,也祝大家工作顺顺利利,每天都有所进步!
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby-vips的github页面上的链接,我们将不胜感激!如果有ruby-
我有一个super简单的脚本,它几乎包含了FayeWebSocketGitHub页面上用于处理关闭连接的内容:ws=Faye::WebSocket::Client.new(url,nil,:headers=>headers)ws.on:opendo|event|p[:open]#sendpingcommand#sendtestcommand#ws.send({command:'test'}.to_json)endws.on:messagedo|event|#hereistheentrypointfordatacomingfromtheserver.pJSON.parse(event.d
我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。
我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我最近开始学习Ruby,这是我的第一门编程语言。我对语法感到满意,并且我已经完成了许多只教授相同基础知识的教程。我已经写了一些小程序(包括我自己的数组排序方法,在有人告诉我谷歌“冒泡排序”之前我认为它非常聪明),但我觉得我需要尝试更大更难的东西来理解更多关于Ruby.关于如何执行此操作的任何想法?
当profile为nil时,总是让我感到悲伤...我该怎么办? 最佳答案 在View中使用变量之前,始终检查变量是否为nil。我确信这个问题有更优雅的解决方案,但这应该能让您入门。 关于ruby-on-rails-Rails处理.Erb与Nils,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2709605/
目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式
我有一个应用程序专门使用Facebook作为身份验证提供程序,并正确设置了生产模式的回调。为了让它工作,您需要为您的Facebook应用程序提供一个站点URL和一个用于回调的站点域,在我的例子中是http://appname.heroku.com和appname。heroku.com分别。问题是我的Controller设置为只允许经过身份验证的session,所以我无法在开发模式下查看我的应用程序,因为Facebook应用程序的域显然没有设置为本地主机。如何在不更改Facebook设置的情况下解决这个问题? 最佳答案 创建另一个域l
在python中,我们可以使用多处理模块。如果Perl和Ruby中有类似的库,你会教它吗?如果您能附上一个简短的示例,我将不胜感激。 最佳答案 ruby:WorkingwithmultipleprocessesinRubyConcurrencyisaMythinRubyPerl:HarnessingthepowerofmulticoreWhyPerlIsaGreatLanguageforConcurrentProgramming此外,Perl的线程是native操作系统线程,因此您可以使用它们来利用多核。