我试图理解为什么Java的ArrayDeque优于Java的LinkedList,因为它们都实现了Deque接口.
我几乎没有看到有人在他们的代码中使用ArrayDeque.如果有人对ArrayDeque的实现方式有了更多了解,那将会很有帮助.
如果我明白了,我会更有信心使用它.我无法清楚地了解JDK实现它管理头尾引用的方式.
这是我一直试图追踪几个月的问题.我有一个运行java应用程序来处理xml提要并将结果存储在数据库中.存在非常难以追踪的间歇性资源问题.
背景: 在生产盒(问题最明显的地方),我没有特别好的访问框,并且无法运行Jprofiler.那个盒子是64位四核,8GB机器运行centos 5.2,tomcat6和java 1.6.0.11.它从这些java-opts开始
JAVA_OPTS="-server -Xmx5g -Xms4g -Xss256k -XX:MaxPermSize=256m -XX:+PrintGCDetails -
XX:+PrintGCTimeStamps -XX:+UseConcMarkSweepGC -XX:+PrintTenuringDistribution -XX:+UseParNewGC"
Run Code Online (Sandbox Code Playgroud)
技术堆栈如下:
我能解决的最接近问题的是32位机器,内存要求较低.我确实有控制权.我已经使用JProfiler探测它并修复了许多性能问题(同步问题,预编译/缓存xpath查询,减少了线程池,删除了不必要的hibernate预取,以及在处理过程中过度热心的"缓存变暖").
在每种情况下,分析器都会将这些资源显示为由于某种原因而占用大量资源,并且一旦发生变化,这些资源就不再是主要资源.
问题: JVM似乎完全忽略了内存使用设置,填满了所有内存并且没有响应.对于面向客户的人来说,这是一个问题,他们期望定期投票(5分钟和1分钟重试),以及我们的运营团队,他们经常被告知箱子已经无响应并且必须重新启动它.这个盒子上没有其他重要的东西.
问题似乎是垃圾收集.我们正在使用ConcurrentMarkSweep(如上所述)收集器,因为原始STW收集器导致JDBC超时并变得越来越慢.日志显示,随着内存使用量的增加,这开始引发cms失败,并回到最初的世界收藏家,然后似乎没有正确收集.
然而,运行jprofiler,"运行GC"按钮似乎很好地清理内存而不是显示增加的占用空间,但由于我无法将jprofiler直接连接到生产盒,并且解决已证实的热点似乎无法正常工作我是留下了调整垃圾收集盲人的伏都教.
我尝试过的:
不幸的是,问题也偶尔会出现,它似乎是不可预测的,它可以运行几天甚至一周而没有任何问题,或者它可以在一天内失败40次,而且我唯一可以看到的是一致的是垃圾收集正在起作用.
任何人都可以提出以下建议:
a)为什么JVM在配置为最大值小于6时使用8个物理演出和2 gb交换空间
.b)对GC调整的引用实际上解释或给出了合理的示例什么样的设置使用高级集合.
c)对最常见的java内存泄漏的引用(我理解无人认领的引用,但我的意思是在库/框架级别,或者在数据结构中更像inherenet,比如hashmaps).
感谢您提供的任何和所有见解.
编辑
Emil H:
1)是的,我的开发集群是生产数据的镜像,直到媒体服务器.主要的区别是32/64bit和可用的RAM量,我无法轻易复制,但代码和查询和设置是相同的.
2)有一些遗留代码依赖于JaxB,但在重新排序作业以试图避免调度冲突时,我通常会删除执行,因为它每天运行一次.主解析器使用调用java.xml.xpath包的XPath查询.这是一些热点的来源,其中一个查询没有被预编译,两个对它们的引用都是硬编码的字符串.我创建了一个线程安全缓存(hashmap),并将对xpath查询的引用考虑为最终的静态字符串,从而显着降低了资源消耗.查询仍然是处理的很大一部分,但应该是因为这是应用程序的主要责任.
3)另外一个注释,另一个主要消费者是来自JAI的图像操作(从饲料中重新处理图像).我不熟悉java的图形库,但从我发现它们并没有特别漏洞.
(感谢目前为止的答案,伙计们!)
更新:
我能够使用VisualVM连接到生产实例,但它已禁用GC可视化/运行GC选项(尽管我可以在本地查看).有趣的是:VM的堆分配服从JAVA_OPTS,并且实际分配的堆正好坐在1-1.5 gigs,并且似乎没有泄漏,但是盒级监控仍显示泄漏模式,但它是没有反映在VM监控中.这个盒子上没有别的东西在跑,所以我很难过.
最近我读到了MDC中的JavaScript调用用法
https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call
如下所示的一个例子,我仍然不明白.
他们为什么在这里使用继承呢?
Prod_dept.prototype = new Product();
Run Code Online (Sandbox Code Playgroud)
这有必要吗?因为有一个超级构造函数的调用
Prod_dept()
Run Code Online (Sandbox Code Playgroud)
无论如何,像这样
Product.call
Run Code Online (Sandbox Code Playgroud)
这只是出于常见的行为吗?何时使用超级构造函数调用或使用原型链更好?
function Product(name, value){
this.name = name;
if(value >= 1000)
this.value = 999;
else
this.value = value;
}
function Prod_dept(name, value, dept){
this.dept = dept;
Product.call(this, name, value);
}
Prod_dept.prototype = new Product();
// since 5 is less than 1000, value is set
cheese = new Prod_dept("feta", 5, "food");
// since 5000 is above 1000, value will be 999
car = new Prod_dept("honda", 5000, "auto");
Run Code Online (Sandbox Code Playgroud)
谢谢你让事情更清楚
我已经看到了在Java中定义静态数组的不同方法.或者:
String[] suit = new String[] {
"spades",
"hearts",
"diamonds",
"clubs"
};
Run Code Online (Sandbox Code Playgroud)
......或仅
String[] suit = {
"spades",
"hearts",
"diamonds",
"clubs"
};
Run Code Online (Sandbox Code Playgroud)
或者作为一个 List
List suit = Arrays.asList(
"spades",
"hearts",
"diamonds",
"clubs"
);
Run Code Online (Sandbox Code Playgroud)
是否存在差异(当然,列表定义除外)?
什么是更好的方式(表现明智)?
我经常发现自己将配置值传递给访问它们的函数,如下所示:
var arg1 = 'test1';
if(isUndefined(config.args.arg1)){
arg1 = config.args.arg1;
}
var arg2 = 'param2';
if(isUndefined(config.args.arg2)){
arg2 = config.args.arg2;
}
var arg3 = '123';
if(isUndefined(config.args.arg3)){
arg3 = config.args.arg3;
}
Run Code Online (Sandbox Code Playgroud)
之后我会像这样使用它们:
var url = '<some-url>?id='+arg1+'&='+arg2 +'=' + arg3;
Run Code Online (Sandbox Code Playgroud)
jQuery/ExtJS或任何其他框架是否提供了一种以简单的方式访问这样的变量的解决方案,并为变量赋予默认值?
就像是:
getValueOfObject(config,'args.arg3','<default>');
Run Code Online (Sandbox Code Playgroud)
或者可能有一个标准的解决方案.
注意:
我也在考虑你有默认值的常见模式
var defaults = {
args: {
args1: ....
}
...
}
Run Code Online (Sandbox Code Playgroud)
并做一个对象合并.
然后将对象编码为param String.但正如您所看到的,对象值有时也包含参数名称.
我有一个运行SSIS包的SQL服务器作业.此作业有9个步骤,每个步骤都从不同的数据库中提取数据.连接字符串在每个步骤中定义为参数.
我在运行作业时遇到以下错误.
Executed as user: USER\MYSERVER$. Microsoft (R) SQL Server Execute Package Utility Version 10.50.1600.1 for 64-bit Copyright (C) Microsoft Corporation 2010. All rights reserved.
Started: 5:50:55 PM Error: 2013-06-21 17:50:55.44
Code: 0xC0016016
Source:
Description: Failed to decrypt protected XML node "DTS:Password" with error 0x8009000B "Key not valid for use in specified state.". You may not be authorized to access this information. This error occurs when there is a cryptographic error. Verify that the correct key is available. End Error …Run Code Online (Sandbox Code Playgroud) 当我在Vim中编辑文件时,我会显示一些带有一堆Â的行.
我已经检查了编码
:set encoding
Run Code Online (Sandbox Code Playgroud)
它说utf8
encoding=utf8
Run Code Online (Sandbox Code Playgroud)
有谁知道这是从哪里来的以及如何阻止这种行为?
问候,
杰里米
我正在尝试使用DecimalFormat.format()方法格式化BigDecimal值.
我的问题是,我不知道如何设置DecimalFormats DecimalFormatSymbol来格式化文本而不使用任何分组分隔符.
我想知道如何设置分组符号并使用格式方法.我知道如何通过使用替换或其他方法来做到这一点,但它不是我想要的.
所以我需要知道如何将空字符设置为分组运算符.
例:
DecimalFormat dec = new DecimalFormat();
DecimalFormatSymbols decFS = new DecimalFormatSymbols();
decFS.setGroupingSeparator( '\0' );
dec.setDecimalFormatSymbols( decFS );
BigDecimal number = new BigDecimal(1000);
String result = dec.format(number);
Run Code Online (Sandbox Code Playgroud)
我希望得到"1000"作为字符串,没有其他字符.请帮忙
注意(对帖子做出反应):我想仅仅编号,而不需要分组.
在保存hibernate对象时,hibernate中是否有设置忽略属性的空值?
注意
在我的情况下,我通过Jackson将JSON反序列化为Hibernate Pojo.
JSON只包含Pojo的一些字段.如果我保存Pojo,那么不在JSON中的字段在Pojo中为空,而hibernate则更新它们.
我来到了这个环境updateable=false,但这不是100%的解决方案.
http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-property
也许有人有另一个想法......
笔记2:
根据Hibernate Docs,dynamicUpdate 注释正是如此
dynamicInsert/dynamicUpdate(默认为false):
指定应在运行时生成INSERT/UPDATE SQL,并且仅包含值不为null的列.
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#mapping-declaration-class
有趣的是,如果您通过dynamic-update文档在XML中定义它,请不要提及NULL值的hanlding.
dynamic-update(可选 - 默认为false):
指定应在运行时生成UPDATE SQL,并且只能包含值已更改的列.
由于我同时使用注释和 xml配置,hibernate似乎忽略了我的dynamicUpdate=true注释.
我需要将大型数据集加载到生产数据库中.
每个文件需要上传15个文件并插入表格中.每个约500 Mb.
我有两个需要索引的ID列.如果我加载了包含索引的文件,则上传大约需要3个小时.如果我删除索引,加载数据本地infile,然后重新添加索引,整个操作大约需要30分钟.
问题是,数据库响应能力在索引新导入的数据时受到重创.有没有办法让索引运行在"低优先级",以便其他查询仍然可以获得95-100%的速度和背景中的索引类型的突变?
我正在使用Amazon RDS,所以我没有选择只在另一台服务器上加载然后复制表文件.
为此添加赏金,因为我仍然想看看是否有办法在特定框上编制索引时获得良好的性能.
java ×4
javascript ×2
arraydeque ×1
arrays ×1
call ×1
chaining ×1
character ×1
deque ×1
encoding ×1
hibernate ×1
indexing ×1
inheritance ×1
linked-list ×1
memory-leaks ×1
mysql ×1
null ×1
object ×1
profiling ×1
putty ×1
static ×1
throttling ×1
vim ×1