我已经在开发盒上运行CF10,Windows 7,64位.每隔一分钟左右,CF10的CPU使用率将在大约20秒内上升到100%并再次下降.这很规律.
我发现很难诊断出这个问题.我已经看到了关于客户端变量清除,日志记录,监控和各种方式的讨论 - 但我已经把这些全部转为无济于事.
使用VisualVM,我设法将问题跟踪到"调度程序"线程.我有5个处于等待状态.每个都会定期运行,从而大大提高CPU的性能.采取线程转储,似乎所有这些线程都在调用java.io.WinNTFileSystem.getBooleanAttributes- 我已经看过几次提到的可能存在问题.
更新:最近我一直在onSessionEnd上玩另一个应用程序,并发现scheduler-x线程似乎是ColdFusion的内部 - 我的onSessionEnd任务似乎总是在其中一个线程中运行.
查看temp文件夹,我可以看到已经创建了许多EH Cache文件夹,我认为这些文件夹与查询缓存有关.我运行的应用程序相当广泛地使用它.我认为清除临时文件夹可能会提高性能,但它没有任何效果.
值得注意的是,如果我在没有实际调用任何应用程序的情况下启动CF服务,则不会出现问题.这可能表明问题出在应用程序本身,但它们不会在生产中造成任何问题 - 仅限于此框.也没有设置任何计划任务.
下面是导致高CPU的一个线程的示例.我很感激任何帮助来诊断这个线程正在做什么和为什么,以及如何可能阻止它使用这么多资源.
"scheduler-2" - Thread t@84
java.lang.Thread.State: RUNNABLE
at java.io.WinNTFileSystem.getBooleanAttributes(Native Method)
at java.io.File.isDirectory(File.java:849)
at coldfusion.watch.Watcher.accept(Watcher.java:352)
at java.io.File.listFiles(File.java:1252)
at coldfusion.watch.Watcher.getFiles(Watcher.java:386)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.getFiles(Watcher.java:397)
at coldfusion.watch.Watcher.checkWatchedDirectories(Watcher.java:166)
at coldfusion.watch.Watcher.run(Watcher.java:216)
at coldfusion.scheduling.ThreadPool.run(ThreadPool.java:211)
at coldfusion.scheduling.WorkerThread.run(WorkerThread.java:71)
Run Code Online (Sandbox Code Playgroud)
我的环境:
问题出现在多个版本的JVM上 - 此版本目前用于使监控可用.
我的java设置:
最大堆大小:1024mb
-server -XX:MaxPermSize参数=512米-XX:+ UseParallelGC -Xbatch -Dcoldfusion.home …
我一直在探索构建我的ColdFusion应用程序的不同方法,并且我正在寻找关于提供应用程序范围UDF的最佳方法的一些意见.
对于我的每个应用程序,我通常使用一些并不真正属于任何特定对象的额外函数.主要是数据操作.我希望这些功能在我的应用程序中可用,既可用于CFM模板,也可用于应用程序实例化的CFC.
我看到它的方式有各种方法来实现这一点,但它们都有自己的局限性:
在应用程序范围中实例化基本Utils CFC.这是我经常使用的方法.所有的功能都可以在应用程序范围内使用,但如果我从多个应用程序实例化相同的CFC,那么它们每个都有自己的应用程序范围 - 这意味着每个都必须实例化自己的基础Utils CFC.这没有什么不对,但感觉我没有足够好地封装CFC.我并不热衷于从CFC中引用应用程序范围.
创建一个基础Utils CFC并使其他所有CFC扩展它.这样可以正常工作,这意味着CFC可以直接从CFC的THIS范围引用Utils功能 - 但这意味着Utils功能保存在每个CFC的内存中.它在概念上也不合适,因为我的其他CFC与Utils CFC没有任何关系.
将我的基础Utils CFC注入我的其他CFC.我一直在玩的另一种方法是在Application范围中实例化我的基础Utils CFC,然后将其作为对象传递给我的其他CFC中的参数.这在概念上和我的封装中都适用.与我在init方法中设置数据源的方式相同,我可以对UDF执行相同的操作.这与UDF包含在每个CFC中的问题相同.当我转储所有的CFC时,我多次得到每个UDF - 但是当我传递一个实例化的对象时,我假设它没有占用任何额外的内存空间.如果有人能证实这一点,那会很有帮助 - 我只是假设!我对这种方法唯一真正的问题是它似乎有点复杂.
让我的应用程序CFC扩展我的Utils CFC.这就是许多框架似乎要做的事情.我没有使用过这种方法,但我确信它有利有弊.
CF直接在Application.cfc中从单独的模板中包含我的UDF这在功能上类似于在Application范围中实例化.
将我的UDF添加到服务器中Components.cfc
这是一个理论上的好主意 - 我可以维护基本Utils的一个副本,并确保服务器上的所有内容都可以访问它们 - 但是,如果我想在多个服务器上运行应用程序,那么它们都将全部需要那些功能.此外,对服务器的任何更新都可能会覆盖组件.它只是感觉像黑客核心 - 我敢肯定我们可以从苦涩的经历中得到所有,这很糟糕.
所以 - 我的问题是:以优雅和可重用的方式扩展CF与UDF的最佳实践是什么?以上任何选项或我没想过的东西?
我一直在诊断生成包含大约50,000行的CSV的性能问题,并且我将其缩小为每行使用一次的单个函数.
经过大量的讨论之后,我发现使用该函数会产生开销,而不是直接将逻辑放在循环中 - 我的问题是:为什么?!
有问题的函数非常简单,它接受一个字符串参数并将其传递给包含大约15个选项的switch/case块 - 返回结果字符串.我已经把一堆定时器放到了这个地方,发现这个函数调用需要花费很多时间(不是全部)才能运行0到200毫秒......但是如果我把完全相同的代码内联,它就坐每次迭代时为0.
所有这些都指向了我对对象实例化的理解中的一个基本问题,我很欣赏一些澄清.
我一直认为,如果我在页面顶部实例化一个组件,或者实际上如果我在一个持久范围内实例化它,如应用程序或会话,那么它将被放入内存并随后调用该组件中的函数将快闪电 然而,似乎调用这些函数有一个开销,而我们只谈了几毫秒,当你必须这样做50,000次时,它会很快加起来.
此外,似乎这样做会消耗资源.我对JVM使用内存的方式并不是特别精通,我已经阅读了它并使用了设置等等,但这是一个压倒性的主题 - 特别是对于那些没有Java开发经验的人.似乎在通过内联代码调用方法时,有时ColdFusion服务只会崩溃而请求永远不会结束.其他时候它确实完成了,虽然方式太慢了.这表明只有当服务器具有处理它的资源时才能完成请求 - 因此方法调用本身正在消耗内存......(?)
如果确实调用方法有附加费用,那么我就有一个大问题.将所有这些代码内联移动并不是真的可行(虽然有问题的函数很简单,但我还需要使用其他许多函数)并且这样做违背了我认为的开发人员的一切!
所以,任何帮助将不胜感激.
为了清楚起见,因为我确信有人会要求它,这里是有问题的代码:
编辑:正如所建议的,我已经将代码更改为使用结构查找而不是CFSwitch - 下面是修改后的代码供参考,但是底部的pastebin链接中还有一个测试应用程序.
在init方法中:
<cfset Variables.VehicleCategories = {
'T1' : 'Beetle'
, 'T1C' : 'Beetle Cabrio'
, 'T2' : 'Type 2 Split'
, 'T2B' : 'Type 2 Bay'
, 'T25' : 'Type 25'
, 'Ghia' : 'Karmann Ghia'
, 'T3' : 'Type 3'
, 'G1' : 'MK1 Golf'
, 'G1C' : 'MK1 Golf Cabriolet'
, 'CADDY' : 'MK1 Caddy'
, 'G2' …Run Code Online (Sandbox Code Playgroud) 我正在开发一个在URL的文件夹名称中使用UTF-8字符的系统.导航到这些URL没有问题,一切都按预期工作 - 除非在网站上发布重定向到另一个页面; 因此浏览器似乎编码扩展字符.
举个例子,我试图重定向到以下相对URL:
/geschäft/käfer/
Run Code Online (Sandbox Code Playgroud)
如果我直接在地址栏中访问该URL,则没有问题.但是,如果我更改位置标题以将浏览器重定向到此URL,则最终会:
/gesch%E4ft/k%E4fer/
Run Code Online (Sandbox Code Playgroud)
如果我查看原始页面的响应标题(它是301重定向到翻译的内容),我可以看到这个条目:
Location:/geschäft/käfer/
Run Code Online (Sandbox Code Playgroud)
似乎正确的细节在标题中结束,但浏览器的地址栏显示上面详述的%E4的编码值.我尝试了各种方法将URL输入到位置标题中,但所有方法都得到了相同的结果.
我在Chrome 37.0.2062.120 m和Firefox 32.0.2上看到了这种行为.
这是在一个开发盒上运行,Windows 7 Home with IIS7.5
编辑:
似乎这个问题可能与ColdFusion直接相关.如果我使用Javascript重定向到网址,这可行......但需要注意的是文件必须与BOM一起保存.如果我使用cflocation,或者如果我使用pagecontext手动插入标题,则无论是否存在BOM,问题都会持续存在.
我还注意到使用的类似问题,cfinclude除非使用BOM保存调用模板,否则这些扩展字符显示不正确.
像这里的许多其他类似问题一样,我正在编写我的第一个jQuery插件.它旨在获取一个select元素,并将选项替换为可单击的列表元素,以用作样本.我的主要功能运行良好,但我需要添加调用另一个方法的功能,这将禁用某些选项.我的问题是,当这样做时,我需要绑定一些点击元素并取消绑定其他元素.
目前我的原始绑定包含在我的'init'方法中的函数中.我需要能够从另一个'禁用'方法调用该函数.所以这里是一些代码:
(function($){
var methods = {
// Init method
init : function(options) {
// Set options
var
defaults = {
clickCallback: function(){} // Define empty function for click callback
}
, settings = $.extend({}, defaults, options)
// Function to bind options
function fnBindOptions(var1, var2, var3) {
// Stuff to bind elements
// Hit the click callback
settings.clickCallback.call(this);
}
return this.each(function() {
// Check that we're dealing with a select element
if(element.is('select')) {
// Loop through the select options and …Run Code Online (Sandbox Code Playgroud) 我是一个jQuery新手,所以答案可能很简单:
我有一个图像,我想用它做几件事.当用户点击"缩放"图标时,我正在运行"imagetool"插件(http://code.google.com/p/jquery-imagetool/)来加载更大版本的图片.该插件在图像周围创建一个新div,允许用户平移.
当用户点击替代图像时,我将删除旧图像并加载新图像.
问题出现在用户单击替代图像,然后单击缩放按钮时 - imagetool插件创建新div,但图像出现在...之后...
代码如下:
// Product Zoom (jQuery)
$(document).ready(function(){
$("#productZoom").click(function() {
// Set new image src
var imageSrc = $("#productZoom").attr("href");
$("#productImage").attr('src', imageSrc);
// Run the imagetool plugin on the image
$(function() {
$("#productImage").imagetool({
viewportWidth: 300,
viewportHeight: 300,
topX: 150,
topY: 150,
bottomX: 450,
bottomY: 450
});
});
return false;
});
});
// Alternative product photos (jQuery)
$(document).ready(function(){
$(".altPhoto").click(function() {
$('#productImageDiv div.viewport').remove();
$('#productImage').remove();
// Set new image src
var altImageSrc = $(this).attr("href");
$("#productZoom").attr('href', altImageSrc);
var img …Run Code Online (Sandbox Code Playgroud) 我有一个图库系统,可以生成不同大小的图像,并将它们缓存在webroot之外.然后,我在ColdFusion中有一个包装器模板,它根据ID和大小参数显示图像.例如,URL可能是'/dspImage.cfm?imageID=123&w=600'.这将返回123宽度为的图像编号的内容600px.
这一切都很完美,但是当尝试使用Colorbox jquery插件时,似乎无法显示以这种方式提供的图像,而是返回一大堆文本和控制字符,就好像无法识别JPG文件的mime类型一样.
浏览器显示图像没有问题,我已经使用这种技术近十年没有问题,但Colorbox似乎无法处理它.如果我直接链接到JPG,它在Colorbox中工作正常.
我有其他灯箱插件可以使用这种图像服务技术,但我喜欢colorbox而且我不愿意使用另一个灯箱,如果我可以帮助它.
有没有人有什么建议?
作为参考,从图像服务脚本发回的标头是:
Content-Length 178856
Content-Type image/jpeg;charset=UTF-8
Date Sun, 12 Aug 2012 15:07:54 GMT
Server Microsoft-IIS/7.5
X-Powered-By ASP.NET
Run Code Online (Sandbox Code Playgroud)
我注意到,当通过colorbox请求标头直接点击图像包含:
Accept image/png,image/*;q=0.8,*/*;q=0.5
Run Code Online (Sandbox Code Playgroud)
但是,如果我通过colourbox点击图像服务脚本,则会变为:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Run Code Online (Sandbox Code Playgroud)
我认为这可能表明问题,直到我通过浏览器直接尝试了服务脚本和图像,它也显示:
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Run Code Online (Sandbox Code Playgroud)
希望有足够的信息,对某人有意义!
实施增强型电子商务后,我发现Google Analytics中显示的一小部分网页没有 Google Analytics代码.
在检查源时,那些失败的页面上的代码与正确验证的页面上的代码之间没有区别.
我安装了GA Debug Google Chrome扩展程序,我可以看到在几个页面上有一个错误从ga("send", "pageview")呼叫中回来.
但是,我无法在任何文档或在线任何地方找到描述可能出现的错误的ga("send", "pageview")信息,也不会提供任何可能有助于诊断任何可能问题的信息.
重要的是,页面上没有javascript错误,我可以看到任何内容的唯一方法是使用GA Debug插件 - 有些人声称它并没有真正起作用!然而谷歌显示这个小部分页面的未知问题.
以下是其中一个页面上的代码示例:
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1 *new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-500228-1', 'auto');
ga('require', 'ec'); // Load the advanced ecommerce plug-in.
ga('require', 'displayfeatures'); // Load display advertising.
ga('set', '&cu', 'GBP'); // Set currency
// Add generated analytics elements from the request container
ga('ec:addImpression', {
'id': '021109021CB'
, 'name': 'Cam shaft, Type 4 Mechanical Std. (No Cam Wheel)'
, 'category': 'Bay Bus …Run Code Online (Sandbox Code Playgroud) 我不敢相信我以前从未注意到这一点,但似乎CFMail不会发送到未在目标邮件服务器上明确设置的电子邮件地址.
这意味着如果我使用'info@somedomainorother.com'并设置了捕获域中的所有电子邮件,CFMail将不会发送到'test@somedomainorother.com'.
这给我带来了大量问题,因为我正在使用CFMail发送订单确认,成员激活以及其他各种各样的点点滴滴.
无论您对使用捕获地址的看法如何,都不能否认人们使用它们因此,无论用户在我的某个网站中输入化妆地址,他们都不会收到他们的电子邮件.
必须,只需要解决这个问题 - 任何人都可以帮忙吗?
对于refernece,发送到catchall地址时日志中显示的消息是"Invalid Addresses".
编辑:这是我正在使用的CFMail语法 -
<cfmail to="#Arguments.sEmailAddress#" from="#Application.sAppEmailAddress#" subject="Stock reminder confirmation: #Local.qGetProductDetails.sProductName# - #Application.sCompanyName#" type="HTML" server="#Application.sAppEmailServer#" username="#Application.sAppEmailAddress#" password="#Application.sAppEmailPassword#">
Run Code Online (Sandbox Code Playgroud)
翻译成:
<cfmail to="thisisatest@somedomainorother.com" from="application@mydomainname.com" subject="Stock reminder confirmation: Some product - My Company" type="HTML" server="mail.mydomainname.com" username="application@mydomainname.com" password="XXXXXX">
Run Code Online (Sandbox Code Playgroud)
所有工作都适用于info@somedomainorother.com但不适用于randombunchofcharacters@somedomainorother.com.
当然要注意的是,在所有其他方面,catch-all工作正常,来自邮件客户端的测试电子邮件工作正常.
coldfusion ×6
javascript ×3
jquery ×3
jvm ×2
cfc ×1
cflocation ×1
cfmail ×1
cfml ×1
colorbox ×1
components ×1
cpu-usage ×1
header ×1
methods ×1
mime-types ×1
overhead ×1
performance ×1
railo ×1
redirect ×1
tomcat7 ×1
utf-8 ×1
zoom ×1